在AFTER INSERT触发器SQL中检索初始表

时间:2013-01-24 22:56:32

标签: sql sql-server triggers insert

我使用此代码检查新条目的元素是否等于先前插入数据的元素。

CREATE TRIGGER trig1 ON Table1

AFTER INSERT

AS

DECLARE trigcursor CURSOR FOR
SELECT Name FROM INSERTED

DECLARE @Name1 varchar(80)

OPEN trigcursor;

FETCH NEXT FROM trigcursor INTO @Name1

WHILE @@FETCH_STATUS = 0
BEGIN
IF EXISTS(SELECT * FROM Table1 WHERE Name= @Name1)
BEGIN 
    ...
    END
    FETCH NEXT FROM trigcursor INTO @Name1
END

问题在于,由于某种原因,新条目也存在于Table1表中,而不仅仅存在于INSERTED中。所以情况总是如此。你能帮助我为什么会这样吗?有没有办法只检索初始表而没有新条目?谢谢!

1 个答案:

答案 0 :(得分:1)

您的触发器AFTER INSERT位于表Table1上。如果您希望不在表中找到记录,那么它应该是BEFORE INSERT

替代方案:使用INSTEAD OF INSERT触发器。

OR

添加另一个接受null的列。将它设为数字列,以便快速。请勿在插件上插入任何值。然后,在AFTER INSERT TRIGGER中,该列为空的行是新的。列中填充的东西是旧的。 然后用值更新空列。

例如:添加列mark 插入后,查找名称:

SELECT * FROM Table1 WHERE Name= @Name1 and mark is not null

一旦你发现它之前是否存在,用某些东西更新所有内容:

update table1 set mark = 1 where mark is null