Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Aplica-se a: SQL Server 2022 (16.x) e versões
posteriores Azure SQL Database
Azure 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.
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:
- Aproximadamente a cada 30 segundos, quando o banco de dados é configurado para armazenamento automático de resumo do banco de dados
- Quando o usuário gera manualmente um resumo do banco de dados executando o procedimento armazenado sys.sp_generate_database_ledger_digest
- Quando contém 100 mil transações.
Quando um bloco é fechado, novas transações serão inseridas em um novo bloco. O processo de geração de blocos, então:
- 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.
- Calcula a raiz da árvore Merkle sobre essas transações e o hash do bloco anterior.
- 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.
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:
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.