Sử Dụng Temporal Tables Trong SQL Server Với EF Core
Table Of Content
- 1. Giới Thiệu Về Temporal Tables
- Lợi Ích Của Temporal Tables
- 2. Cách Tạo Temporal Tables Trong SQL Server
- 3. Tích Hợp Temporal Tables Với Entity Framework Core
- 3.1. Cấu hình Entity Framework Core
- 3.2. Tạo Migration Và Cập Nhật Database
- 4. Truy Vấn Dữ Liệu Lịch Sử Với Temporal Tables
- 4.1. Truy vấn dữ liệu hiện tại
- 4.2. Truy vấn dữ liệu tại một thời điểm cụ thể
- 4.3. Truy vấn dữ liệu lịch sử
- 5. Xóa Và Cập Nhật Trong Temporal Tables
- 6. Khi Nào Nên Sử Dụng Temporal Tables?
- 7. Kết Luận
1. Giới Thiệu Về Temporal Tables
Temporal Tables là một tính năng mạnh mẽ của SQL Server giúp theo dõi sự thay đổi của dữ liệu theo thời gian. Khi sử dụng Temporal Tables, SQL Server tự động lưu trữ phiên bản lịch sử của dữ liệu khi có cập nhật hoặc xóa.
Lợi Ích Của Temporal Tables:
- Tự động lưu trữ lịch sử mà không cần viết thủ công các trigger hoặc bảng log.
- Truy vấn dữ liệu tại một thời điểm cụ thể (AS OF SYSTEM TIME) giúp phân tích dữ liệu trong quá khứ.
- Hỗ trợ phân tích dữ liệu thay đổi theo thời gian, đặc biệt hữu ích cho các báo cáo lịch sử.
- Cải thiện bảo mật dữ liệu bằng cách giữ lại lịch sử thay đổi và ngăn chặn mất mát dữ liệu do lỗi người dùng hoặc hệ thống.
- Tích hợp dễ dàng với Entity Framework Core, giúp các lập trình viên dễ dàng làm việc với dữ liệu lịch sử mà không cần cấu hình quá phức tạp.
2. Cách Tạo Temporal Tables Trong SQL Server
Temporal Tables yêu cầu hai cột thời gian (StartTime
và EndTime
) để theo dõi thời điểm thay đổi của bản ghi. Các cột này sẽ được SQL Server tự động quản lý.
Ví dụ tạo bảng Products
với Temporal Tables:
1 2 3 4 5 6 7 8 9 |
CREATE TABLE Products ( Id INT PRIMARY KEY, Name NVARCHAR(100), Price DECIMAL(18,2), SysStartTime DATETIME2 GENERATED ALWAYS AS ROW START, SysEndTime DATETIME2 GENERATED ALWAYS AS ROW END, PERIOD FOR SYSTEM_TIME (SysStartTime, SysEndTime) ) WITH (SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.ProductsHistory)); |
Việc kích hoạt SYSTEM_VERSIONING
cho phép SQL Server tự động lưu trữ phiên bản lịch sử của dữ liệu vào bảng lịch sử (ProductsHistory
).
3. Tích Hợp Temporal Tables Với Entity Framework Core
3.1. Cấu hình Entity Framework Core
Trong EF Core, chúng ta cần định nghĩa entity model tương ứng với Products
. Điều này giúp EF Core hiểu được cấu trúc của bảng và cho phép truy vấn dữ liệu dễ dàng.
1 2 3 4 5 6 7 8 9 |
public class Product { public int Id { get; set; } public string Name { get; set; } public decimal Price { get; set; } public DateTime SysStartTime { get; set; } public DateTime SysEndTime { get; set; } } |
Trong DbContext
, ta có thể cấu hình bảng với Temporal Tables bằng cách sử dụng API Fluent:
1 2 3 4 5 6 7 8 9 10 11 12 |
protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<Product>() .ToTable("Products", b => b.IsTemporal( t => { t.HasPeriodStart("SysStartTime"); t.HasPeriodEnd("SysEndTime"); t.UseHistoryTable("ProductsHistory"); } )); } |
3.2. Tạo Migration Và Cập Nhật Database
Chạy lệnh sau để tạo migration:
1 2 |
dotnet ef migrations add AddTemporalTables |
Sau đó, cập nhật database:
1 2 |
dotnet ef database update |
Lệnh này sẽ đảm bảo rằng bảng Products
được tạo với Temporal Tables và có thể sử dụng ngay trong ứng dụng.
4. Truy Vấn Dữ Liệu Lịch Sử Với Temporal Tables
4.1. Truy vấn dữ liệu hiện tại
EF Core tự động lấy dữ liệu từ bảng chính (Products
):
1 2 |
var products = await _context.Products.ToListAsync(); |
4.2. Truy vấn dữ liệu tại một thời điểm cụ thể
1 2 |
SELECT * FROM Products FOR SYSTEM_TIME AS OF '2024-01-01 00:00:00' |
Trong EF Core, hiện tại không có API chính thức để truy vấn dữ liệu lịch sử, nhưng bạn có thể sử dụng SQL raw:
1 2 3 4 |
var historicalData = _context.Products .FromSqlRaw("SELECT * FROM Products FOR SYSTEM_TIME AS OF '2024-01-01 00:00:00'") .ToList(); |
4.3. Truy vấn dữ liệu lịch sử
Lấy toàn bộ lịch sử của một sản phẩm:
1 2 |
SELECT * FROM Products FOR SYSTEM_TIME ALL WHERE Id = 1 |
Lấy lịch sử trong một khoảng thời gian:
1 2 |
SELECT * FROM Products FOR SYSTEM_TIME BETWEEN '2024-01-01' AND '2024-02-01' |
5. Xóa Và Cập Nhật Trong Temporal Tables
Temporal Tables không cho phép xóa trực tiếp dữ liệu lịch sử. Nếu cần, bạn phải tắt chế độ SYSTEM_VERSIONING
trước:
1 2 3 4 |
ALTER TABLE Products SET (SYSTEM_VERSIONING = OFF); DELETE FROM ProductsHistory WHERE Id = 1; ALTER TABLE Products SET (SYSTEM_VERSIONING = ON); |
Hơn nữa, bạn có thể cập nhật dữ liệu mà không ảnh hưởng đến lịch sử bằng cách sử dụng các thao tác tiêu chuẩn trong EF Core:
1 2 3 4 5 6 7 |
var product = await _context.Products.FindAsync(1); if (product != null) { product.Price = 200.00m; await _context.SaveChangesAsync(); } |
6. Khi Nào Nên Sử Dụng Temporal Tables?
- Khi cần lưu lại lịch sử thay đổi dữ liệu mà không cần sử dụng trigger hoặc bảng log thủ công.
- Khi cần truy vấn lại dữ liệu tại một thời điểm quá khứ để phân tích hoặc khôi phục dữ liệu.
- Khi muốn tăng tính bảo mật và kiểm soát dữ liệu lịch sử mà không ảnh hưởng đến dữ liệu hiện tại.
- Khi muốn giảm chi phí bảo trì hệ thống bằng cách tận dụng chức năng tự động của SQL Server thay vì viết mã tùy chỉnh.
7. Kết Luận
Temporal Tables trong SQL Server kết hợp với EF Core giúp lưu trữ và truy vấn dữ liệu lịch sử một cách dễ dàng. Điều này giúp bạn dễ dàng theo dõi sự thay đổi dữ liệu theo thời gian mà không cần cấu hình phức tạp.
Bạn có thể áp dụng Temporal Tables trong nhiều tình huống như hệ thống kế toán, quản lý đơn hàng, hoặc bất kỳ hệ thống nào yêu cầu theo dõi thay đổi dữ liệu theo thời gian. Việc tích hợp với EF Core giúp đơn giản hóa quản lý dữ liệu, đồng thời mang lại hiệu suất và độ tin cậy cao hơn cho ứng dụng của bạn.
No Comment! Be the first one.