2015-05-29 5 views
0

У меня есть два триггера, и я хотел бы знать, является ли результат выполненной работы одинаковой.Различные триггеры той же работы?

CREATE TRIGGER trg_test_upd ON test AFTER UPDATE 
AS 
    RAISERROR('Error', 16, 1); 
    ROLLBACK; 
GO 

CREATE TRIGGER trg_test_upd ON test INSTEAD OF UPDATE 
AS 
    RAISERROR('Error', 16, 1);  
GO 

Второй вопрос, почему вы бы использовать ROLLBACK если у вас есть INSTEAD OF?

+0

Реальный вопрос, конечно, должен состоять в том, почему вы предоставили какие-либо разрешения «UPDATE» для этой таблицы в первую очередь, если вы просто собираетесь использовать триггер для предотвращения обновлений? –

+0

Например, вы хотите установить некоторые условия обновления, связанные со значением, которое вы обновляете. –

+0

Если это * условная ошибка/откат, триггеры не совпадают, поскольку триггер 'INSTEAD OF' должен выполнять фактические изменения, если условие ложно. Но если это тот случай, который вы хотите обсудить, триггеры, которые вы указали в своем вопросе, не являются репрезентативными, и как мы это понимаем? –

ответ

0

Два триггера работают одинаково, за исключением того, что первый, вероятно, займет больше времени.

Предположим, у вашей таблицы test есть стол с миллионом записей. И вы пытаетесь обновить некоторые столбцы для каждой записи. Затем сначала произойдет операция обновления, и только после завершения обновления всех записей триггер активируется. Затем триггер поднимет ошибку и отменит все изменения с помощью инструкции обновления с помощью команды ROLLBACK.

Во втором случае триггер активируется, как только будет обнаружено обновление в таблице. Это позволит сэкономить немало ненужной обработки данных. Чтобы ответить на ваш второй вопрос, операция обновления не выполняется во втором случае, когда используется INSTEAD OF. Следовательно, нет необходимости в команде ROLLBACK.

+0

Хорошо понял. Но почему в каком-то случае вы будете использовать откат? –

+0

В первом случае происходит обновление, поэтому откат необходим, чтобы обновления не были получены позже. Во втором случае обновление не произошло, поэтому откат не нужен. (Вы также можете добавить заявление о сворачивании, но это было бы излишним.) – CodeNewbie

+0

Прекрасное спасибо. У вас есть пример, где необходим откат? –

Смежные вопросы