Freigeben über


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
  1. 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.

  2. 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';
    

    Screenshot: Abfragen neuer Ledgertabellen

  3. 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);
    
  4. Fügen Sie die Namen John Smith, Joe Smith und Mary 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);
    
  5. 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. Da John, Joe und Mary 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.

      Screenshot: Ledgertabelle – Beispiel 1

  6. Aktualisieren Sie den Saldo von Nick von 50 auf 100.

    UPDATE [Account].[Balance] SET [Balance] = 100
    WHERE [CustomerID] = 1;
    
  7. 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 in 100 geändert.
    Die Ledgeransicht zeigt, dass das Aktualisieren der Ledgertabelle ein DELETE der ursprünglichen Zeile mit 50 ist. Der Saldo mit einem entsprechenden INSERT einer neuen Zeile mit 100 zeigt den neuen Saldo für Nick an.

    Screenshot: Ledgertabelle – Beispiel 3

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.