Delen via


Bijwerkbare grootboektabellen maken en gebruiken

van toepassing op: SQL Server 2022 (16.x) Azure SQL DatabaseAzure SQL Managed Instance

In dit artikel leest u hoe u een updatable tabel voor grootboek maakt. Vervolgens voegt u waarden in uw updatable grootboektabel in en voert u vervolgens updates uit voor de gegevens. Ten slotte bekijkt u de resultaten met behulp van de grootboekweergave. We gebruiken een voorbeeld van een banktoepassing waarmee de saldo's van bankklanten in hun rekeningen worden bijgehouden. In ons voorbeeld krijgt u een praktisch inzicht in de relatie tussen de bijwerkbare grootboektabel en de bijbehorende geschiedenistabel en grootboekweergave.

Vereiste voorwaarden

Een updatable grootboektabel maken

We maken een saldotabel voor accounts met het volgende schema.

Kolomnaam Gegevenstype Description
KlantID int Klant-id - Primaire sleutel geclusterd
Achternaam varchar (50) Achternaam van klant
Voornaam varchar (50) Voornaam van klant
Saldo decimaal (10,2) Saldo van rekening
  1. Gebruik SQL Server Management Studio om een nieuw schema en een nieuwe tabel met de naam [Account].[Balance]te maken.

    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
    );
    

    Opmerking

    LEDGER = ON Het argument opgeven is optioneel als u een grootboekdatabase hebt ingeschakeld bij het maken van uw database.

  2. Wanneer uw bijwerkbare grootboektabel wordt gemaakt, worden ook de bijbehorende geschiedenistabel en grootboekweergave gemaakt. Voer de volgende T-SQL-opdrachten uit om de nieuwe tabel en de nieuwe weergave te bekijken.

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

    Schermopname van het uitvoeren van query's op nieuwe grootboektabellen.

  3. Voeg de naam Nick Jones in als een nieuwe klant met een openingssaldo van $ 50.

    INSERT INTO [Account].[Balance]
    VALUES (1, 'Jones', 'Nick', 50);
    
  4. Voeg de namen John Smithin, Joe Smithen Mary Michaels als nieuwe klanten met een openingssaldo van respectievelijk $ 500, $ 30 en $ 200.

    INSERT INTO [Account].[Balance]
    VALUES (2, 'Smith', 'John', 500),
    (3, 'Smith', 'Joe', 30),
    (4, 'Michaels', 'Mary', 200);
    
  5. Bekijk de [Account].[Balance] tabel van het bijwerkbare grootboek en specificeer de GEGENEREERDE ALWAYS-kolommen die aan de tabel zijn toegevoegd.

    SELECT [CustomerID]
       ,[LastName]
       ,[FirstName]
       ,[Balance]
       ,[ledger_start_transaction_id]
       ,[ledger_end_transaction_id]
       ,[ledger_start_sequence_number]
       ,[ledger_end_sequence_number]
     FROM [Account].[Balance];  
    

    In het resultatenvenster ziet u eerst de waarden die zijn ingevoegd door uw T-SQL-opdrachten, samen met de systeemmetagegevens die worden gebruikt voor gegevensherkomstdoeleinden.

    • De ledger_start_transaction_id kolom noteert de unieke transactie-id die is gekoppeld aan de transactie die de gegevens heeft ingevoegd. Omdat John, Joeen Mary zijn ingevoegd met behulp van dezelfde transactie, delen ze dezelfde transactie-id.

    • De ledger_start_sequence_number kolom noteert de volgorde waarin de waarden door de transactie zijn ingevoegd.

      Schermopname van grootboektabel voorbeeld 1.

  6. Werk het saldo van Nick bij van 50 naar 100.

    UPDATE [Account].[Balance] SET [Balance] = 100
    WHERE [CustomerID] = 1;
    
  7. Bekijk de [Account].[Balance] grootboekweergave, samen met de systeemweergave van het transactieboek om gebruikers te identificeren die de wijzigingen hebben aangebracht.

     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;
    

    Aanbeveling

    U wordt aangeraden een query uit te voeren op de geschiedenis van wijzigingen via de grootboekweergave en niet op de geschiedenistabel.

    Nick's rekeningsaldo is succesvol bijgewerkt in de aanpasbare grootboektabel op 100.
    In de grootboekweergave ziet u dat het bijwerken van de grootboektabel bestaat uit een DELETE van de oorspronkelijke rij, met 50. Het saldo met een overeenkomstige INSERT van een nieuwe rij met 100 toont het nieuwe saldo voor Nick.

    Schermopname van grootboektabel voorbeeld 3.

Permissions

Voor het maken van updatable grootboektabellen is de ENABLE LEDGER machtiging vereist. Zie Machtigingen voor meer informatie over machtigingen met betrekking tot grootboektabellen.