SQL Server 系统版本控制临时表:行级“时间旅行”
组件 | 功能 | 存储内容 |
|---|---|---|
当前表(Current Table) | 提供实时业务访问 | 数据的最新状态及 ValidFrom 时间戳 |
历史表(History Table) | 自动审计与追溯 | 数据的所有历史修订版本及有效期 |
💡 换句话说,你的数据库就像开了“时间机器”,可以回到某一时刻查看或恢复数据。
-- 2. 创建当前表并启用系统版本控制CREATE TABLE dbo.Employees (ID INT PRIMARY KEY,Name NVARCHAR(50),Salary DECIMAL(10,2),ValidFrom DATETIME2 GENERATED ALWAYS AS ROW START,ValidTo DATETIME2 GENERATED ALWAYS AS ROW END,PERIOD FOR SYSTEM_TIME (ValidFrom, ValidTo))WITH (SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.EmployeesHistory));

INSERT INTO dbo.Employees (ID, Name, Salary) VALUES(101, '张三', 8000),(102, '李四', 9000),(103, '王五', 10000);
DELETE FROM dbo.Employees WHERE ID = 101;UPDATE dbo.EmployeesSET Salary = Salary * 0.8WHERE ID = 102;
SELECT *FROM dbo.EmployeesFOR SYSTEM_TIME AS OF '2026-04-02 09:53:45';

SELECT *FROM dbo.EmployeesFOR SYSTEM_TIME BETWEEN '2026-04-02 09:53:06' AND '2026-04-02 09:54:06';

INSERT INTO dbo.Employees (ID, Name, Salary)SELECT ID, Name, SalaryFROM dbo.EmployeesFOR SYSTEM_TIME AS OF '2026-04-02 09:53:45'WHERE ID = 101;
UPDATE eSET e.Salary = h.SalaryFROM dbo.Employees AS eJOIN dbo.Employees FOR SYSTEM_TIME AS OF '2026-04-02 09:54:06' AS hON e.ID = h.IDWHERE e.ID = 102;
注意:FOR SYSTEM_TIME AS OF 是查询历史表的关键,它保证你从历史版本取到的是准确时间点的数据。
阅读原文:https://mp.weixin.qq.com/s/dwlK1yV3VLM-t6YQSxnq9A