DBAtlas · Atlas für Datenbankbetrieb

Ledger-Tabelle anlegen, ihre Änderungshistorie lesen und die Integrität verifizieren

SQL ServerSicherheit

Befehl

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":"..."}';

Was es tut

Legt eine Ledger-Tabelle an, die Zeilenänderungen in einer kryptografischen Hash-Kette protokolliert; die _Ledger-View zeigt, wer jedes INSERT/UPDATE/DELETE wann ausgeführt hat, und die Verifizierung gegen einen gespeicherten Digest beweist, dass die Daten nachträglich nicht verändert wurden (auch nicht von DBAs).

Wann einsetzen

Für Daten, deren Unveränderlichkeit nachweisbar sein muss: Finanzbuchungen, Audit-Trails, Vertrags-/Genehmigungsdatensätze.

Vorsicht

Ledger lässt sich nach dem Anlegen der Tabelle nicht ausschalten; eine Ledger-Tabelle kann nicht in eine normale Tabelle umgewandelt werden, und eine gelöschte Ledger-Tabelle bleibt als gelöschte Ledger-Tabelle erhalten. Updatable Ledger schreibt bei jeder Änderung eine Historienzeile, der Speicherbedarf wächst. Werden Digests nicht außerhalb der Datenbank in unveränderlichem Speicher (WORM, Azure immutable blob) abgelegt, hat die Verifizierung keine Beweiskraft. sp_verify_database_ledger schlägt ohne Snapshot Isolation mit Fehler 37498 fehl.

In DBAtlas öffnen →

Verwandte Einträge