Pau*_*ick 5 sql-server temporal-tables sql-server-2019
实际问题: sql 2019 服务器中是否有任何东西(除了触发器之外)可以导致在临时表中更新单行时在历史表中插入多行?
背景: 我有一个名为 Candidate 的现有表,它没有计算列,也没有触发器。我实现版本控制如下:
ALTER TABLE dbo.Candidate
ADD BeginDate datetime2 GENERATED ALWAYS AS ROW START NOT NULL DEFAULT SYSUTCDATETIME(),
EndDate datetime2 GENERATED ALWAYS AS ROW END NOT NULL DEFAULT CAST('9999-12-31 23:59:59.9999999' AS datetime2),
PERIOD FOR SYSTEM_TIME (BeginDate,EndDate)
GO
ALTER TABLE dbo.Candidate
SET(SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.Candidate_History, DATA_CONSISTENCY_CHECK = ON))
Run Code Online (Sandbox Code Playgroud)
当我对表进行更新时,即使是单个列( update候选集 lastContacted = '2021-10-16 23:27:46.927' where id = 44999 )也会有多行添加到历史表中:
| BeginDate | EndDate |
| --------- | ------- |
| 2022-01-24 08:25:55.3718538 | 2022-01-24 08:30:37.9523200 |
| 2022-01-24 08:30:37.9523200 | 2022-01-24 08:30:37.9523200 |
| 2022-01-24 08:30:37.9523200 | 2022-01-24 08:30:38.1853066 |
| 2022-01-24 08:30:38.1853066 | 2022-01-24 08:30:38.1853066 |
| 2022-01-24 08:30:38.1853066 | 2022-01-24 08:30:38.3093140 |
| 2022-01-24 08:30:38.3093140 | 2022-01-24 08:30:38.3093140 |
| 2022-01-24 08:30:38.3093140 | 2022-01-24 08:30:38.4352868 |
| 2022-01-24 08:30:38.4352868 | 2022-01-24 08:30:38.4352868 |
Run Code Online (Sandbox Code Playgroud)
(最奇怪的是 BeginDate 和 EndDate 相同)
问题可能出在代码(.net 或某些库)中,而不是 SQL 中。在我陷入困境之前,我只是想知道: SQL Server 中是否有任何内容(我错过了一些设置)可能会导致单个问题除了触发器之外,更新表以将多行插入到历史记录中?
不,SQL Server 中没有任何东西可以从对临时表的单行修改生成多个历史表行。
\n事实上,您看到历史行的有效期为零,这意味着某些事物正在事务中对该行执行多次数据更改,如记录的那样(强调已添加):
\n\n\n\xe2\x84\xb9 注意
\n\n
FOR SYSTEM_TIME
过滤掉有效期为零的行 (SysStartTime
=SysEndTime
)。如果您在同一事务中对同一主键执行多次更新,则会生成这些行。
\n在这种情况下,时间查询仅显示事务之前的行版本以及事务之后变为实际的行版本。如果需要在分析中包含这些行,请直接查询历史表。
\n
在没有触发器的情况下,外部代码将向 SQL Server 提交多个数据更改。
\n 归档时间: |
|
查看次数: |
881 次 |
最近记录: |