Créer et utiliser des tables de registre pouvant être mises à jour
S’applique à : SQL Server 2022 (16.x)base de données Azure SQL Azure SQL Managed Instance
Cet article explique comment créer une table de registre pouvant être mise à jour. Ensuite, vous insérerez des valeurs dans votre table de registre pouvant être mise à jour, puis mettrez les données à jour. Enfin, vous visualiserez les résultats en utilisant l’affichage du registre. Nous utiliserons l’exemple d’une application bancaire qui suit le solde des comptes de ses clients. Notre exemple vous donne un aperçu pratique de la relation entre la table de registre pouvant être mise à jour et la table d’historique correspondante et la vue du registre correspondantes.
Prérequis
Créer une table de registre pouvant être mise à jour
Nous allons créer une table de solde de compte avec le schéma suivant.
Nom de la colonne | Type de données | Description |
---|---|---|
CustomerID | int | ID client - Clé primaire en cluster |
LastName | varchar (50) | Nom du client |
FirstName | varchar (50) | Prénom du client |
Solde | decimal (10,2) | Solde du compte |
Utilisez SQL Server Management Studio ou Azure Data Studio pour créer un schéma et une table appelés
[Account].[Balance]
.CREATE SCHEMA [Account]; GO CREATE TABLE [Account].[Balance] ( [CustomerID] INT NOT NULL PRIMARY KEY CLUSTERED, [LastName] VARCHAR (50) NOT NULL, [FirstName] VARCHAR (50) NOT NULL, [Balance] DECIMAL (10,2) NOT NULL ) WITH ( SYSTEM_VERSIONING = ON (HISTORY_TABLE = [Account].[BalanceHistory]), LEDGER = ON );
Remarque
La spécification de l’argument
LEDGER = ON
est facultative si vous avez activé une base de données du registre lorsque vous avez créé votre base de données.Lors de la création de la table de registre pouvant être mise à jour, la table d’historique et la vue du registre correspondantes sont également créées. Exécutez les commandes T-SQL suivantes pour afficher la nouvelle table et la nouvelle vue.
SELECT ts.[name] + '.' + t.[name] AS [ledger_table_name] , hs.[name] + '.' + h.[name] AS [history_table_name] , vs.[name] + '.' + v.[name] AS [ledger_view_name] FROM sys.tables AS t JOIN sys.tables AS h ON (h.[object_id] = t.[history_table_id]) JOIN sys.views v ON (v.[object_id] = t.[ledger_view_id]) JOIN sys.schemas ts ON (ts.[schema_id] = t.[schema_id]) JOIN sys.schemas hs ON (hs.[schema_id] = h.[schema_id]) JOIN sys.schemas vs ON (vs.[schema_id] = v.[schema_id]) WHERE t.[name] = 'Balance';
Insérez le nom de
Nick Jones
en tant que nouveau client avec un solde d’ouverture de 50 USD.INSERT INTO [Account].[Balance] VALUES (1, 'Jones', 'Nick', 50);
Insérez les noms de
John Smith
,Joe Smith
etMary Michaels
en tant que nouveaux clients avec des soldes d’ouverture de 500 USD, 30 USD et 200 USD respectivement.INSERT INTO [Account].[Balance] VALUES (2, 'Smith', 'John', 500), (3, 'Smith', 'Joe', 30), (4, 'Michaels', 'Mary', 200);
Affichez la table de registre pouvant être mise à jour
[Account].[Balance]
et spécifiez les colonnes GENERATED ALWAYS ajoutées à la table.SELECT [CustomerID] ,[LastName] ,[FirstName] ,[Balance] ,[ledger_start_transaction_id] ,[ledger_end_transaction_id] ,[ledger_start_sequence_number] ,[ledger_end_sequence_number] FROM [Account].[Balance];
Dans la fenêtre des résultats, vous verrez d’abord les valeurs insérées par vos commandes T-SQL, ainsi que les métadonnées système utilisées pour la traçabilité des données.
La colonne
ledger_start_transaction_id
indique l’ID de transaction unique associé à la transaction qui a inséré les données. CommeJohn
,Joe
etMary
ont été insérés lors de la même transaction, ils partagent le même ID de transaction.La colonne
ledger_start_sequence_number
indique l’ordre dans lequel les valeurs ont été insérées par la transaction.
Mettez à jour le solde de
Nick
de50
à100
.UPDATE [Account].[Balance] SET [Balance] = 100 WHERE [CustomerID] = 1;
Affichez l’affichage des registres
[Account].[Balance]
, ainsi que l’affichage système des registres de transactions pour identifier les utilisateurs qui ont apporté les modifications.SELECT t.[commit_time] AS [CommitTime] , t.[principal_name] AS [UserName] , l.[CustomerID] , l.[LastName] , l.[FirstName] , l.[Balance] , l.[ledger_operation_type_desc] AS Operation FROM [Account].[Balance_Ledger] l JOIN sys.database_ledger_transactions t ON t.transaction_id = l.ledger_transaction_id ORDER BY t.commit_time DESC;
Conseil
Nous vous recommandons d’interroger l’historique des modifications à l’aide de la vue du registre et non de la table d’historique.
Le solde du compte de
Nick
a été mis à jour avec succès dans la table de registre pouvant être mise à jour avec la valeur100
.
La vue du registre indique que la mise à jour de la table du registre est une opérationDELETE
sur la ligne d’origine contenant50
. Le solde avec l’opérationINSERT
correspondante d’une nouvelle ligne contenant100
montre le nouveau solde deNick
.
autorisations
La création de tables de registre actualisables nécessite l’autorisation ENABLE LEDGER
. Pour plus d’informations sur les autorisations associées aux tables du registre, consultez Autorisations.