【发布时间】:2016-03-30 00:00:05
【问题描述】:
我想将一个表的内容复制到同一个数据库中的另一个表。
为此,我在源表上编写了触发器,该触发器在 AFTER INSERT UPDATE 上触发,表中有 2 个唯一标识符字段,它们基于 newid() 作为默认绑定生成值。基于这个唯一标识符,我正在检查记录是否存在于目标表中,如果存在则它将更新,如果不存在则将数据集插入表中。
问题是当我插入一条新记录时,触发器中的 INSERTED 为我提供了 uniqueidentifier 字段的 NULL 值。 在可能的情况下,只有一行被更新或插入,因此不使用游标。
下面是我的代码,我在@OriginalTable_MoveDataUID 和@OriginalTable_ProcedureUID 中得到空值。 MoveDataUID 和 ProcedureUID 都是唯一标识符文件。
请分享您的想法或任何替代方案。
ALTER TRIGGER [dbo].[spec_ref_movedata_procedures_ToUpdate]
ON [dbo].[spec_ref_movedata_procedures]
AFTER INSERT, UPDATE
AS
BEGIN
SET XACT_ABORT ON
BEGIN DISTRIBUTED TRANSACTION
DECLARE @OriginalTable_MoveDataUID NVarchar (100)
DECLARE @OriginalTable_ProcedureUID NVarchar (100)
DECLARE @PresentInHistoryYesNo int
SELECT @OriginalTable_MoveDataUID= MoveDataUID,@OriginalTable_ProcedureUID=ProcedureUID FROM INSERTED
-- inserted for checking purpose
INSERT INTO ERP_Test_NK_spec_ref_movedata_procedures_history_2 (MovedataUID,ProcedureUID) VALUES
(@OriginalTable_MoveDataUID,@OriginalTable_ProcedureUID)
SELECT @PresentInHistoryYesNo = count(*) from spec_ref_movedata_procedures_history WHERE MoveDataUID=@OriginalTable_MoveDataUID AND ProcedureUID=@OriginalTable_ProcedureUID
IF @PresentInHistoryYesNo = 0
BEGIN
-- insert opertions
print 'insert record'
END
ELSE IF @PresentInHistoryYesNo = 1
BEGIN
-- update opertions
print 'update record'
END
COMMIT TRANSACTION
SET XACT_ABORT OFF
END
【问题讨论】:
-
您的触发器有一个重大缺陷,即假定只有 1 行插入。这不是触发器在 sql server 中的工作方式。它们每次操作触发一次,而不是每行一次。您需要将其重写为基于集合的操作。
-
如果在同一个数据库中,则不需要
DISTRIBUTED事务。
标签: sql-server tsql triggers