Триггер SQL Server при вставке, удалении и обновлении таблицы - PullRequest
9 голосов
/ 02 июня 2011

У меня есть таблица Product и другая таблица ProductLog.

Таблица журнала должна отслеживать два столбца в таблице Product. Каждый раз, когда происходит вставка, обновление или удаление этих столбцов, мне нужно обновить таблицу журнала.

Мне нужно написать три отдельных триггера или один триггер может обрабатывать эти операции?

Мне также нужно знать тип операции, например, мне нужно знать, была ли запись в таблице журнала из-за вставки, удаления или обновления. Если кто-нибудь даст мне пример, это было бы здорово.

Ответы [ 2 ]

24 голосов
/ 02 июня 2011

Вам нужен только один триггер

CREATE TRIGGER [ProductAfter] ON [Product] AFTER INSERT, UPDATE, DELETE

Вы можете определить, какой оператор DML сработает, на основе числа записей в таблицах inserted и deleted, доступных в теле триггера.Для INSERT, deleted пусто, для DELETE, inserted пусто, для UPDATE оба inserted и deleted не пусты.Например,

IF @@ROWCOUNT = 0 -- exit trigger when zero records affected
BEGIN
   RETURN;
END;
DECLARE @type CHAR(1);-- 'U' for update, 'D' for delete, 'I' for insert
IF EXISTS(SELECT * FROM inserted)
BEGIN
  IF EXISTS(SELECT * FROM deleted)
  BEGIN
     SET @type ='U';
  END
  ELSE
  BEGIN
     SET @type ='I';
  END
END
ELSE
BEGIN
  SET @type = 'D';
END;

Также обратите внимание на Отслеживание изменений данных , есть еще одна опция для отслеживания изменений без триггеров.

8 голосов
/ 08 ноября 2012

или просто

DECLARE @type CHAR(1)=
    case when not exists(SELECT * FROM inserted)
        then 'D'
    when exists(SELECT * FROM deleted)
        then 'U'
    else
        'I'
    end
...