O que é o ledger de banco de dados?

Aplica-se a: SQL Server 2022 (16.x) e versões posteriores Banco de Dados SQL do AzureInstância Gerenciada de SQL do Azure

O livro-razão do banco de dados faz parte do recurso de livro-razão. O livro-razão do banco de dados captura incrementalmente o estado de um banco de dados à medida que ele evolui ao longo do tempo, à medida que ocorrem atualizações nas tabelas do livro-razão. Ele usa logicamente um blockchain e estruturas de dados da árvore de Merkle.

Quaisquer operações que atualizem uma tabela de ledger precisam executar algumas tarefas adicionais para manter os dados históricos e calcular os resumos criptográficos capturados no ledger do banco de dados. Especificamente, para cada linha atualizada, devemos:

  • Persistir 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, e persista-os nas colunas de sistema apropriadas.
  • Serializar o conteúdo da linha e incluí-lo ao calcular o hash de todas as linhas atualizadas por essa transação.

O Ledger faz isso estendendo os planos de consulta da Linguagem de Manipulação de Dados (DML) de todas as operações de inserção, atualização e exclusão destinadas a tabelas de ledger. A ID da transação e o número de sequência recém-gerado são definidos para a nova versão da linha. Depois, o operador do plano de consulta executa uma expressão especial que serializa o conteúdo da linha e calcula seu hash, acrescentando-o a uma árvore de Merkle que é armazenada no nível da transação e contém os hashes de todas as versões de linha atualizadas por esta transação desta tabela de ledger. A raiz da árvore representa todas as atualizações e exclusões realizadas por esta transação nesta tabela de ledger. 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 de Merkle que armazena as versões atualizadas das linhas de uma tabela de livro-razão 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 cada coluna, os tipos de dados, os comprimentos e outras informações que afetam como os valores são interpretados.

Diagrama que mostra uma árvore Merkle que armazena as versões atualizadas das linhas de uma tabela de ledger e o formato usado para serializar as linhas

Para capturar o estado do banco de dados, o livro-razão do banco de dados armazena uma entrada 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 o executou. Ele também captura a raiz da árvore de Merkle das linhas atualizadas em cada tabela do livro-razão (veja acima). Em seguida, essas entradas são acrescentadas a uma estrutura de dados com evidência de violação para permitir a verificação de integridade no futuro. Um bloco é fechado:

Quando um bloco for fechado, novas transações serão inseridas em um novo bloco. Em seguida, o processo de geração de blocos:

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

Como essa é uma atualização de tabela regular, o sistema garante automaticamente sua durabilidade. Para manter uma única cadeia de blocos, essa operação é executada em uma única thread. Mas também é eficiente, pois computa apenas os hashes sobre as informações de transação e acontece de forma assíncrona. Isso não afeta o desempenho da transação.

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

Para obter mais informações sobre como o livro-razão garante a integridade dos dados, consulte os artigos, Gerenciamento de digests e Verificação do banco de dados.

Em que local os dados de blocos e de transações de banco de dados são armazenados?

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

  • sys.database_ledger_transactions: mantém uma linha com as informações de cada transação no ledger do banco de dados. As informações incluem a ID do bloco ao qual essa transação pertence e o ordinal da transação dentro do bloco.
  • sys.database_ledger_blocks: mantém uma linha para cada bloco do ledger, incluindo a raiz da árvore de Merkle das transações contidas no bloco e o hash do bloco anterior para formar uma blockchain.

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

SELECT * FROM sys.database_ledger_transactions;
GO

SELECT * FROM sys.database_ledger_blocks;
GO

O exemplo a seguir de uma tabela de livro-razão consiste em quatro transações que compuseram um bloco na blockchain do livro-razão do banco de dados:

Captura de tela de uma tabela de livro-razão de exemplo.

Permissões

A visualização do ledger do banco de dados requer a permissão VIEW LEDGER CONTENT. Para obter detalhes sobre as permissões relacionadas às tabelas do razão, confira Permissões.