【发布时间】:2013-12-11 15:23:58
【问题描述】:
如何将多行处理为更新触发器/如何修改我的实际触发器以具有当前行为?如果我只更新一行效果很好,但如果我同时更新多行我会收到错误:
消息 512,级别 16,状态 1,过程 TriggerUpdateAdvert,第 9 行
子查询返回超过 1 个值。当子查询跟随 =、!=、、>= 或子查询用作表达式时,这是不允许的。
这是我的触发器:
ALTER TRIGGER dbo.TriggerUpdateAdvert
ON dbo.Advert FOR UPDATE
AS
DECLARE @OldStatus INT;
DECLARE @NewStatus INT;
DECLARE @ID UNIQUEIDENTIFIER;
SET @ID=(SELECT I.ID_Advert FROM INSERTED I);
PRINT @ID
SET @OldStatus=(SELECT D.Status FROM DELETED D WHERE D.ID_Advert=@ID);
SET @NewStatus=(SELECT I.Status FROM INSERTED I WHERE I.ID_Advert=@ID);
IF(@OldStatus!=@NewStatus)
BEGIN
print @OldStatus
print @NewStatus
IF(@NewStatus=1 or @NewStatus=3)
BEGIN
UPDATE Advert SET Published_Date=GETDATE() WHERE ID_Advert=@ID
END
END
GO
编辑:
我创建了下一个代码:
UPDATE A
SET A.Published_Date=GETDATE()
FROM Advert A
INNER JOIN Inserted I ON A.ID_Advert=I.ID_Advert
INNER JOIN Deleted D ON D.ID_Advert=A.ID_Advert
WHERE I.Status!=D.Status AND (I.Status IN (1,3) AND D.Status NOT IN (1,3))
你有什么想法吗?
【问题讨论】:
-
您的主要缺陷是您假设触发器将每行调用一次 - 它不是!它将被调用每个语句一次,
Inserted伪表可以包含多行 - 所以在这种情况下 - 你在这里选择多行中的哪一个???SET @ID=(SELECT I.ID_Advert FROM INSERTED I);....您需要重写您的触发器以考虑多行并适当地处理它们!
标签: sql-server tsql triggers sql-update