首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >插入更新触发器如何确定Insert或Update

插入更新触发器如何确定Insert或Update
EN

Stack Overflow用户
提问于 2009-04-12 07:42:31
回答 19查看 566.1K关注 0票数 185

我需要在表A上编写一个Insert,Update触发器,它将删除表B中的所有行,这些行的一列(比如Desc)的值类似于表A的列(比如Col1)中插入/更新的值。我该如何编写它才能处理Update和Insert两种情况?如何确定触发器是为update还是insert执行的。

EN

回答 19

Stack Overflow用户

回答已采纳

发布于 2009-04-12 08:03:24

触发器有特殊的INSERTEDDELETED表来跟踪“之前”和“之后”的数据。所以你可以使用像IF EXISTS (SELECT * FROM DELETED)这样的东西来检测更新。在update时,您只在DELETED中有行,但在INSERTED中总是有行。

CREATE TRIGGER中查找"inserted“。

编辑,2011年11月23日

注释之后,此答案仅适用于INSERTEDUPDATED触发器。

显然,DELETE触发器不能像我上面所说的那样具有“INSERTED中的所有行”

票数 185
EN

Stack Overflow用户

发布于 2011-09-15 19:53:58

代码语言:javascript
复制
CREATE TRIGGER dbo.TableName_IUD
ON dbo.TableName
AFTER INSERT, UPDATE, DELETE
AS 
BEGIN
    SET NOCOUNT ON;

    --
    -- Check if this is an INSERT, UPDATE or DELETE Action.
    -- 
    DECLARE @action as char(1);

    SET @action = 'I'; -- Set Action to Insert by default.
    IF EXISTS(SELECT * FROM DELETED)
    BEGIN
        SET @action = 
            CASE
                WHEN EXISTS(SELECT * FROM INSERTED) THEN 'U' -- Set Action to Updated.
                ELSE 'D' -- Set Action to Deleted.       
            END
    END
    ELSE 
        IF NOT EXISTS(SELECT * FROM INSERTED) RETURN; -- Nothing updated or inserted.

    ...

    END
票数 140
EN

Stack Overflow用户

发布于 2012-06-07 16:18:35

如果运行不删除任何内容的delete语句,则不会考虑其中的许多建议。

假设您尝试删除ID等于表中不存在的某个值的位置。

您的触发器仍然会被调用,但删除或插入的表中没有任何内容。

为了安全起见,请使用以下代码:

代码语言:javascript
复制
--Determine if this is an INSERT,UPDATE, or DELETE Action or a "failed delete".
DECLARE @Action as char(1);
    SET @Action = (CASE WHEN EXISTS(SELECT * FROM INSERTED)
                         AND EXISTS(SELECT * FROM DELETED)
                        THEN 'U'  -- Set Action to Updated.
                        WHEN EXISTS(SELECT * FROM INSERTED)
                        THEN 'I'  -- Set Action to Insert.
                        WHEN EXISTS(SELECT * FROM DELETED)
                        THEN 'D'  -- Set Action to Deleted.
                        ELSE NULL -- Skip. It may have been a "failed delete".   
                    END)

特别感谢@KenDog和@Net_Prog的回答。

这是我从他们的脚本中构建的。

票数 97
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/741414

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档