Qu’est-ce que le registre de base de données ?
S’applique à : SQL Server 2022 (16.x)base de données Azure SQL Azure SQL Managed Instance
Le registre de base de données fait partie de la fonctionnalité de registre. Le registre de base de données capture de façon incrémentielle l’état d’une base de données à mesure que celle-ci évolue, tandis que les mises à jour se produisent sur les tables de registre. Il utilise logiquement une blockchain et des structures de données d’arborescence Merkle.
Toutes les opérations qui mettent à jour une table de registre doivent effectuer des tâches supplémentaires pour gérer les données historiques et calculer les synthèses capturées dans le registre de base de données. Plus précisément, pour chaque ligne mise à jour, nous devons :
- Conserver la version antérieure de la ligne dans la table d’historique.
- Affecter l’ID de transaction et générer un nouveau numéro de séquence, en les conservant dans les colonnes système appropriées.
- Sérialiser le contenu de la ligne et l’inclure lors du calcul du hachage pour toutes les lignes mises à jour par cette transaction.
Le registre y parvient en étendant les plans de requête DML (langage de manipulation de données) de toutes les opérations d’insertion, de mise à jour et de suppression ciblant les tables de registre. L’ID de transaction et le numéro de séquence nouvellement généré sont définis pour la nouvelle version de la ligne. Ensuite, l’opérateur de plan de requête exécute une expression spéciale qui sérialise le contenu de la ligne et calcule son hachage, en l’ajoutant à une arborescence Merkle qui est stockée au niveau de la transaction et qui contient les hachages de toutes les versions de ligne mises à jour par cette transaction pour cette table de registre. La racine de l’arborescence représente toutes les mises à jour et suppressions effectuées par cette transaction dans cette table de registre. Si la transaction met à jour plusieurs tables, une arborescence Merkle distincte est conservée pour chaque table. La figure ci-dessous montre un exemple d’arborescence Merkle stockant les versions de lignes mises à jour d’une table de registre et le format utilisé pour sérialiser les lignes. Outre la valeur sérialisée de chaque colonne, nous incluons des métadonnées concernant le nombre de colonnes de la ligne, l’ordinal des colonnes individuelles, les types de données, les longueurs et d’autres informations qui affectent la façon dont les valeurs sont interprétées.
Pour capturer l’état de la base de données, le registre de base de données stocke une entrée pour chaque transaction. Il capture les métadonnées relatives à la transaction, telles que son horodatage de validation et l’identité de l’utilisateur qui l’a exécutée. Il capture également la racine de l’arborescence Merkle des lignes mises à jour dans chaque table de registre (voir ci-dessus). Ces entrées sont ensuite ajoutées à une structure de données inviolable pour permettre la vérification de l’intégrité à l’avenir. Un bloc est fermé :
- Environ toutes les 30 secondes, quand votre base de données est configurée pour le stockage automatique des synthèses de base de données.
- Quand l’utilisateur génère manuellement une synthèse de la base de données en exécutant la procédure stockée sys.sp_generate_database_ledger_digest.
- Quand il contient 100 000 transactions.
Lorsqu’un bloc est fermé, les nouvelles transactions sont insérées dans un nouveau bloc. Le processus de génération de bloc effectue alors les opérations suivantes :
- Il récupère toutes les transactions qui appartiennent au bloc fermé à partir de la file d’attente en mémoire et de la vue catalogue système sys.database_ledger_transactions.
- Il calcule la racine de l’arborescence Merkle sur ces transactions et le hachage du bloc précédent.
- Il rend persistant le bloc fermé dans la vue catalogue système sys.database_ledger_blocks.
Étant donné qu’il s’agit d’une mise à jour de table ordinaire, sa durabilité est automatiquement garantie par le système. Pour conserver la chaîne unique de blocs, cette opération est à thread unique. Mais elle est également efficace, car elle calcule uniquement les hachages sur les informations de transaction et se produit de façon asynchrone. Elle n’affecte pas les performances des transactions.
Pour plus d’informations sur la façon dont le registre fournit l’intégrité des données, consultez les articles Gestion des synthèses et Vérification de base de données.
Où sont stockées les transactions de la base de données et les données des blocs ?
Les données relatives aux transactions et aux blocs sont stockées physiquement sous forme de lignes dans deux vues catalogue système :
- sys.database_ledger_transactions : tient à jour une ligne avec les informations de chaque transaction dans le registre de base de données, notamment l’ID du bloc auquel cette transaction appartient et l’ordinal de la transaction dans le bloc.
- sys.database_ledger_blocks : tient à jour une ligne pour chaque bloc du registre, notamment la racine de l’arborescence Merkle sur les transactions au sein du bloc et le hachage du bloc précédent pour former une blockchain.
Pour afficher le registre de la base de données, exécutez les instructions T-SQL suivantes dans SQL Server Management Studio, Azure Data Studio ou Outils SQL Server Développeur.
SELECT * FROM sys.database_ledger_transactions;
GO
SELECT * FROM sys.database_ledger_blocks;
GO
L’exemple de table de registre suivant se compose de quatre transactions qui constituent un bloc dans la blockchain du registre de base de données :
autorisations
La consultation du registre de la base de données nécessite l’autorisation VIEW LEDGER CONTENT
. Pour plus d’informations sur les autorisations associées aux tables du registre, consultez Autorisations.