【问题标题】:Retrieve initial table in AFTER INSERT trigger SQL在 AFTER INSERT 触发器 SQL 中检索初始表
【发布时间】:2013-01-24 22:56:31
【问题描述】:

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

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 中。所以条件总是为真。你能帮我为什么会这样吗?有没有办法只检索没有新条目的初始表?谢谢!

【问题讨论】:

    标签: sql sql-server triggers insert


    【解决方案1】:

    您的触发器是表 Table1 上的 AFTER INSERT。如果您不希望在表中找到记录,则应为 BEFORE INSERT

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

    添加另一个接受 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
    

    【讨论】:

    • mssql 2005 中的前触发器是没有...所以插入后是不可能的?
    • 是的。不可能的。您可以使用 INSTEAD OF INSERT 触发器。似乎它受 sql 2005 支持。
    • 我使用 INSTEAD OF INSERT 触发器解决了我的问题。非常感谢。
    猜你喜欢
    • 2017-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-01
    • 1970-01-01
    • 2015-09-18
    • 2013-03-29
    • 2020-12-23
    相关资源
    最近更新 更多