条件SQL触发器?

时间:2011-07-22 17:46:00

标签: sql sql-server sql-server-2008 sqltransaction

我需要创建一个更新触发器,只有当我的记录状态与记录的最后一个状态不同时才会起作用。

所以我现在就拥有这个:

    for UPDATE
AS 
begin try
INSERT INTO tblHistorySource(*)
select *
from [DELETED]
end try

但我需要shomehow检查是否 tblHistorySource.status不等于delete.status然后才复制数据....

3 个答案:

答案 0 :(得分:4)

您需要注意的是,您正在处理设置数据,而不是一次只处理一条记录:

INSERT INTO tblHistorySource
SELECT *
FROM DELETED INNER JOIN
     INSERTED ON <<DELETED.PK = INSERTED.PK>>
WHERE DELETED.StatusValue <> INSERTED.StatusValue;

联接条件<<DELETED.PK = INSERTED.PK>>需要适应您的架构,StatusValue的真实姓名也是如此。

如果StatusValue可以为空(感谢Alex),请改用:

WHERE DELETED.StatusValue <> INSERTED.StatusValue
   OR DELETED.StatusValue IS NULL AND INSERTED.StatusValue IS NOT NULL
   OR DELETED.StatusValue IS NOT NULL AND INSERTED.StatusValue IS NULL;

使用ISNULL()包装器可能会简化,但我需要知道数据类型。

答案 1 :(得分:1)

只需添加:

IF ((SELECT Status FROM Delted) <> SELECT Status FROM Inserted))
BEGIN
...
END

答案 2 :(得分:-2)

您可以这样做:

DECLARE @statusOldValue status_type
DECLARE @statusNewValue status_type

SELECT @statusOldValue = status FROM deleted

SELECT @statusNewValue= status FROM inserted

IF (@statusOldValue<>@statusNewValue) THEN
BEGIN
 -- Do what you want
END

如果您可能遇到同时更新多个寄存器的情况,那么您需要将WHERE子句放入SELECT语句并将它们放入迭代中以便处理所有寄存器。