Страница 1 из 1
Возможен ли BREAK_INSERT в тригере?
Добавлено: 05 фев 2008, 03:27
Soglasen
А можно ли в триггере отменить вставку/удаление: не откатывая транзакцию, без участия клиента, без шума и пыли?
В догонку: Возможен ли BREAK_INSERT в тригере?
Добавлено: 05 фев 2008, 03:58
Soglasen
Пока что есть только не спортивный вариант для 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)
Добавлено: 05 фев 2008, 07:59
Dimitry Sibiryakov
Выбрось в триггере исключение. Оно откатит оператор, но не транзакцию.
Добавлено: 05 фев 2008, 22:01
Soglasen
Dimitry Sibiryakov писал(а):Выбрось в триггере исключение. Оно откатит оператор, но не транзакцию.
А можно пример или в ссылку !?
У меня exception ex; не подходит, т.к. шлёт клинту сообщение...
а с when exception ex do ума не приложу, как можно в триггере отмену
вставки данной записи сделать...
Добавлено: 05 фев 2008, 23:21
kdv
У меня exception ex; не подходит, т.к. шлёт клинту сообщение...
ну и какие проблемы? обработайте exception на клиенте. спрячьте его, скажите пользователю "нельзя удалять", и т.п.
как можно в триггере отмену вставки данной записи сделать...
уже сказали - вызовом exception. при этом отменится целиком оператор, выполнение которого привело к срабатыванию триггера.
Добавлено: 06 фев 2008, 08:35
Soglasen
В том то и соль, что на клиенте (одном из клиентов) нет возможности обрабатывать исключения, т.е. есть только винарник клиента. А в таблицу вставляются записи из десятков других триггеров и процедур (некий буфер для "риплекации"). Но зачастую такие записи вставлять не надо, при некоторых условия (которые часто приходится менять). Так же можно было бы обрамить условие в процедуру, которую вызывать во всех местах перед вставкой, что видимо и придётся сделать. По этому и прошу совета, чтобы не вставлять без сообщений клиенту и отката транзакции, т.е. по "спортивному", а не через делит... Вот.