插入更新触发器如何确定是否插入或更新

我需要在表A上编写一个Insert,Update Trigger,它将删除表B中所有行,其中一列(称为Desc)具有类似于表A的列(例如Col1)中插入/更新的值。 我将如何去写它,以便我可以处理更新和插入案例。 我将如何确定是否为更新或插入执行触发器。


如果它是MS SQL Server ...

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

在CREATE TRIGGER中查找“插入”

编辑,2011年11月23日

评论之后,此答案仅适用于INSERTEDUPDATED触发器。
显然,如上所述,DELETE触发器不能“在INSERTED总是行”


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

如果您运行删除语句并不会删除任何内容,则其中许多建议不会考虑在内。
假设您尝试删除ID等于表中不存在的某个值的位置。
你的触发器仍然被调用,但在Deleted或Inserted表中没有任何内容。

使用这个是安全的:

--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的答案。
我从他们的脚本构建了这个。

链接地址: http://www.djcxy.com/p/93913.html

上一篇: Insert Update trigger how to determine if insert or update

下一篇: Double or decimal for latitude/longitude values in C#