powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Откат триггера
7 сообщений из 7, страница 1 из 1
Откат триггера
    #32001135
maximF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как я понимаю, при возникновении ошибки во время исполнения триггера (MS SQL7) откат операции (UPDATE, DELETE, INSERT) не происходит, если не поставить явно код типа
if @@error<>0 begin
rollback tran
return
end
В общем, это довольно неудобно, в отличии от хранимой процедуры, где можно поставить SET XACT_ABORT ON. Тогда будет выполнен откат всей транзакции, а не только оператора, вызвавшего ошибку.
Можно ли аналогичного эффекта добиться в триггере, т.е. чтобы при возникновении непредвиденной ошибки в триггере откатывалась вся операция (UPDATE, DELETE, INSERT)?
...
Рейтинг: 0 / 0
Откат триггера
    #32001153
wlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если происходит ошибка в триггере - то откатывается ВСЯ операция (INSERT/UPDATE/DELETE)
...
Рейтинг: 0 / 0
Откат триггера
    #32001180
maximF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ничего подобного! Отката всей операции не происходит, хотя исключение в триггере и возбуждается.

Пример:
/*******************/
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)
...
Рейтинг: 0 / 0
Откат триггера
    #32001185
Fompro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Насколько я знаю, есть нюансы и в том, и в другом случае:
При использовании ROLLBACK в триггере происходит прерывание выполнения ВСЕГО пакета (за исключением тела триггера), равно, как и использование XACT_ABORT ON в в пакете. Исп-ие XACT_ABORT ON приводит к меньшей гибкости в использовании р.е. последовательных транзакций, или возврата значений.
...
Рейтинг: 0 / 0
Откат триггера
    #32001191
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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-а.

С приветом Сергей
...
Рейтинг: 0 / 0
Откат триггера
    #32001196
Oleg F
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если в тело триггера вставить оператор, который явным образом нарушает constraint (например, пытается нарушить primary key или unique в какой-то таблице), то при такой ошибке откатится только та команда(insert, update или delete), которая инициировала триггер. К сожалению, действительно raiserror ничего не откатывает, а ROLLBACK откатывает целиком транзакцию, что в большинсве случаев неудобно.
...
Рейтинг: 0 / 0
Откат триггера
    #32001198
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну почему же одна? Всё откатывается.

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


Или я чего-то не понимаю?
Тогда пожалуйста пример где откатывается половина транзакции
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Откат триггера
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]