Partilhar via


Criar e usar tabelas contábeis atualizáveis

Aplica-se a: SQL Server 2022 (16.x) e versões posteriores Azure SQL DatabaseAzure SQL Managed Instance

Este artigo mostra como criar uma tabela contábil atualizável. Em seguida, você inserirá valores em sua tabela contábil atualizável e, em seguida, fará atualizações nos dados. Finalmente, você visualizará os resultados usando a visualização contábil. Usaremos um exemplo de um aplicativo bancário que rastreia os saldos dos clientes bancários em suas contas. Nosso exemplo lhe dará uma visão prática da relação entre a tabela de registo atualizável, sua tabela de histórico correspondente e a visualização de registo.

Pré-requisitos

Criar uma tabela contábil atualizável

Criaremos uma tabela de saldo de conta com o esquema a seguir.

Nome da coluna Tipo de dados Description
ID do Cliente int ID do cliente - Chave primária agrupada
Apelido Varchar (50) Apelido do cliente
Primeiro nome Varchar (50) Nome do cliente
Saldo decimal (10,2) Saldo da conta
  1. Use o SQL Server Management Studio para criar um novo esquema e uma nova tabela chamados [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
    );
    

    Observação

    Especificar o LEDGER = ON argumento é opcional se você habilitou um banco de dados contábil quando criou seu banco de dados.

  2. Quando sua tabela contábil atualizável é criada, a tabela de histórico correspondente e a visualização do razão também são criadas. Execute os seguintes comandos T-SQL para ver a nova tabela e a nova exibição.

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

    Captura de tela que mostra a consulta de novas tabelas contábeis.

  3. Insira o nome Nick Jones como um novo cliente com um saldo inicial de $50.

    INSERT INTO [Account].[Balance]
    VALUES (1, 'Jones', 'Nick', 50);
    
  4. Insira os nomes John Smith, Joe Smithe Mary Michaels como novos clientes com saldos de abertura de $500, $30 e $200, respectivamente.

    INSERT INTO [Account].[Balance]
    VALUES (2, 'Smith', 'John', 500),
    (3, 'Smith', 'Joe', 30),
    (4, 'Michaels', 'Mary', 200);
    
  5. Exiba a [Account].[Balance] tabela contábil atualizável e especifique as colunas GERADO SEMPRE adicionadas à tabela.

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

    Na janela de resultados, você verá primeiro os valores inseridos pelos comandos T-SQL, juntamente com os metadados do sistema usados para fins de linhagem de dados.

    • A ledger_start_transaction_id coluna indica o ID exclusivo da transação associado à transação que inseriu os dados. Porque John, Joee Mary foram inseridos usando a mesma transação, eles compartilham o mesmo ID de transação.

    • A ledger_start_sequence_number coluna observa a ordem pela qual os valores foram inseridos pela transação.

      Captura de tela que mostra o exemplo de tabela contábil 1.

  6. Atualize o saldo de Nick de 50 para 100.

    UPDATE [Account].[Balance] SET [Balance] = 100
    WHERE [CustomerID] = 1;
    
  7. Exiba a visualização do [Account].[Balance] livro-razão, bem como a visualização do sistema de livro-razão de transações, para identificar os usuários que fizeram as alterações.

     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;
    

    Sugestão

    Recomendamos que você consulte o histórico de alterações por meio da visualização contábil e não da tabela de histórico.

    NickO saldo da conta foi atualizado com êxito na tabela de contabilidade atualizável para 100.
    A visualização do razão mostra que a atualização da tabela contábil é uma DELETE da linha original com 50. O saldo correspondente a INSERT de uma nova linha com 100 mostra o novo saldo para Nick.

    Captura de tela que mostra o exemplo 3 da tabela contábil.

Permissions

A criação de tabelas contábeis atualizáveis requer a ENABLE LEDGER permissão. Para obter mais informações sobre permissões relacionadas a tabelas contábeis, consulte Permissões.