Возможен ли BREAK_INSERT в тригере?

ЧАстые Вопросы и Ответы

Модераторы: kdv, CyberMax

Ответить
Soglasen
Сообщения: 4
Зарегистрирован: 05 фев 2008, 03:12

Возможен ли BREAK_INSERT в тригере?

Сообщение Soglasen » 05 фев 2008, 03:27

А можно ли в триггере отменить вставку/удаление: не откатывая транзакцию, без участия клиента, без шума и пыли?

Soglasen
Сообщения: 4
Зарегистрирован: 05 фев 2008, 03:12

В догонку: Возможен ли BREAK_INSERT в тригере?

Сообщение Soglasen » 05 фев 2008, 03:58

Пока что есть только не спортивный вариант для ALTER trigger:

if(......) then
delete from MYTABLE where ID = new.ID;

кстати, а такой вариант не катит:
delete from MYTABLE where MYTABLE.RDB$DB_KEY = new.RDB$DB_KEY;

(FB2.0.3 WinXP)

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Сообщение Dimitry Sibiryakov » 05 фев 2008, 07:59

Выбрось в триггере исключение. Оно откатит оператор, но не транзакцию.

Soglasen
Сообщения: 4
Зарегистрирован: 05 фев 2008, 03:12

Сообщение Soglasen » 05 фев 2008, 22:01

Dimitry Sibiryakov писал(а):Выбрось в триггере исключение. Оно откатит оператор, но не транзакцию.
А можно пример или в ссылку !?

У меня exception ex; не подходит, т.к. шлёт клинту сообщение...
а с when exception ex do ума не приложу, как можно в триггере отмену
вставки данной записи сделать...

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 05 фев 2008, 23:21

У меня exception ex; не подходит, т.к. шлёт клинту сообщение...
ну и какие проблемы? обработайте exception на клиенте. спрячьте его, скажите пользователю "нельзя удалять", и т.п.
как можно в триггере отмену вставки данной записи сделать...
уже сказали - вызовом exception. при этом отменится целиком оператор, выполнение которого привело к срабатыванию триггера.

Soglasen
Сообщения: 4
Зарегистрирован: 05 фев 2008, 03:12

Сообщение Soglasen » 06 фев 2008, 08:35

В том то и соль, что на клиенте (одном из клиентов) нет возможности обрабатывать исключения, т.е. есть только винарник клиента. А в таблицу вставляются записи из десятков других триггеров и процедур (некий буфер для "риплекации"). Но зачастую такие записи вставлять не надо, при некоторых условия (которые часто приходится менять). Так же можно было бы обрамить условие в процедуру, которую вызывать во всех местах перед вставкой, что видимо и придётся сделать. По этому и прошу совета, чтобы не вставлять без сообщений клиенту и отката транзакции, т.е. по "спортивному", а не через делит... Вот.

Ответить