Creare e usare tabelle del libro mastro aggiornabili
Si applica a: SQL Server 2022 (16.x) Database Azure SQL Istanza gestita di SQL di Azure
Questo articolo spiega come creare una tabella del libro mastro aggiornabile. Successivamente, verranno inseriti dei valori nella tabella del libro mastro aggiornabile e verranno eseguiranno aggiornamenti ai dati. Infine, verranno visualizzati i risultati usando la vista del libro mastro. Useremo un esempio di applicazione bancaria che tiene traccia dei saldi dei clienti nei propri conti. Nell'esempio viene esaminata in modo pratico la relazione tra la tabella del libro mastro aggiornabile e la tabella di cronologia corrispondente e la vista del libro mastro.
Prerequisiti
Creare una tabella del libro mastro aggiornabile
Verrà creata una tabella di saldo del conto con lo schema seguente.
Nome colonna | Tipo di dati | Descrizione |
---|---|---|
CustomerID | int | ID cliente - Chiave primaria in cluster |
LastName | varchar (50) | Customer Last Name |
FirstName | varchar (50) | Customer First Name |
Saldo | decimale (10,2) | Saldo del conto |
Usare SQL Server Management Studio o Azure Data Studio per creare un nuovo schema e una tabella denominata
[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 );
Nota
Specificare l'argomento
LEDGER = ON
è facoltativo se è stato abilitato un database del libro mastro al momento della creazione del database.Quando viene creata la tabella del libro mastro aggiornabile, vengono create anche la tabella di cronologia e la vista del libro mastro corrispondenti. Eseguire i comandi T-SQL seguenti per visualizzare la nuova tabella e la nuova vista.
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';
Inserire il nome
Nick Jones
come nuovo cliente con un saldo di apertura pari a $ 50.INSERT INTO [Account].[Balance] VALUES (1, 'Jones', 'Nick', 50);
Inserire rispettivamente i nomi
John Smith
,Joe Smith
eMary Michaels
come nuovi clienti con saldo di apertura pari a $ 500, $30 e $ 200.INSERT INTO [Account].[Balance] VALUES (2, 'Smith', 'John', 500), (3, 'Smith', 'Joe', 30), (4, 'Michaels', 'Mary', 200);
Visualizzare la tabella del libro mastro aggiornabile
[Account].[Balance]
e specificare le colonne GENERATED ALWAYS aggiunte alla tabella.SELECT [CustomerID] ,[LastName] ,[FirstName] ,[Balance] ,[ledger_start_transaction_id] ,[ledger_end_transaction_id] ,[ledger_start_sequence_number] ,[ledger_end_sequence_number] FROM [Account].[Balance];
Nella finestra dei risultati verranno prima visualizzati i valori inseriti dai comandi T-SQL, insieme ai metadati di sistema usati per scopi di derivazione dei dati.
Nella colonna
ledger_start_transaction_id
viene annotato l'ID di transazione univoco associato alla transazione che ha inserito i dati. Dato cheJohn
,Joe
eMary
sono stati inseriti usando la stessa transazione, condividono lo stesso ID di transazione.Nella colonna
ledger_start_sequence_number
viene annotato l'ordine di inserimento dei valori dalla transazione.
Aggiornare il saldo di
Nick
da50
a100
.UPDATE [Account].[Balance] SET [Balance] = 100 WHERE [CustomerID] = 1;
Visualizzare la vista del libro mastro
[Account].[Balance]
, insieme alla vista di sistema del libro mastro delle transazioni per identificare gli utenti che hanno apportato le modifiche.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;
Suggerimento
È consigliabile eseguire una query sulla cronologia delle modifiche tramite la vista del libro mastro e non la tabella di cronologia.
Il saldo del conto di
Nick
è stato aggiornato correttamente nella tabella del libro mastro aggiornabile in100
.
La vista del libro mastro mostra che l'aggiornamento della tabella del libro mastro è un'operazioneDELETE
sulle righe originali con50
. Il saldo con un'operazioneINSERT
corrispondente di una nuova riga con100
mostra il nuovo saldo perNick
.
Autorizzazioni
La creazione di tabelle del libro mastro aggiornabili richiede l'autorizzazione ENABLE LEDGER
. Per ulteriori informazioni sulle autorizzazioni necessarie per le tabelle del libro mastro, vedere Autorizzazioni.