【发布时间】:2021-09-29 21:56:36
【问题描述】:
我在 SQL Server 中有一个表,其中包含所有数据的快照,以跟踪源表 tbl_D_project 的状态变化。如果此状态发生变化或在tbl_D_project 中添加了新记录,则应启动触发器并将该行复制到快照表中。
我根据在这里找到的另一个问题编写了两个触发器。一个触发器用于更新,一个触发器用于插入。我的问题是:
-
有没有更有效的方法?我可以以某种方式将两者合二为一,所以插入后更新?
-
多个用户同时提交数据。数据在插入的表中保留多长时间?有没有可能如果两个用户提交数据,触发器会被触发两次,所以行会被复制两次到快照表中?
更新触发后:
ALTER TRIGGER [dbo].[tr_copysnapshot_update]
ON [CDB].[dbo].[tbl_D_project]
AFTER UPDATE
AS
BEGIN
SET NOCOUNT ON
INSERT INTO cbdbpc.dbo.[Snapshot_tbl_D_project]
(Snapshot_date, Opp_ID, Reference_ID, Project_ID, Project_opportunity, [State], [Status])
SELECT
GETDATE(), S.Opp_ID, S.Reference_ID, S.Project_ID,
S.Project_opportunity, S.[State], S.[Status]
FROM
cbdbpc.dbo.[tbl_D_project] S
INNER JOIN
Inserted I ON s.opp_id = I.Opp_ID
INNER JOIN
Deleted D ON s.opp_ID = D.Opp_ID
WHERE
D.[Status] <> I.[Status]
END
插入触发器后:
ALTER TRIGGER [dbo].[tr_copysnapshot_insert]
ON [CBD].[dbo].[tbl_D_project]
AFTER INSERT
AS
BEGIN
SET NOCOUNT ON
INSERT INTO cbdbpc.dbo.[Snapshot_tbl_D_project]
(Snapshot_date, Opp_ID, Reference_ID, Project_ID,
Project_opportunity, [State], [Status])
SELECT
GETDATE(), S.Opp_ID, S.Reference_ID, S.Project_ID,
S.Project_opportunity, S.[State], S.[Status]
FROM
cbdbpc.dbo.[tbl_D_project] S
INNER JOIN
Inserted I ON s.opp_id = I.Opp_ID
WHERE
S.[Opp_ID] = I.[Opp_ID]
END
【问题讨论】:
标签: sql sql-server triggers