sql-server - 时态表可以对插入进行历史记录吗?
问题描述
我创建了以下临时表
/*
ALTER TABLE [dbo].________Test SET ( SYSTEM_VERSIONING = OFF)
GO
DROP TABLE dbo.________Test
GO
DROP TABLE dbo.________TestHistory
GO
*/
CREATE TABLE dbo.________Test
(
DeptID INT NOT NULL PRIMARY KEY CLUSTERED
, DeptName VARCHAR(50) NOT NULL
, ManagerID INT NULL
, ParentDeptID INT NULL
, SysStartTime DATETIME2 GENERATED ALWAYS AS ROW START NOT NULL
, SysEndTime DATETIME2 GENERATED ALWAYS AS ROW END NOT NULL
, PERIOD FOR SYSTEM_TIME (SysStartTime, SysEndTime)
-- ) WITH (SYSTEM_VERSIONING = ON);
) WITH (SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.________TestHistory));
现在我可以插入、更新和删除值。
但是这些值只会在更新或删除时被历史化。
有没有办法历史化插入语句?
我想避免为此编写触发器,如果可能的
话......将数据放在两个表中是非常不利的,因为我需要先创建一个联合,然后错过之后创建的任何字段,或者我如果我使用 SELECT * 并创建联合视图,则可能有垃圾列,如果列顺序被更改,而且新列也会丢失。
嗯,那些临时表似乎真的很愚蠢(制作)......
显然,即使数据没有变化,它们也会记录每一个潜在的变化。
所以我可以这样做:
CREATE TRIGGER TR_________Test_AfterInsert ON dbo.________Test
AFTER INSERT
AS
BEGIN
UPDATE dbo.________Test
SET DeptID = DeptID
WHERE DeptID IN
(
SELECT DeptID
FROM inserted
)
END
并且条目将在插入后迅速被历史化。
另一方面,这很好,从那时起我就不必手动将表模式与历史表模式同步。
解决方案
推荐阅读
- node.js - 如何访问通过快速中间件中的下一个参数发送的数据
- python - 当无法注释时,为什么 mypy 会抱怨列表理解?
- c++ - '非标准语法;使用 '&' 创建指向成员的指针' 与线程
- node.js - 节点 JS:填充自动增量字段(猫鼬)
- vue.js - 使用 Require JS 将 vuetify 添加到我的项目中?
- asp.net-core - Entity Framework Core 不会创建 Identity 和其他表 MVC Code First
- python - 遍历文件但按创建时间排序
- sql - 根据 Postgres 10 中 JSON 的特定值做 UPSERT
- python - 如何从 for 循环中删除项目?
- javascript - Vue 故事书意外的令牌 (3:14)