Tables de registre avec ajout uniquement

S’applique à : SQL Server 2022 (16.x) Azure SQL DatabaseAzure 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.

Diagram that shows architecture of ledger tables.

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.