Tables de registre avec ajout uniquement
S’applique à : SQL Server 2022 (16.x)base de données Azure SQL Azure SQL Managed Instance
Les tables de registre en ajout seul autorisent seulement les opérations INSERT
sur vos tables, qui garantissent que les utilisateurs privilégiés, par exemple les administrateurs de base de données, ne peuvent pas modifier les données à l’aide d’opérations de langage de manipulation de données traditionnelles. Les tables de registre en ajout seul sont idéales pour les systèmes qui ne mettent pas à jour ou ne suppriment pas les enregistrements, par exemple les systèmes d’informations de sécurité et gestion d’événements ou les systèmes blockchain dans lesquels les données doivent être répliquées à partir du blockchain sur une base de données. Comme aucune opération UPDATE
ou DELETE
n’est effectuée sur une table en ajout seul, vous n’avez pas besoin de la table d’historique correspondante, contrairement aux tables de registre pouvant être mises à jour.
Vous pouvez créer une table de registre en ajout seul en spécifiant l’argument LEDGER = ON
dans votre instruction CREATE TABLE (Transact-SQL) avec l’option APPEND_ONLY = ON
.
Important
Une fois qu’une table a été créée comme table de registre, elle ne peut pas être redéfinie comme table sans fonctionnalités de registre. En conséquence, un attaquant ne pourra pas temporairement supprimer les fonctionnalités de registre, effectuer des changements, puis réactiver les fonctionnalités de registre.
Schéma de la table de registre d’ajout uniquement
Une table d’ajout uniquement doit avoir les colonnes GENERATED ALWAYS suivantes qui contiennent des métadonnées indiquant les transactions qui ont modifié la table et l’ordre des opérations par lesquelles les lignes ont été mises à jour par la transaction. Quand vous créez une table de registre en ajout seul, des colonnes GENERATED ALWAYS
sont créées dans votre table de registre. Ces données sont utiles pour comprendre comment les données ont été insérées au fil du temps.
Si vous ne spécifiez pas les définitions des colonnes GENERATED ALWAYS
dans l’instruction CREATE TABLE, le système les ajoute automatiquement, en utilisant les noms par défaut suivants.
Nom de colonne par défaut | Type de données | Description |
---|---|---|
ledger_start_transaction_id | bigint | ID de la transaction qui a créé une version de ligne |
ledger_start_sequence_number | bigint | Numéro de séquence d’une opération au sein d’une transaction qui a créé une version de ligne |
Vue de registre
Pour chaque table de registre d’ajout uniquement, le système génère automatiquement une vue, appelée vue de registre. La vue de registre indique toutes les insertions de ligne qui se sont produites sur la table. La vue de registre est principalement utile pour les tables de registre pouvant être mises à jour, plutôt que pour les tables de registre en ajout seul, car ces dernières n’ont pas de fonctionnalités UPDATE
ou DELETE
. La vue de registre des tables de registre d’ajout uniquement est disponible pour assurer la cohérence entre les tables de registre d’ajout uniquement et les tables pouvant être mises à jour.
Schéma de vue du registre
Remarque
Les noms des colonnes de la vue du registre peuvent être personnalisés quand vous créez la table à l’aide du paramètre <ledger_view_option>
avec l’instruction CREATE TABLE (Transact-SQL). Pour plus d’informations, consultez Options de la vue de registre et les exemples correspondants dans CREATE TABLE (Transact-SQL).
Nom de colonne par défaut | Type de données | Description |
---|---|---|
ledger_transaction_id | bigint | ID de la transaction qui a créé ou supprimé une version de ligne. |
ledger_sequence_number | bigint | Numéro de séquence d’une opération au niveau des lignes dans la transaction sur la table. |
ledger_operation_type | tinyint | Contient 1 (INSERT) ou 2 (DELETE). L’insertion d’une ligne dans la table de registre produit une nouvelle ligne dans la vue de registre qui contient 1 dans cette colonne. La suppression d’une ligne de la table de registre produit une nouvelle ligne dans la vue de registre qui contient 2 dans cette colonne. La mise à jour d’une ligne dans la table de registre produit deux nouvelles lignes dans la vue de registre. Une ligne qui contient 2 (DELETE) et une autre ligne qui contient 1 (INSERT) dans cette colonne. Une opération DELETE ne doit pas avoir lieu sur une table de registre en ajout seul. |
ledger_operation_type_desc | nvarchar(128) | Contient INSERT ou DELETE . Pour plus d’informations, consultez la ligne précédente. |