Erstellen und Verwenden aktualisierbarer Ledgertabellen
Gilt für: SQL Server 2022 (16.x) Azure SQL-Datenbank Azure SQL Managed Instance
In diesem Artikel erfahren Sie, wie Sie aktualisierbare Ledgertabellen erstellen können. Als Nächstes fügen Sie Werte in die aktualisierbare Ledgertabelle ein. Danach nehmen Sie Aktualisierungen an den Daten vor. Schließlich zeigen Sie die Ergebnisse unter Verwendung der Ledgeransicht an. Dazu wird als Beispiel eine Bankanwendung verwendet, die das Guthaben von Bankkunden auf deren Konten nachverfolgt. In diesem Beispiel erhalten Sie einen praxisnahen Blick auf die Beziehung zwischen der aktualisierbaren Ledgertabelle und der zugehörigen Verlaufstabelle sowie der Ledgersicht.
Voraussetzungen
Erstellen einer aktualisierbaren Ledgertabelle
Erstellen Sie eine Kontosaldotabelle mit dem folgenden Schema.
Spaltenname | Datentyp | Beschreibung |
---|---|---|
CustomerID | int | Kunden-ID: Primärschlüssel, gruppiert |
LastName | varchar(50) | Nachname des Kunden |
FirstName | varchar(50) | Vorname des Kunden |
Bilanz | decimal(10,2) | Kontostand |
Erstellen Sie in SQL Server Management Studio oder Azure Data Studio ein neues Schema und die neue Tabelle namens
[Account].[Balance]
.CREATE SCHEMA [Account]; GO CREATE TABLE [Account].[Balance] ( [CustomerID] INT NOT NULL PRIMARY KEY CLUSTERED, [LastName] VARCHAR (50) NOT NULL, [FirstName] VARCHAR (50) NOT NULL, [Balance] DECIMAL (10,2) NOT NULL ) WITH ( SYSTEM_VERSIONING = ON (HISTORY_TABLE = [Account].[BalanceHistory]), LEDGER = ON );
Hinweis
Die Angabe des Arguments
LEDGER = ON
ist optional, wenn Sie beim Erstellen Ihrer Datenbank eine Ledgerdatenbank aktiviert haben.Während Ihre aktualisierbare Ledgertabelle erstellt wird, werden auch die zugehörige Verlaufstabelle und die Ledgersicht generiert. Führen Sie die folgenden T-SQL-Befehle aus, um die neue Tabelle und die neue Sicht anzuzeigen.
SELECT ts.[name] + '.' + t.[name] AS [ledger_table_name] , hs.[name] + '.' + h.[name] AS [history_table_name] , vs.[name] + '.' + v.[name] AS [ledger_view_name] FROM sys.tables AS t JOIN sys.tables AS h ON (h.[object_id] = t.[history_table_id]) JOIN sys.views v ON (v.[object_id] = t.[ledger_view_id]) JOIN sys.schemas ts ON (ts.[schema_id] = t.[schema_id]) JOIN sys.schemas hs ON (hs.[schema_id] = h.[schema_id]) JOIN sys.schemas vs ON (vs.[schema_id] = v.[schema_id]) WHERE t.[name] = 'Balance';
Fügen Sie den Namen
Nick Jones
als neuen Kunden mit einem Anfangssaldo von 50 US-Dollar ein.INSERT INTO [Account].[Balance] VALUES (1, 'Jones', 'Nick', 50);
Fügen Sie die Namen
John Smith
,Joe Smith
undMary Michaels
mit einem Anfangssaldo von 500, 30 bzw. 200 US-Dollar ein.INSERT INTO [Account].[Balance] VALUES (2, 'Smith', 'John', 500), (3, 'Smith', 'Joe', 30), (4, 'Michaels', 'Mary', 200);
Zeigen Sie die aktualisierbare Ledgertabelle
[Account].[Balance]
an, und geben Sie die GENERATED ALWAYS-Spalten an, die der Tabelle hinzugefügt wurden.SELECT [CustomerID] ,[LastName] ,[FirstName] ,[Balance] ,[ledger_start_transaction_id] ,[ledger_end_transaction_id] ,[ledger_start_sequence_number] ,[ledger_end_sequence_number] FROM [Account].[Balance];
Im Ergebnisfenster werden zunächst die Werte angezeigt, die Sie mit Ihren T-SQL-Befehlen eingefügt haben, sowie die Systemmetadaten, die für die Datenherkunft verwendet werden.
Die
ledger_start_transaction_id
-Spalte gibt die eindeutige Transaktions-ID an, die der Transaktion zugeordnet ist, mit der die Daten eingefügt wurden. DaJohn
,Joe
undMary
mit derselben Transaktion eingefügt wurden, weisen sie alle dieselbe Transaktions-ID auf.Die
ledger_start_sequence_number
-Spalte gibt die Reihenfolge an, in der Werte von der Transaktion eingefügt wurden.
Aktualisieren Sie den Saldo von
Nick
von50
auf100
.UPDATE [Account].[Balance] SET [Balance] = 100 WHERE [CustomerID] = 1;
Zeigen Sie die
[Account].[Balance]
-Ledgeransicht zusammen mit der Transaktions-Ledgersystemansicht an, um Benutzer zu identifizieren, die die Änderungen vorgenommen haben.SELECT t.[commit_time] AS [CommitTime] , t.[principal_name] AS [UserName] , l.[CustomerID] , l.[LastName] , l.[FirstName] , l.[Balance] , l.[ledger_operation_type_desc] AS Operation FROM [Account].[Balance_Ledger] l JOIN sys.database_ledger_transactions t ON t.transaction_id = l.ledger_transaction_id ORDER BY t.commit_time DESC;
Tipp
Es wird empfohlen, den Änderungsverlauf über die Ledgersicht und nicht über die Verlaufstabelle abzufragen.
Der Kontostand von
Nick
wurde in der aktualisierbaren Ledgertabelle erfolgreich in100
geändert.
Die Ledgeransicht zeigt, dass das Aktualisieren der Ledgertabelle einDELETE
der ursprünglichen Zeile mit50
ist. Der Saldo mit einem entsprechendenINSERT
einer neuen Zeile mit100
zeigt den neuen Saldo fürNick
an.
Berechtigungen
Für das Erstellen von aktualisierbaren Ledgertabellen ist die Berechtigung ENABLE LEDGER
erforderlich. Weitere Informationen zu Berechtigungen im Zusammenhang mit Ledgertabellen finden Sie unter Berechtigungen.