Sdílet prostřednictvím


Vytváření a používání aktualizovatelných tabulek registru

Platí pro: SQL Server 2022 (16.x) a novější verze Azure SQL DatabaseAzure SQL Managed Instance

V tomto článku se dozvíte, jak vytvořit aktualizovatelnou tabulku registru. V dalším kroku vložíte do aktualizovatelné tabulky registru hodnoty a pak provedete aktualizace dat. Nakonec výsledky zobrazíte pomocí zobrazení hlavní knihy. Použijeme příklad bankovní aplikace, která sleduje zůstatky bankovních zákazníků ve svých účtech. Náš příklad vám poskytne praktický pohled na relaci mezi aktualizovatelnou tabulkou registru a odpovídající tabulkou historie a zobrazením registru.

Požadavky

Vytvoření aktualizovatelné tabulky registru

Vytvoříme tabulku zůstatku účtu s následujícím schématem.

Název sloupce Datový typ Description
ID zákazníka int ID zákazníka – clusterovaný primární klíč
Příjmení varchar (50) Příjmení zákazníka
Křestní jméno varchar (50) Jméno zákazníka
Zůstatek desetinné číslo (10,2) Zůstatek na účtu
  1. Pomocí aplikace SQL Server Management Studio vytvořte nové schéma a tabulku s názvem [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
    );
    

    Poznámka:

    Zadání argumentu LEDGER = ON je volitelné, pokud jste při vytváření databáze povolili databázi registru.

  2. Při vytvoření aktualizovatelné tabulky registru se vytvoří také odpovídající tabulka historie a zobrazení registru. Spuštěním následujících příkazů T-SQL zobrazte novou tabulku a nové zobrazení.

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

    Snímek obrazovky znázorňující dotazování nových tabulek registru

  3. Vložte jméno Nick Jones jako nový zákazník s počátečním zůstatkem 50 USD.

    INSERT INTO [Account].[Balance]
    VALUES (1, 'Jones', 'Nick', 50);
    
  4. Vložte jména John Smith, Joe Smitha Mary Michaels jako nové zákazníky s počátečními zůstatky 500 USD, 30 USD a 200 USD.

    INSERT INTO [Account].[Balance]
    VALUES (2, 'Smith', 'John', 500),
    (3, 'Smith', 'Joe', 30),
    (4, 'Michaels', 'Mary', 200);
    
  5. [Account].[Balance] Zobrazte aktualizovatelnou tabulku registru a zadejte sloupce GENERATED ALWAYS přidané do tabulky.

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

    V okně výsledků se nejprve zobrazí hodnoty vložené příkazy T-SQL spolu se systémovými metadaty používanými pro účely rodokmenu dat.

    • Sloupec ledger_start_transaction_id zaznamenává jedinečné ID transakce, která vložila data. Protože John, Joea Mary byly vloženy pomocí stejné transakce, sdílejí stejné ID transakce.

    • Sloupec ledger_start_sequence_number zaznamenává pořadí, podle kterého byly hodnoty vloženy transakcí.

      Snímek obrazovky znázorňující tabulku účetní knihy – příklad 1

  6. Aktualizujte zůstatek Nick z 50 na 100.

    UPDATE [Account].[Balance] SET [Balance] = 100
    WHERE [CustomerID] = 1;
    
  7. [Account].[Balance] Zobrazte zobrazení registru spolu se zobrazením systému registru transakcí a identifikujte uživatele, kteří provedli změny.

     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;
    

    Návod

    Doporučujeme dotazovat se na historii změn prostřednictvím zobrazení účetní knihy, nikoli tabulky historie.

    NickZůstatek na účtu byl úspěšně aktualizován v tabulce aktualizovatelných registrů na 100.
    Zobrazení hlavní knihy ukazuje, že aktualizace tabulky hlavní knihy je kopií původního DELETE řádku pomocí 50. Nový zůstatek s odpovídajícím INSERT v novém řádku 100 ukazuje nový zůstatek pro Nick.

    Snímek obrazovky znázorňující tabulku registru – příklad 3

Povolení

Vytváření aktualizovatelných tabulek registru vyžaduje ENABLE LEDGER oprávnění. Další informace o oprávněních souvisejících s tabulkami registru najdete v tématu Oprávnění.