O que é o razão do banco de dados?
Aplica-se a: SQL Server 2022 (16.x) Banco de Dados SQL do Azure Instâ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.
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:
- Aproximadamente a cada 30 segundos, quando seu banco de dados é configurado para armazenamento de hash automático do banco de dados
- Então, o usuário gera manualmente um código hash do banco de dados executando 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 da fila na memória e da exibição do 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 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.
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:
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.