Назад | Перейти на главную страницу

Поведение триггера MSSQL 2005

Мне интересно, как триггер для таблицы ведет себя в SQL Server в ответ на незафиксированную транзакцию, влияющую на эту таблицу, если для триггера указано, что он запускается ПОСЛЕ ОБНОВЛЕНИЯ.

Если транзакция не была зафиксирована при ОБНОВЛЕНИИ таблицы, сработает ли все равно триггер? Или он ждет (как я надеюсь) фиксации транзакции перед запуском?

Триггер сработает сразу после UPDATE и будет считаться частью активной транзакции.

Рассмотрим ситуацию, когда триггер обновляет / очищает некоторые данные в таблице - вы не сможете ссылаться на эти исправленные данные до тех пор, пока не попытаетесь зафиксировать транзакцию, если триггер не сработает немедленно.

Это как-то так, как вы надеетесь. Если транзакция не фиксируется, то AFTER UPDATE триггер не сработает, но это верно только для всей транзакции, если вы проверите значение @@Error после ваших заявлений и откатить транзакцию.

Учти это:

CREATE TABLE Table1 (SomeNumber int NOT NULL)
CREATE TABLE Table2 (SomeNumber int)

CREATE TRIGGER UpdAfterTrigger
   ON  Table1
   AFTER UPDATE
AS 
BEGIN
   INSERT Table2 SELECT 1
END

INSERT Table1 (SomeNumber) SELECT 1

BEGIN TRANSACTION

UPDATE Table1 SET SomeNumber=1
UPDATE Table1 SET SomeNumber=1
UPDATE Table1 SET SomeNumber=1
UPDATE Table1 SET SomeNumber=1
UPDATE Table1 SET SomeNumber=NULL

IF (@@error <> 0)
BEGIN
  ROLLBACK TRANSACTION 
END
ELSE
BEGIN
    COMMIT TRANSACTION
END

В этом случае триггер не сработает, так как транзакция откатывается из-за ошибки при вставке NULL в NOT NULL столбец.

Если вы не проверяете @@Error <> 0 и просто слепо зафиксируйте транзакцию, тогда триггер в этом примере сработает для каждого из 4 хороших UPDATE выписки в пакете.