在sql server 2000中确定触发器中的sql命令类型

Tom*_*mek 1 t-sql sql-server triggers sql-server-2000

是否有更多推荐的方法来确定触发器中的命令类型然后测试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
Run Code Online (Sandbox Code Playgroud)

gbn*_*gbn 5

最快:

IF NOT EXISTS (SELECT * FROM DELETED)
   PRINT 'INSERT'
ELSE IF NOT EXISTS (SELECT * FROM INSERTED)
   PRINT 'DELETE'
ELSE
   PRINT 'UPDATE'
Run Code Online (Sandbox Code Playgroud)

更低效

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'
Run Code Online (Sandbox Code Playgroud)

一般来说,你很少有触发器覆盖所有3.根据我的经验,它是U/D或I/U,您可以检查更少.

请注意,下面MyTable上的触发器仍然会触发但实际上没有插入任何行.除非您有单独的插入触发器,否则无法捕获此信息

INSERT dbo.Mytable (col1,...)
SELECT
     value1, ...
WHERE
     1 = 0
Run Code Online (Sandbox Code Playgroud)