Aktualisierbare Ledgertabellen

Gilt für: SQL Server 2022 (16.x) und höhere Versionen von Azure SQL-DatenbankAzure SQL Managed Instance

Aktualisierbare Ledgertabellen sind Tabellen mit vom System verwalteten Versionen, für die Benutzer Updates und Löschungen durchführen können und die gleichzeitig Beweisfunktionen für Manipulationen bereitstellen. Bei Updates oder Löschungen werden alle früheren Versionen einer Zeile in einer sekundären Tabelle beibehalten, die als Verlaufstabelle bezeichnet wird. Die Verlaufstabelle hat dasselbe Schema wie die aktualisierbare Ledgertabelle. Bei einem Update einer Zeile verbleibt die neueste Version der Zeile in der Ledgertabelle, während ihre frühere Version vom System in die Verlaufstabelle eingefügt wird. Dieser Vorgang ist für die Anwendung vollkommen transparent.

Sowohl aktualisierbare Ledgertabellen als auch zeitliche Tabellen sind systemversionierte Tabellen, bei denen die Datenbank-Engine historische Zeilenversionen in sekundären Verlaufstabellen erfasst. Beide Technologien bieten spezielle Vorteile. Aktualisierbare Ledgertabellen machen sowohl aktuelle als auch historische Daten als manipuliert erkennbar. Temporale Tabellen unterstützen die Abfrage von Daten, die zu einem beliebigen Zeitpunkt gespeichert wurden, und nicht nur der Daten, die zum aktuellen Zeitpunkt korrekt sind. Sie können beide Technologien zusammen verwenden, indem Sie Tabellen erstellen, die sowohl aktualisierbare Ledgertabellen als auch temporale Tabellen sind.

Diagram: Architektur der Ledgertabelle

Sie können eine aktualisierbare Sachtabelle erstellen, indem Sie das LEDGER = ON Argument in Ihrer CREATE DATABASE (Transact-SQL) -Anweisung angeben.

Tipp

LEDGER = ON ist beim Erstellen von aktualisierbaren Ledgertabellen in einer Ledgerdatenbank optional. Standardmäßig ist jede Tabelle in einer Ledgerdatenbank eine aktualisierbare Ledgertabelle.

Informationen zu den verfügbaren Optionen, wenn Sie das LEDGER Argument in Ihrer T-SQL-Anweisung angeben, finden Sie unter CREATE TABLE (Transact-SQL).

Wichtig

Nachdem eine Ledgertabelle erstellt wurde, kann sie nicht in eine Tabelle umgewandelt werden, die keine Ledgertabelle ist. Infolgedessen können Angreifer Ledgerfunktionen für eine Ledgertabelle nicht vorübergehend außer Kraft setzen, Änderungen vornehmen und dann die Ledgerfunktionalität erneut aktivieren.

Schema aktualisierbarer Ledgertabellen

Eine aktualisierbare Ledgertabelle muss über die folgenden GENERATED ALWAYS-Spalten verfügen. Diese enthalten Metadaten, die angeben, durch welche Transaktionen Änderungen an der Tabelle vorgenommen wurden, und in welcher Reihenfolge die Vorgänge ausgeführt wurden, mit denen Zeilen von der jeweiligen Transaktion aktualisiert wurden. Diese Daten sind für forensische Zwecke nützlich, um zu verstehen, wie Daten im Lauf der Zeit eingefügt wurden.

Wenn Sie in der CREATE TABLEAnweisung (Transact-SQL) die erforderlichen GENERATED ALWAYSSpalten der Ledgertabelle und der Ledger-Verlaufstabelle nicht angeben, fügt das System die Spalten automatisch hinzu und verwendet die folgenden Standardnamen. Weitere Informationen finden Sie in den Beispielen zum Erstellen einer aktualisierbaren Ledgertabelle.

Standardspaltenname Datentyp Beschreibung
ledger_start_transaction_id bigint Die ID der Transaktion, mit der eine Zeilenversion erstellt wurde
ledger_end_transaction_id bigint Die ID der Transaktion, mit der eine Zeilenversion gelöscht wurde
ledger_start_sequence_number bigint Die Sequenznummer eines Vorgangs innerhalb einer Transaktion, mit der eine Zeilenversion erstellt wurde
ledger_end_sequence_number bigint Die Sequenznummer eines Vorgangs innerhalb einer Transaktion, mit der eine Zeilenversion gelöscht wurde

Verlaufstabelle

Die Verlaufstabelle wird bei der Erstellung einer aktualisierbaren Ledgertabelle automatisch generiert. In der Verlaufstabelle werden die Verlaufswerte von Zeilen erfasst, die aufgrund von Updates oder Löschungen in der aktualisierbaren Ledgertabelle geändert wurden. Das Schema der Verlaufstabelle spiegelt das der aktualisierbaren Ledger-Tabelle wider, mit der sie verknüpft ist.

Wenn Sie eine aktualisierbare Ledgertabelle erstellen, können Sie entweder den Namen des Schemas angeben, das Ihre Verlaufstabelle enthalten soll, sowie den Namen der Verlaufstabelle, oder Sie lassen den Namen der Verlaufstabelle vom System generieren und fügen sie demselben Schema wie die Ledgertabelle hinzu. Verlaufstabellen mit vom System generierten Namen werden als „anonyme Verlaufstabellen“ bezeichnet. Die Namenskonvention für anonyme Verlaufstabellen lautet: <schema>.<updatableledgertablename>.MSSQL_LedgerHistoryFor_<GUID>.

Ledgersicht

Für jede aktualisierbare Ledgertabelle generiert das System automatisch eine Sicht, die als Ledgersicht bezeichnet wird. Die Ledgeransicht ist eine Verknüpfung aus der aktualisierbaren Ledgertabelle und der zugehörigen Historientabelle. Die Ledgeransicht weist alle Zeilenänderungen aus, die in der aktualisierbaren Ledger-Tabelle vorgenommen wurden, indem sie die historischen Daten aus der Verlaufstabelle verknüpft. Mit dieser Ansicht können Benutzer, ihre Partner oder Prüfer alle Vorgänge im Verlauf analysieren und potenzielle Manipulationen erkennen. Jedem Zeilenvorgang wird die ID der ausgeführten Transaktion sowie die Angabe zugeordnet, ob es eine DELETE- oder INSERT-Transaktion war. So können Benutzer weitere Informationen zum Zeitpunkt der Transaktionsausführung und zur Identität des ausführenden Benutzers abrufen und mit anderen Vorgängen korrelieren, die im Rahmen dieser Transaktion ausgeführt wurden.

Wenn Sie beispielsweise den Transaktionsverlauf für ein Bankszenario nachverfolgen möchten, bietet die Ledgeransicht eine Chronik der Transaktionen im Zeitverlauf. Bei Verwendung der Ledgeransicht müssen Sie die aktualisierbare Ledgertabelle und die Verlaufstabellen nicht unabhängig anzeigen oder dafür eine eigene Ansicht erstellen.

Ein Beispiel für die Verwendung der Ledgeransicht finden Sie unter Erstellen und Verwenden von aktualisierbaren Ledgertabellen.

Das Schema der Ledgersicht entspricht den Spalten, die im aktualisierbaren Ledger und in der Verlaufstabelle definiert sind, jedoch unterscheiden sich die GENERATED ALWAYS-Spalten von denen des aktualisierbaren Ledgers und der Verlaufstabelle.

Schema der Ledger-Ansicht

Hinweis

Die Spaltennamen der Ledgeransicht können beim Erstellen der Tabelle angepasst werden, indem Sie den Parameter <ledger_view_option> in der Anweisung CREATE TABLE (Transact-SQL) verwenden. Weitere Informationen finden Sie unter "Ledger-Ansichtsoptionen " und den entsprechenden Beispielen in CREATE TABLE (Transact-SQL).

Standardspaltenname Datentyp Beschreibung
ledger_transaction_id bigint Die Transaktions-ID, mit der eine Zeilenversion erstellt oder gelöscht wurde.
ledger_sequence_number bigint Die Sequenznummer einer Operation auf Zeilenebene innerhalb der Transaktion in der Tabelle.
ledger_operation_type tinyint Enthält 1 (INSERT) oder 2 (DELETE). Das Einfügen einer Zeile in die Ledgertabelle erzeugt eine neue Zeile in der Ledgeransicht, bei der 1 in dieser Spalte enthalten ist. Das Löschen einer Zeile aus der Ledgertabelle erzeugt eine neue Zeile in der Ledgeransicht, bei der 2 in dieser Spalte enthalten ist. Das Aktualisieren einer Zeile in der Ledger-Tabelle erstellt zwei neue Zeilen in der Ledger-Ansicht. Eine Zeile enthält 2 (DELETE), und die andere Zeile enthält 1 (INSERT) in dieser Spalte.
ledger_operation_type_desc nvarchar(128) Enthält INSERT oder DELETE. Weitere Informationen finden Sie in der vorherigen Zeile.