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)
最快:
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)