Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Aplica-se a: SQL Server 2022 (16.x) e versões posteriores
Banco de Dados SQL do Azure
Instâ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.
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:
- Aproximadamente a cada 30 segundos, quando seu banco de dados está configurado para armazenamento automático do resumo do banco de dados
- Quando o usuário gera manualmente um resumo do banco de dados ao executar o procedimento armazenado sys.sp_generate_database_ledger_digest
- Quando ele contém 100 mil transações.
Quando um bloco for fechado, novas transações serão inseridas em um novo bloco. Em seguida, o processo de geração de blocos:
- 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.
- Computa a raiz da árvore de Merkle sobre essas transações e o hash do bloco anterior.
- 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.
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:
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.