Страница 1 из 1
Можно в триггере BEFORE INSERT отменить операцию записи?
Добавлено: 29 ноя 2004, 23:03
I_one
Можно в триггере BEFORE INSERT отменить операцию записи при возникновении определённых условий? Если это возможно то можно примерчик. Или какойто другой путь есть ?
Добавлено: 30 ноя 2004, 07:48
Deniz
Смотри доку на Exception и пример(
http://www.ibase.ru/devinfo/customex.htm ), не совсем в тему но
Добавлено: 30 ноя 2004, 17:48
kdv
совсем не в тему. в триггере на insert отменить вставку нельзя. exception в триггере в любом виде вызовет отмену insert.
Re: Можно в триггере BEFORE INSERT отменить операцию записи?
Добавлено: 30 ноя 2004, 21:25
Merlin
I_one писал(а):Можно в триггере BEFORE INSERT отменить операцию записи при возникновении определённых условий? Если это возможно то можно примерчик. Или какойто другой путь есть ?
Возбуждая в этом триггере exception и обрабатывая его там, откуда инициирован insert. На клиенте - try ... except, если инициирован из хранимой процедуры, то, соответственно, when ... do.
Добавлено: 01 дек 2004, 09:11
kdv
насколько я понимаю, вопрос стандартный - как "по тихому" отменить insert в триггере, чтобы insert не прошел, а наружу не выдался exception. соответственно ответ - импосибль.
Добавлено: 01 дек 2004, 09:22
kdv
кстати, я запамятовал, что будет если
Код: Выделить всё
create trigger xxx on yyy
active after insert
as
begin
exception e;
when ... do
delete from yyy where id = new.id;
end
Добавлено: 01 дек 2004, 11:07
sag
Как раз вставка "втихую" "откатится". И наружу исключение не пойдет.
Добавлено: 01 дек 2004, 14:30
kdv
ну это ж не откат. и потом, на одном триггере after insert свет клином не сошелся. могут быть еще триггеры before insert, after insert, и неизвестно как все это будет взаимодействовать. т.е. основной вопрос такой - нафига, если проще тогда вставку делать через процедуру.
Добавлено: 01 дек 2004, 20:36
sag
Конечно, это не откат в прямом смысле, да и случаи бывают разные. Однако, как некий экстренный вариант тихого похеривания действий в триггерах покатит. По поводу "а нафига" я совершенно согласен, подобную логику на серверной стороне симпатичнее заворачивать в хп.
Добавлено: 01 дек 2004, 21:08
kdv
ну и как - работает? я просто тут другим занят, проверять совсем некогда.
Добавлено: 01 дек 2004, 21:32
Merlin
kdv писал(а):ну и как - работает? я просто тут другим занят, проверять совсем некогда.
А чё бы ему не работать. Помнится я этот изврат кому-то уж пару лет назад предлагал со смайлами. Вот если в BD триггере проапдейтить ту же запись (свежеудалённую), то получался сурприз

Не помню какой - не то сервак валился, не то базе кранты

Вроде фиксили уже, лень в тракер лезть.
Добавлено: 01 дек 2004, 22:50
sag
kdv> ну и как - работает?
Работает, это я и имел виду говоря об "откате втихую". Никаких противоречивостей, вроде как, в этом нет.
Merlin> Помнится я этот изврат кому-то уж пару лет назад
Merlin> предлагал со смайлами
Почему со смайлами? Вполне прикольный трюк.
Merlin> Вот если в BD триггере проапдейтить ту же запись...
О, а это уже изврат.
Добавлено: 04 дек 2004, 00:12
mapnn
Можно в триггере BEFORE INSERT отменить операцию записи при возникновении определённых условий? Если это возможно то можно примерчик. Или какойто другой путь есть ?
Я об этом пол-года назад в конфе писал, что можно, но не нужно:
- Делаем insert записи, а в триггере after insert тут-же и удаляем её-же.
Делаем update записи, а в триггере after update тут-же и вертаем в зад.
Делаем delete записи, а в триггере after delete тут-же вставляем её-же.
Главное: что-бы избежать рекурсии в триггерах необходима
некоторая проверка полей, а то можно зациклиться
Игорь Ильинский