【问题标题】:Determining sql command type in the trigger in sql server 2000确定sql server 2000触发器中的sql命令类型
【发布时间】:2010-12-26 21:37:00
【问题描述】:

是否有更多推荐的方法来确定触发器中的命令类型,然后测试 DELETED 和 INSERTED 表?

目前我的做法是:

(EXISTS (select 1 from INSERTED) AND NOT EXISTS (select 1 from DELETED)) = INSERT
(EXISTS (select 1 from INSERTED) AND EXISTS (select 1 from DELETED)) = UPDATE
(NOT EXISTS (select 1 from INSERTED) AND EXISTS (select 1 from DELETED)) = DELETE

【问题讨论】:

    标签: sql-server tsql sql-server-2000 triggers


    【解决方案1】:

    最快:

    IF NOT EXISTS (SELECT * FROM DELETED)
       PRINT 'INSERT'
    ELSE IF NOT EXISTS (SELECT * FROM INSERTED)
       PRINT 'DELETE'
    ELSE
       PRINT 'UPDATE'
    

    效率低下

    SELECT @foo int
    SET @foo = (SELECT COUNT(*) FROM INSERTED) - (SELECT COUNT(*) FROM DELETED)
    IF @foo > 0
       PRINT 'INSERT'
    ELSE @foo < 0
       PRINT 'DELETE'
    ELSE
       PRINT 'UPDATE'
    

    一般来说,你很少有一个涵盖所有 3 个的触发器。根据我的经验,你可以检查较少的是 U/D 或 I/U。

    注意,下面 MyTable 上的触发器仍然会触发,但实际上没有插入任何行。除非你有一个单独的插入触发器,否则你不能捕获它

    INSERT dbo.Mytable (col1,...)
    SELECT
         value1, ...
    WHERE
         1 = 0
    

    【讨论】:

    • “一般来说,你很少有一个涵盖所有 3 个的触发器。”我同意,我几乎从来没有一个触发器不仅用于一种类型的操作。
    • 谢谢你,确实你的版本更优化了。在我的场景中,我需要涵盖所有命令,因为我为 sql 2000 设计和开发了一种用户友好、基于触发器但高效的变更数据捕获系统,您可以在这里看到它vimeo.com/7320439
    猜你喜欢
    • 2012-06-03
    • 1970-01-01
    • 2012-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-19
    相关资源
    最近更新 更多