|
Откат триггера
|
|||
---|---|---|---|
#18+
Как я понимаю, при возникновении ошибки во время исполнения триггера (MS SQL7) откат операции (UPDATE, DELETE, INSERT) не происходит, если не поставить явно код типа if @@error<>0 begin rollback tran return end В общем, это довольно неудобно, в отличии от хранимой процедуры, где можно поставить SET XACT_ABORT ON. Тогда будет выполнен откат всей транзакции, а не только оператора, вызвавшего ошибку. Можно ли аналогичного эффекта добиться в триггере, т.е. чтобы при возникновении непредвиденной ошибки в триггере откатывалась вся операция (UPDATE, DELETE, INSERT)? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.12.2000, 12:24 |
|
Откат триггера
|
|||
---|---|---|---|
#18+
Если происходит ошибка в триггере - то откатывается ВСЯ операция (INSERT/UPDATE/DELETE) ... |
|||
:
Нравится:
Не нравится:
|
|||
13.12.2000, 12:17 |
|
Откат триггера
|
|||
---|---|---|---|
#18+
Ничего подобного! Отката всей операции не происходит, хотя исключение в триггере и возбуждается. Пример: /*******************/ create table aaa( i int) go create trigger aaaInsert on aaa for insert as raiserror('aInsert', 16, 1) go insert aaa values(1) select * from aaa go /*******************/ Результат: Server: Msg 50000, Level 16, State 1, Line 0 aInsert i ----------- 1 (1 row(s) affected) Тоже самое происходит при возникновении системного эррора (типа Pk violation) ... |
|||
:
Нравится:
Не нравится:
|
|||
14.12.2000, 17:16 |
|
Откат триггера
|
|||
---|---|---|---|
#18+
Насколько я знаю, есть нюансы и в том, и в другом случае: При использовании ROLLBACK в триггере происходит прерывание выполнения ВСЕГО пакета (за исключением тела триггера), равно, как и использование XACT_ABORT ON в в пакете. Исп-ие XACT_ABORT ON приводит к меньшей гибкости в использовании р.е. последовательных транзакций, или возврата значений. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.12.2000, 18:55 |
|
Откат триггера
|
|||
---|---|---|---|
#18+
2 maximF Ты не прав попробуй написать так: create table aaa( i int, primary key(i)) go create trigger aaaInsert on aaa for insert as insert aaa select * from inserted go insert aaa values(1) select * from aaa go Увы, запись не вставиться. Дело в том, что raiserror('aInsert', 16, 1) не вызывает ошибку, он вызывает только сообщение об ошибке и толку от него примерно как от print-а. С приветом Сергей ... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2000, 07:39 |
|
Откат триггера
|
|||
---|---|---|---|
#18+
Если в тело триггера вставить оператор, который явным образом нарушает constraint (например, пытается нарушить primary key или unique в какой-то таблице), то при такой ошибке откатится только та команда(insert, update или delete), которая инициировала триггер. К сожалению, действительно raiserror ничего не откатывает, а ROLLBACK откатывает целиком транзакцию, что в большинсве случаев неудобно. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2000, 09:41 |
|
Откат триггера
|
|||
---|---|---|---|
#18+
Ну почему же одна? Всё откатывается. create table aaa( i int, primary key(i)) go create table bbb( i int) go create trigger aaaInsert on aaa for insert as insert bbb select * from inserted insert aaa select * from inserted go insert aaa values(1) go select * from bbb go Или я чего-то не понимаю? Тогда пожалуйста пример где откатывается половина транзакции ... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2000, 10:09 |
|
|
start [/forum/topic.php?fid=46&fpage=3595&tid=1827542]: |
0ms |
get settings: |
7ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
37ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
45ms |
get tp. blocked users: |
2ms |
others: | 13ms |
total: | 142ms |
0 / 0 |