O que é o razão do banco de dados?

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

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

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

  • Persistir a versão anterior da linha na tabela de histórico.
  • Atribuir a ID da transação e gerar um novo número de sequência, persistindo-os nas colunas do 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 razão faz isso estendendo os planos de consulta de DML (Linguagem de Manipulação de Dados) de todas as operações de inserção, atualização e exclusão direcionadas a tabelas de razão. 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 computa 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 esta tabela do razão. A raiz da árvore representa todas as atualizações e exclusões executadas por essa transação nesta tabela do razão. Se a transação atualizar várias tabelas, uma Árvore Merkle separada será mantida para cada tabela. A figura a seguir mostra um exemplo de uma Árvore Merkle armazenando as versões de linha atualizadas de uma tabela de 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.

Diagram that shows a Merkle Tree storing the updated row versions of a ledger table and the format used to serialize the rows

Para capturar o estado do banco de dados, o 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 razão (confira 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 da fila na memória e da exibição do 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 a cadeia de blocos única, essa operação é de thread único. 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.

Diagram that shows a Merkle Tree storing the transactions of a ledger table.

Para obter mais informações sobre como o razão fornece integridade de dados, confira os artigos Gerenciamento de hash e Verificação de 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 razão 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 no razão, incluindo a raiz da árvore de Merkle nas transações dentro do bloco e o hash do bloco anterior para formar um blockchain.

Para ver o razão do banco de dados, execute as instruções T-SQL a seguir no SQL Server Management Studio, Azure Data Studio ou Ferramentas do SQL Server Developer.

SELECT * FROM sys.database_ledger_transactions;
GO

SELECT * FROM sys.database_ledger_blocks;
GO

Veja a seguir um exemplo de uma tabela do razão que consiste em quatro transações que se tornaram um bloco no blockchain do razão do banco de dados:

Screenshot of an example ledger table.

Permissões

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