2011-01-07 2 views
1

Скажем, у меня есть триггер UPDATE на tableA, который вставляет новую запись в tableB.Запуск запуска SQL Server

CREATE TRIGGER insertIntoTableB 
ON tableA 
FOR UPDATE 
AS 
    INSERT INTO tableB (...) VALUES (...) 
GO 

Затем я выполняю эти инструкции последовательно. Будет ли второй оператор UPDATE (UPDATE tableB) работать нормально? (Т.е. ждать триггер таблицы А, чтобы полностью выполнить)

UPDATE tableA 
SET ... 
WHERE key = 'some key' 

UPDATE tableB 
SET ... 
WHERE key = 'newly inserted key from trigger' 

ответ

2

Поведение подлежит конфигурации сервера nested triggers см Using Nested Triggers:

Оба DML и DDL триггеры вложенными , когда триггер выполняет действие, которое инициирует другой триггер. Эти действия могут инициировать другие триггеры, и так далее. Триггеры DML и DDL могут быть вложенными до 32 уровней. Вы можете контролировать , могут ли триггеры AFTER быть , вложенные через nested triggers вариант конфигурации сервера. INSTEAD Триггеры (только триггеры DML могут быть INSTEAD OF триггеров) могут быть вложены независимо от этой настройки.

Когда активируется триггер на столе A и внутри таблицы триггеров B, запускается триггер на таблице B. Триггер таблицы А не финиш, он заблокирован в ожидании завершения инструкции UPDATE, которая, в свою очередь, ждет завершения триггера таблицы B. Тем не менее, обновления в таблице A уже произошли (при условии, что запускается обычный триггер AFTER) и запрос таблицы A из триггера таблицы B будет см. Обновления.

+0

извините, возможно, сначала неясно, но есть только один триггер, и это на столе, я обновил свой пост соответственно. –

+1

Я вижу. Первая инструкция обновления не будет завершена до того, как будет возвращен триггер. На момент запуска второго UPDATE, вы абсолютно на 100% гарантируете, что предыдущий оператор закончил, включая любые триггеры, которые он мог вызвать. –

+0

хороший, спасибо. –

1

Если обновления последовательно закодированы в триггер UPDATE из А, то да.

+0

Ну, в триггере UPDATE таблицыA есть одно заявление INSERT INTO tableB, а инструкции UPDATE tableA и UPDATE tableB выполняются последовательно –

+0

Я думаю, тогда вы будете в порядке. Лучше всего было бы проверить это. – diagonalbatman

+0

круто спасибо, тоже проверит –