Sql-Server

臨時表:每次更新多次插入?

  • January 24, 2022

實際問題: sql 2019 server(除了觸發器)中是否有任何東西可以導致在時態表中更新單行時在歷史表中插入多行?

背景: 我有一個名為 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))

當我對錶進行更新時,即使是單列(更新候選集 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 |

(最奇怪的是當 Begindate 和 EndDate 相同時)

問題可能出在某處的程式碼(.net 或某個庫)中,而不是 SQL 在我進入兔子洞之前,我只想知道: SQL 伺服器中是否有任何東西(我錯過了一些設置)可能導致單個除了觸發器之外,更新表以將多行插入歷史記錄?

不,SQL Server 中沒有任何東西會從單行修改到臨時表生成多個歷史表行。

您看到的歷史記錄行的有效期為零這一事實意味著某些事情正在事務中對該行執行多個數據更改,如文件所述(強調添加):

ℹ 注意

FOR SYSTEM_TIME過濾掉有效期為零的行 ( SysStartTime= SysEndTime)。

如果您在同一事務中對同一主鍵執行多次更新,則會生成這些行。

在這種情況下,時間查詢僅顯示事務之前的行版本和事務之後變為實際的行版本。如果您需要在分析中包含這些行,請直接查詢歷史表。

在沒有觸發器的情況下,外部程式碼正在向 SQL Server 送出多個數據更改。

引用自:https://dba.stackexchange.com/questions/306487