Определение типа команды SQL в триггере в SQL Server 2000 - PullRequest
1 голос
/ 15 декабря 2009

Есть ли более рекомендуемый способ определения типа команды в триггере, чем проверка таблиц 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

1 Ответ

5 голосов
/ 15 декабря 2009

Quickest:

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
...