0
0
Lập trình
Admin Team
Admin Teamtechmely

Hướng Dẫn Chi Tiết Về Bảng Ledger Trong SQL Server 2022

Đăng vào 7 tháng trước

• 4 phút đọc

Hướng Dẫn Chi Tiết Về Bảng Ledger Trong SQL Server 2022

Giới Thiệu

Đảm bảo tính toàn vẹn dữ liệu và kiểm tra không thể thay đổi là rất quan trọng trong các ứng dụng tài chính, chăm sóc sức khỏe và chính phủ. Từ SQL Server 2022, Microsoft đã giới thiệu Bảng Ledger, một tính năng giống như blockchain đảm bảo tính không thay đổi và chứng thực mật mã cho dữ liệu của bạn.

Với Ledger, mỗi thay đổi đều được liên kết mật mã và có thể xác minh, đảm bảo rằng không ai có thể thay đổi bí mật các bản ghi của bạn. Bài viết này sẽ khám phá chi tiết về Bảng Ledger với các kịch bản thực tế và mã SQL cụ thể trong một tình huống ngân hàng.


Các Loại Bảng Ledger

SQL Server hỗ trợ hai loại Bảng Ledger:

  1. Bảng Ledger Có Thể Cập Nhật

    • Lưu trữ dữ liệu hiện tại và một bảng lịch sử ẩn ghi lại mọi thay đổi.
    • Hỗ trợ các thao tác INSERT, UPDATE, và DELETE.
    • Thích hợp cho các hệ thống mà bản ghi phát triển nhưng cần có một đường dẫn kiểm tra không thể thay đổi (ví dụ: tài khoản ngân hàng).
  2. Bảng Ledger Chỉ Thêm

    • Chỉ cho phép INSERT.
    • Tuyệt vời cho việc ghi lại dữ liệu không thay đổi như giao dịch hoặc nhật ký kiểm tra.

Cấu Trúc Nội Bộ Của Ledger

  • Bảng Lịch Sử: Các bảng hệ thống ẩn (mssql_ledger_history_for_<TableName>_<GUID>) lưu trữ các phiên bản hàng với ID giao dịch.
  • Ledger Cơ Sở Dữ Liệu: Theo dõi các hàm băm cho tất cả các bảng ledger ở cấp độ cơ sở dữ liệu.
  • Hàm Băm: Một hàm băm mật mã có thể được xuất ra và xác minh sau để chứng minh rằng không có sự can thiệp nào xảy ra.

Bước 1 – Tạo Cơ Sở Dữ Liệu

sql Copy
CREATE DATABASE BankLedgerDemo;
GO
USE BankLedgerDemo;
GO

Bước 2 – Tạo Các Bảng Ledger

Tài Khoản (Bảng Ledger Có Thể Cập Nhật)

sql Copy
CREATE TABLE Accounts
(
    AccountId INT PRIMARY KEY,
    HolderName NVARCHAR(100),
    Balance DECIMAL(18,2) NOT NULL
)
WITH (LEDGER = ON (APPEND_ONLY = OFF));

Giao Dịch (Bảng Ledger Chỉ Thêm)

sql Copy
CREATE TABLE Transactions
(
    TransactionId INT PRIMARY KEY,
    FromAccountId INT NULL,
    ToAccountId INT NULL,
    Amount DECIMAL(18,2) NOT NULL,
    TransactionType NVARCHAR(20) NOT NULL, -- Nạp tiền, Rút tiền, Chuyển khoản
    CreatedAt DATETIME2 DEFAULT SYSUTCDATETIME()
)
WITH (LEDGER = ON (APPEND_ONLY = ON));

Bước 3 – Chèn Tài Khoản

sql Copy
INSERT INTO Accounts (AccountId, HolderName, Balance)
VALUES (1, N'Morteza', 1000.00),
       (2, N'Ali', 500.00);

Bước 4 – Thực Hiện Các Giao Dịch Ngân Hàng

Nạp Tiền

sql Copy
BEGIN TRAN;
    UPDATE Accounts
    SET Balance = Balance + 300
    WHERE AccountId = 1;

    INSERT INTO Transactions (TransactionId, ToAccountId, Amount, TransactionType)
    VALUES (1, 1, 300, 'Deposit');
COMMIT;

Rút Tiền

sql Copy
BEGIN TRAN;
    UPDATE Accounts
    SET Balance = Balance - 200
    WHERE AccountId = 1;

    INSERT INTO Transactions (TransactionId, FromAccountId, Amount, TransactionType)
    VALUES (2, 1, 200, 'Withdraw');
COMMIT;

Chuyển Khoản

sql Copy
BEGIN TRAN;
    UPDATE Accounts
    SET Balance = Balance - 150
    WHERE AccountId = 1;

    UPDATE Accounts
    SET Balance = Balance + 150
    WHERE AccountId = 2;

    INSERT INTO Transactions (TransactionId, FromAccountId, ToAccountId, Amount, TransactionType)
    VALUES (3, 1, 2, 150, 'Transfer');
COMMIT;

Bước 5 – Xem Dữ Liệu Hiện Tại

sql Copy
SELECT * FROM Accounts;
SELECT * FROM Transactions;

Bước 6 – Khám Phá Lịch Sử Ledger

Tìm Bảng Lịch Sử

sql Copy
SELECT name 
FROM sys.tables
WHERE name LIKE 'mssql_ledger_history_for_Accounts%';

Truy Vấn Lịch Sử Ghi Chép

sql Copy
SELECT AccountId, HolderName, Balance,
       ledger_start_transaction_id, ledger_end_transaction_id
FROM [mssql_ledger_history_for_Accounts_<GUID>]
WHERE AccountId = 1
ORDER BY ledger_start_transaction_id;

Bước 7 – Phát Hiện Thay Đổi Bản Ghi

Mỗi phiên bản hàng trong bảng lịch sử cho bạn biết cái gì đã thay đổi và khi nào. Ví dụ:

AccountId HolderName Balance ledger_start_transaction_id ledger_end_transaction_id
1 Morteza 1000.00 1 2
1 Morteza 1300.00 2 3
1 Morteza 1100.00 3 NULL

📌 Giải thích:

  • Số dư bắt đầu ở mức 1000.
  • Tăng lên 1300 sau khi nạp tiền.
  • Giảm xuống 1100 sau khi rút tiền.

Bước 8 – So Sánh Giá Trị Hiện Tại Và Lịch Sử

sql Copy
SELECT h.AccountId, h.Balance AS OldBalance, 
       a.Balance AS CurrentBalance,
       h.ledger_start_transaction_id, h.ledger_end_transaction_id
FROM [mssql_ledger_history_for_Accounts_<GUID>] h
JOIN Accounts a ON h.AccountId = a.AccountId
WHERE h.AccountId = 1;

Bước 9 – Tạo Hàm Băm (Chứng Thực)

sql Copy
EXEC sp_generate_database_ledger_digest;

Hàm băm mật mã này có thể được xuất sang bộ nhớ bên ngoài hoặc blockchain để xác minh độc lập.


Kết Luận

Bảng Ledger trong SQL Server mang lại tính không thay đổi giống như blockchain vào các cơ sở dữ liệu quan hệ truyền thống. Với Ledger, bạn có thể:

  • Ngăn chặn việc can thiệp dữ liệu nhạy cảm.
  • Chứng minh tính toàn vẹn dữ liệu với các kiểm toán viên, cơ quan quản lý, hoặc tòa án.
  • Xây dựng niềm tin trong các hệ thống tài chính và quan trọng.

Trong bài viết này, chúng ta đã triển khai một hệ thống ngân hàng với các giao dịch nạp tiền, rút tiền và chuyển khoản sử dụng Bảng Ledger và đã chứng minh cách theo dõi thay đổi bản ghi và tạo ra chứng thực mật mã.

Nếu bạn đang làm việc với SQL Server 2022 hoặc phiên bản cao hơn, Bảng Ledger là một tính năng rất đáng khám phá cho bất kỳ ứng dụng nào mà độ tin cậy dữ liệu là không thể thương lượng.

Tôi là Morteza Jangjoo và “Giải thích những gì tôi ước ai đó đã giải thích cho tôi”.

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào