DBAtlas · Атлас эксплуатации баз данных

Создание ledger-таблицы, чтение истории изменений и проверка целостности

SQL ServerБезопасность

Команда

USE [Musteri];
-- Ledger verification requires snapshot isolation:
ALTER DATABASE [Musteri] SET ALLOW_SNAPSHOT_ISOLATION ON;

-- Updatable ledger table (history table maintained automatically):
CREATE TABLE dbo.Hesap (
    HesapId int           NOT NULL PRIMARY KEY,
    Bakiye  decimal(18,2) NOT NULL
)
WITH (SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.Hesap_History), LEDGER = ON);

-- Append-only ledger (UPDATE/DELETE are blocked):
CREATE TABLE dbo.IslemLog (Id bigint IDENTITY, Mesaj nvarchar(400))
WITH (LEDGER = ON (APPEND_ONLY = ON));

-- Who changed what, and when:
SELECT t.commit_time, t.principal_name, l.HesapId, l.Bakiye, l.ledger_operation_type_desc
FROM   dbo.Hesap_Ledger l
  JOIN sys.database_ledger_transactions t ON t.transaction_id = l.ledger_transaction_id
ORDER BY t.commit_time DESC;

-- Take a digest (store it somewhere trusted outside) and verify:
EXEC sys.sp_generate_database_ledger_digest;
EXEC sys.sp_verify_database_ledger
     N'{"database_name":"Musteri","block_id":0,"hash":"0x...","last_transaction_commit_time":"...","digest_time":"..."}';

Что делает

Создаёт ledger-таблицу, которая записывает изменения строк в криптографическую цепочку хешей; представление _Ledger показывает, кто и когда выполнил каждый INSERT/UPDATE/DELETE, а проверка по сохранённому дайджесту доказывает, что данные не изменялись задним числом (в том числе DBA).

Когда использовать

Для данных, неизменность которых должна быть доказуема: финансовые записи, журналы аудита, записи о договорах/согласованиях.

Внимание

Ledger нельзя отключить после создания таблицы; ledger-таблицу нельзя превратить в обычную, а удалённая ledger-таблица сохраняется как dropped ledger table. Обновляемый ledger пишет строку истории при каждом изменении, и объём хранилища растёт. Если дайджесты не хранятся вне базы в неизменяемом хранилище (WORM, Azure immutable blob), проверка не имеет доказательной силы. sp_verify_database_ledger завершается ошибкой 37498 без snapshot isolation.

Открыть в DBAtlas →

Связанные материалы