Можно в триггере BEFORE INSERT отменить операцию записи?

Запросы, планы, оптимизация запросов, ...

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

Ответить
I_one

Можно в триггере BEFORE INSERT отменить операцию записи?

Сообщение I_one » 29 ноя 2004, 23:03

Можно в триггере BEFORE INSERT отменить операцию записи при возникновении определённых условий? Если это возможно то можно примерчик. Или какойто другой путь есть ?

Deniz
Сообщения: 7
Зарегистрирован: 27 окт 2004, 06:38

Сообщение Deniz » 30 ноя 2004, 07:48

Смотри доку на Exception и пример( http://www.ibase.ru/devinfo/customex.htm ), не совсем в тему но

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

Сообщение kdv » 30 ноя 2004, 17:48

совсем не в тему. в триггере на insert отменить вставку нельзя. exception в триггере в любом виде вызовет отмену insert.

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Re: Можно в триггере BEFORE INSERT отменить операцию записи?

Сообщение Merlin » 30 ноя 2004, 21:25

I_one писал(а):Можно в триггере BEFORE INSERT отменить операцию записи при возникновении определённых условий? Если это возможно то можно примерчик. Или какойто другой путь есть ?
Возбуждая в этом триггере exception и обрабатывая его там, откуда инициирован insert. На клиенте - try ... except, если инициирован из хранимой процедуры, то, соответственно, when ... do.

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

Сообщение kdv » 01 дек 2004, 09:11

насколько я понимаю, вопрос стандартный - как "по тихому" отменить insert в триггере, чтобы insert не прошел, а наружу не выдался exception. соответственно ответ - импосибль.

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

Сообщение kdv » 01 дек 2004, 09:22

кстати, я запамятовал, что будет если

Код: Выделить всё

create trigger xxx on yyy
active after insert
as
begin
  exception e;
  when ... do
     delete from yyy where id = new.id;
end

sag
Сообщения: 116
Зарегистрирован: 02 ноя 2004, 11:42

Сообщение sag » 01 дек 2004, 11:07

Как раз вставка "втихую" "откатится". И наружу исключение не пойдет.

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

Сообщение kdv » 01 дек 2004, 14:30

ну это ж не откат. и потом, на одном триггере after insert свет клином не сошелся. могут быть еще триггеры before insert, after insert, и неизвестно как все это будет взаимодействовать. т.е. основной вопрос такой - нафига, если проще тогда вставку делать через процедуру.

sag
Сообщения: 116
Зарегистрирован: 02 ноя 2004, 11:42

Сообщение sag » 01 дек 2004, 20:36

Конечно, это не откат в прямом смысле, да и случаи бывают разные. Однако, как некий экстренный вариант тихого похеривания действий в триггерах покатит. По поводу "а нафига" я совершенно согласен, подобную логику на серверной стороне симпатичнее заворачивать в хп.

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

Сообщение kdv » 01 дек 2004, 21:08

ну и как - работает? я просто тут другим занят, проверять совсем некогда.

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 01 дек 2004, 21:32

kdv писал(а):ну и как - работает? я просто тут другим занят, проверять совсем некогда.
А чё бы ему не работать. Помнится я этот изврат кому-то уж пару лет назад предлагал со смайлами. Вот если в BD триггере проапдейтить ту же запись (свежеудалённую), то получался сурприз :) Не помню какой - не то сервак валился, не то базе кранты :) Вроде фиксили уже, лень в тракер лезть.

sag
Сообщения: 116
Зарегистрирован: 02 ноя 2004, 11:42

Сообщение sag » 01 дек 2004, 22:50

kdv> ну и как - работает?

Работает, это я и имел виду говоря об "откате втихую". Никаких противоречивостей, вроде как, в этом нет.

Merlin> Помнится я этот изврат кому-то уж пару лет назад
Merlin> предлагал со смайлами

Почему со смайлами? Вполне прикольный трюк.

Merlin> Вот если в BD триггере проапдейтить ту же запись...

О, а это уже изврат.

mapnn

Сообщение mapnn » 04 дек 2004, 00:12

Можно в триггере BEFORE INSERT отменить операцию записи при возникновении определённых условий? Если это возможно то можно примерчик. Или какойто другой путь есть ?
Я об этом пол-года назад в конфе писал, что можно, но не нужно:
  • Делаем insert записи, а в триггере after insert тут-же и удаляем её-же.
    Делаем update записи, а в триггере after update тут-же и вертаем в зад.
    Делаем delete записи, а в триггере after delete тут-же вставляем её-же.
Главное: что-бы избежать рекурсии в триггерах необходима
некоторая проверка полей, а то можно зациклиться :lol:

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

Ответить