Partilhar via


O que é o livro razão da base de dados?

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

O livro-razão de base de dados faz parte da funcionalidade de livro-razão. O registo de transações do banco de dados captura incrementalmente o estado de um banco de dados à medida que este evolui, enquanto as atualizações ocorrem em tabelas de registo. Ele logicamente usa um blockchain e estruturas de dados de árvore Merkle.

Todas as operações que atualizam uma tabela contábil precisam executar algumas tarefas adicionais para manter os dados históricos e calcular os resumos capturados no livro-razão do banco de dados. Especificamente, para cada linha atualizada, devemos:

  • Persista a versão anterior da linha na tabela de histórico.
  • Atribua o ID da transação e gere um novo número de sequência, persistindo-o nas colunas apropriadas do sistema.
  • Serialize o conteúdo da linha e inclua-o ao calcular o hash para todas as linhas atualizadas por esta transação.

O Ledger consegue isso estendendo os planos de consulta DML ( Data Manipulation Language ) de todas as operações de inserção, atualização e exclusão direcionadas a tabelas contábeis. O ID da transação e o número de sequência recém-gerado são definidos para a nova versão da linha. Em seguida, o operador de plano de consulta executa uma expressão especial que serializa o conteúdo da linha e calcula seu hash, acrescentando-o a uma árvore Merkle que é armazenada no nível da transação e contém os hashes de todas as versões de linha atualizadas por essa transação para essa tabela contábil. A raiz da árvore representa todas as atualizações e exclusões realizadas por essa transação nesta tabela contábil. Se a transação atualizar várias tabelas, uma árvore Merkle separada será mantida para cada tabela. A figura abaixo mostra um exemplo de uma árvore Merkle armazenando as versões de linha atualizadas de uma tabela contábil e o formato usado para serializar as linhas. Além do valor serializado de cada coluna, incluímos metadados sobre o número de colunas na linha, o ordinal de colunas individuais, os tipos de dados, comprimentos e outras informações que afetam como os valores são interpretados.

Diagrama que mostra uma árvore Merkle armazenando as versões de linha atualizadas de uma tabela contábil e o formato usado para serializar as linhas

Para capturar o estado do banco de dados, o registo do banco de dados armazena um registro para cada transação. Ele captura metadados sobre a transação, como seu carimbo de data/hora de confirmação e a identidade do usuário que a executou. Ele também captura a raiz da árvore Merkle das linhas atualizadas em cada tabela contábil (veja acima). Essas entradas são então anexadas a uma estrutura de dados inviolável para permitir a verificação da integridade no futuro. Um bloco está fechado:

Quando um bloco é fechado, novas transações serão inseridas em um novo bloco. O processo de geração de blocos, então:

  1. Recupera todas as transações que pertencem ao bloco fechado tanto da fila em memória quanto da vista do catálogo de sistema sys.database_ledger_transactions.
  2. Calcula a raiz da árvore Merkle sobre essas transações e o hash do bloco anterior.
  3. Persiste o bloco fechado na exibição de catálogo do sistema sys.database_ledger_blocks .

Por se tratar de uma atualização regular da tabela, o sistema garante automaticamente a sua durabilidade. Para manter a cadeia única de blocos, esta operação é de thread único. Mas também é eficiente, porque só calcula os hashes sobre as informações da transação e acontece de forma assíncrona. Isso não afeta o desempenho da transação.

Diagrama que mostra uma árvore Merkle armazenando as transações de uma tabela contábil.

Para obter mais informações sobre como o livro-razão fornece integridade de dados, consulte os artigos Gestão de Digestos e Verificação de Base de Dados.

Onde são armazenadas as transações de banco de dados e os dados de bloco?

Os dados para transações e blocos são armazenados fisicamente como linhas em duas exibições de catálogo do sistema:

  • sys.database_ledger_transactions: Mantém uma linha com as informações de cada transação no razão da base de dados. As informações incluem o ID do bloco onde esta transação pertence e o ordinal da transação dentro do bloco.
  • sys.database_ledger_blocks: Mantém uma linha para cada bloco no livro-razão, incluindo a raiz da árvore Merkle sobre as transações dentro do bloco e o hash do bloco anterior para formar um blockchain.

Para exibir o livro-razão do banco de dados, execute as seguintes instruções T-SQL no SQL Server Management Studio ou no SQL Server Developer Tools.

SELECT * FROM sys.database_ledger_transactions;
GO

SELECT * FROM sys.database_ledger_blocks;
GO

O exemplo a seguir de uma tabela contábil consiste em quatro transações que compunham um bloco no blockchain do livro-razão do banco de dados:

Captura de tela de uma tabela contábil de exemplo.

Permissions

A visualização do registo de transações da base de dados requer a VIEW LEDGER CONTENT permissão. Para obter detalhes sobre permissões relacionadas a tabelas contábeis, consulte Permissões.