启用时态表需在SQL Server中创建带时间周期和系统版本控制的表,如CREATE TABLE Employees含ValidFrom、ValidTo及PERIOD FOR SYSTEM_TIME,并设置SYSTEM_VERSIONING=ON;在C#中通过Entity Framework Core使用FromSqlRaw执行FOR SYSTEM_TIME AS OF等语法查询历史数据,例如查2024年5月1日状态;适用于审计、合规等场景。

时态表(Temporal Table)是数据库中一种能自动保存数据历史记录的机制。它允许你查询某条数据在过去任意时间点的状态,而不需要手动编写触发器或历史表来追踪变更。SQL Server 从 2016 版本开始支持系统版本化时态表(System-Versioned Temporal Table),通过与一个“历史表”配合,主表只保存当前数据,历史表则由系统自动管理,存储所有旧版本记录。
时态表的关键特性包括:
包含两个时间字段:Valid From 和 Valid To,表示每条记录的有效时间段。由数据库引擎自动维护历史数据,插入、更新、删除操作都会被记录。可通过特定语法查询过去某个时间的数据状态。
如何在 SQL Server 中启用时态表?
创建时态表需要定义时间列并启用系统版本控制。例如:
CREATE TABLE Employees ( Id INT PRIMARY KEY, Name NVARCHAR(100), Position NVARCHAR(100), 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));
这样,每次修改 Employees 表的数据,旧版本会自动写入 EmployeesHistory 表。
在 C# 中如何查询历史数据?
你可以通过 Entity Framework Core 结合原始 SQL 查询来获取历史数据。EF Core 原生不直接支持时态表语法,但可以使用
FromSqlRaw
执行时态查询。
示例:查询某个员工在 2024 年 5 月 1 日的状态:
var date = new DateTime(2024, 5, 1);var historicalData = context.Employees.FromSqlRaw(@"SELECT * FROM Employees FOR SYSTEM_TIME AS OF {0}WHERE Id = 1", date).AsNoTracking().ToList();
说明:
FOR SYSTEM_TIME AS OF
是查询时态表的核心语法,返回指定时间点的数据。
AsNoTracking()
提高性能,因为历史数据通常只读。参数化查询防止 SQL 注入。
其他常用时态查询方式还包括:
FOR SYSTEM_TIME BETWEEN ... AND ...
:查询时间段内的所有版本。
FOR SYSTEM_TIME FROM ... TO ...
:类似 BETWEEN,但边界处理不同。
FOR SYSTEM_TIME ALL
:返回当前和所有历史数据。
实际应用场景建议
时态表适合用于审计、合规、数据恢复等场景。在 C# 项目中,可封装时态查询为通用方法:
public List GetEmployeeAtTime(int id, DateTime pointInTime){ return context.Employees .FromSqlRaw("SELECT * FROM Employees FOR SYSTEM_TIME AS OF {0} WHERE Id = {1}", pointInTime, id) .AsNoTracking() .ToList();}
确保数据库连接和上下文配置正确,并且目标表已启用系统版本控制。
基本上就这些。只要数据库设置好了时态表,C# 端用原生 SQL 查询就能灵活获取历史数据。
以上就是什么是数据库的时态表?在C#中如何查询历史数据?的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1439787.html
微信扫一扫
支付宝扫一扫