Мне интересно, как триггер для таблицы ведет себя в 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
выписки в пакете.