Страница 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 тут-же вставляем её-же.
Главное: что-бы избежать рекурсии в триггерах необходима
некоторая проверка полей, а то можно зациклиться :lol:

Игорь Ильинский