Membuat dan menggunakan tabel ledger yang dapat diperbarui

Berlaku untuk: SQL Server 2022 (16.x) Azure SQL DatabaseAzure SQL Managed Instance

Artikel ini memperlihatkan kepada Anda cara membuat tabel ledger yang dapat diperbarui. Berikutnya, Anda akan menyisipkan nilai dalam tabel ledger yang dapat diperbarui, lalu memperbarui data. Terakhir, Anda akan melihat hasilnya dengan menggunakan tampilan ledger. Kami akan menggunakan contoh aplikasi perbankan yang melacak saldo nasabah perbankan di rekening mereka. Contoh kami akan memberi Anda pandangan praktis tentang hubungan antara tabel ledger yang dapat diperbarui dan tabel riwayat serta tampilan ledger yang sesuai.

Prasyarat

Membuat tabel ledger yang dapat diperbarui

Kami akan membuat tabel saldo rekening dengan skema berikut.

Nama kolom Jenis data Deskripsi
CustomerID int ID Nasabah - Kluster kunci primer
LastName varchar (50) Nama belakang nasabah
FirstName varchar (50) Nama depan nasabah
Saldo desimal (10,2) Saldo rekening
  1. Gunakan SQL Server Management Studio atau Azure Data Studio untuk membuat skema dan tabel baru yang disebut [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
    );
    

    Catatan

    LEDGER = ON Menentukan argumen bersifat opsional jika Anda mengaktifkan database ledger saat membuat database Anda.

  2. Saat tabel ledger yang dapat diperbarui dibuat, tabel riwayat dan tampilan ledger yang sesuai juga dibuat. Jalankan perintah T-SQL berikut ini untuk melihat tabel baru dan tampilan baru.

    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';
    

    Screenshot that shows querying new ledger tables.

  3. Masukkan nama Nick Jones sebagai nasabah baru dengan saldo awal sebesar $50.

    INSERT INTO [Account].[Balance]
    VALUES (1, 'Jones', 'Nick', 50);
    
  4. Masukkan nama John Smith, Joe Smith, dan Mary Michaels sebagai nasabah baru dengan saldo awal masing-masing $500, $30, dan $200.

    INSERT INTO [Account].[Balance]
    VALUES (2, 'Smith', 'John', 500),
    (3, 'Smith', 'Joe', 30),
    (4, 'Michaels', 'Mary', 200);
    
  5. Tampilkan tabel ledger [Account].[Balance] yang dapat diperbarui dan sebutkan kolom GENERATED ALWAYS yang ditambahkan ke tabel.

    SELECT [CustomerID]
       ,[LastName]
       ,[FirstName]
       ,[Balance]
       ,[ledger_start_transaction_id]
       ,[ledger_end_transaction_id]
       ,[ledger_start_sequence_number]
       ,[ledger_end_sequence_number]
     FROM [Account].[Balance];  
    

    Di jendela hasil, Anda akan melihat terlebih dahulu nilai yang disisipkan oleh perintah T-SQL, bersama dengan metadata sistem yang digunakan untuk tujuan silsilah data.

    • Kolom ledger_start_transaction_id mencatat ID transaksi unik yang terkait dengan transaksi yang menyisipkan data. Karena John, Joe, dan Mary disisipkan menggunakan transaksi yang sama, mereka memiliki ID transaksi yang sama.

    • Kolom ledger_start_sequence_number mencatat urutan nilai yang disisipkan oleh transaksi.

      Screenshot that shows ledger table example 1.

  6. Perbarui saldo Nick dari 50 ke 100.

    UPDATE [Account].[Balance] SET [Balance] = 100
    WHERE [CustomerID] = 1;
    
  7. [Account].[Balance] Lihat tampilan ledger, bersama dengan tampilan sistem ledger transaksi untuk mengidentifikasi pengguna yang membuat perubahan.

     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;
    

    Tip

    Kami menyarankan agar Anda meminta kueri untuk riwayat perubahan melalui tampilan ledger, bukan tabel riwayat.

    Saldo rekening Nick telah berhasil diperbarui dalam tabel ledger yang dapat diperbarui menjadi 100.
    Tampilan ledger menunjukkan bahwa pembaruan tabel ledgernya adalah DELETE baris asli dengan saldo 50. Saldo dengan INSERT baris baru yang sesuai dengan saldo 100 menunjukkan saldo baru untuk Nick.

    Screenshot that shows ledger table example 3.

Izin

Membuat tabel ledger yang dapat diperbarui memerlukan ENABLE LEDGER izin. Untuk informasi tentang izin yang terkait dengan tabel ledger, lihat Izin.