1

我需要创建一个更新触发器,它仅在我的记录状态与上次记录的状态不同时才有效。

所以我现在有这个:

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

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

4

3 回答 3

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()包装器进行简化,但我需要知道数据类型。

于 2011-07-22T17:57:45.433 回答
1

只需添加:

IF ((SELECT Status FROM Delted) <> SELECT Status FROM Inserted))
BEGIN
...
END
于 2011-07-22T17:51:07.000 回答
-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 语句并将它们放入迭代中以处理所有寄存器。

于 2011-07-22T17:52:07.910 回答