Определение типа команды sql в триггере в 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

person Tomek    schedule 15.12.2009    source источник


Ответы (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
person gbn    schedule 15.12.2009
comment
Как правило, у вас редко будет триггер, который охватывает все 3. Я согласен, у меня почти никогда не бывает триггера, который не предназначен только для одного типа действия. - person HLGEM; 15.12.2009
comment
Спасибо за это, действительно ваша версия более оптимизирована. В моем сценарии мне нужно, чтобы все команды были покрыты, так как я разработал и разработал удобную для пользователя, основанную на триггерах, но эффективную систему сбора данных об изменениях для sql 2000, вы можете увидеть это здесь vimeo.com/7320439. - person Tomek; 16.12.2009