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:
-
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).
-
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.
- Chỉ cho phép
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
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
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
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
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
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
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
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
SELECT * FROM Accounts;
SELECT * FROM Transactions;
Bước 6 – Khám Phá Lịch Sử Ledger
Tìm Bảng Lịch Sử
sql
SELECT name
FROM sys.tables
WHERE name LIKE 'mssql_ledger_history_for_Accounts%';
Truy Vấn Lịch Sử Ghi Chép
sql
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
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
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”.