Триггер SQL Server при вставке, удалении и обновлении таблицы

у меня есть таблица Product и еще один стол ProductLog.

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

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

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

2 ответов


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

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;

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


или просто

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