Обновление вместо вставки.
Обновление вместо вставки.
Доброго времени суток всем!
Если кто-нибудь знает, подскажите, пожалуйста.
При вставке новой записи в таблицу, я проверяю наличие в этой таблице необходимой записи. Если нет, то просто добавляю. Если есть, то обновляю некоторые поля этой записи.
Собственно, вопрос: Как в триггере BeforeInsert остановить добавление
новой записи, не отменяя сделанные изменения и не используя exception.
Если кто-нибудь знает, подскажите, пожалуйста.
При вставке новой записи в таблицу, я проверяю наличие в этой таблице необходимой записи. Если нет, то просто добавляю. Если есть, то обновляю некоторые поля этой записи.
Собственно, вопрос: Как в триггере BeforeInsert остановить добавление
новой записи, не отменяя сделанные изменения и не используя exception.
рекомендую воспользоваться поиском, т.к. эта тема уже обсуждалась.
В общем случае вставку превратить в обновление в триггере на вставку нельзя. То есть, нужно пользоваться процедурой. Например как тут:
www.ibase.ru/devinfo/testiu.htm
В общем случае вставку превратить в обновление в триггере на вставку нельзя. То есть, нужно пользоваться процедурой. Например как тут:
www.ibase.ru/devinfo/testiu.htm
ну КАК тут можно обойтись триггером, объясните мне пожалуйста, а?может есть способ обойтись триггером. Нету.
Честное слово - Вы не представляете, как триггеры работают, и уже пытаетесь туда какой-то изврат запихнуть.
обработкой when. А Вы прямо так процедурой и шпарите? Статья ведь просто пример, плюс один из способов импорта - через external table.Как получить идентификатор записи, на котой произошла ошибка
там же и пример when есть.
или я не понимаю, о чем Вы спрашиваете. Можно поподробнее?
Если ССЗБ, то ведущие проктологи рекомендуют так:kdv писал(а):ну КАК тут можно обойтись триггером, объясните мне пожалуйста, а?
Код: Выделить всё
CREATE TRIGGER ... BEFORE INSERT
as begin
if (exists (select 1 from Table1 a1 where a1.id = new.id)) then begin
update Table1 a
set a.val1 = new.val1,
a.val2 = new.val2,
...
where a.id = new.id;
new.id = -1;
end
end
CREATE TRIGGER ... AFTER INSERT
as begin
if (new.id < 0) then
delete from Table1 a where a.id = new.id;
end
Привет еще раз.
Написал, думал, что "светлые головы" что нибудь посоветуют по делу. Напрасно надеялся. Только посмеялись. ':twisted:'
Свои проблемы решил так. В таблице есть некое составное уникальное поле. Приложение (один из видов клиентов) постоянно осуществляет вставку (это о нем речь), остальные только читают, скрипт при перед backup удаляет лишнее. Вставка осуществляется только процедурой. При возникновении ошибки WHEN ANY DO (SQLCODE 803), т.е. попытка вставить новую уникальную запись, провожу поиск идентификатора записи, на которой встали, и обновляю ее, меняя некоторые значения не входящие в составное уникальное поле (ну, мне так надо).
А хотел я от Вас узнать, Нельзя ли, НЕ ДЕЛАЯ ДОПОЛНИТЕЛЬНОГО SELECT, в момент, когда процедура споткнулась на INSERT, узнать номер, ID или еще как выяснить идентификатор этой записи, которая содержит набор таких же значений составного поля, что и в запросе INSERT. ':?'
С уважением.
Написал, думал, что "светлые головы" что нибудь посоветуют по делу. Напрасно надеялся. Только посмеялись. ':twisted:'
Свои проблемы решил так. В таблице есть некое составное уникальное поле. Приложение (один из видов клиентов) постоянно осуществляет вставку (это о нем речь), остальные только читают, скрипт при перед backup удаляет лишнее. Вставка осуществляется только процедурой. При возникновении ошибки WHEN ANY DO (SQLCODE 803), т.е. попытка вставить новую уникальную запись, провожу поиск идентификатора записи, на которой встали, и обновляю ее, меняя некоторые значения не входящие в составное уникальное поле (ну, мне так надо).
А хотел я от Вас узнать, Нельзя ли, НЕ ДЕЛАЯ ДОПОЛНИТЕЛЬНОГО SELECT, в момент, когда процедура споткнулась на INSERT, узнать номер, ID или еще как выяснить идентификатор этой записи, которая содержит набор таких же значений составного поля, что и в запросе INSERT. ':?'
С уважением.
тупой вопрос - тупой ответ, извини за прямоту.Написал, думал, что "светлые головы" что нибудь посоветуют по делу. Напрасно надеялся. Только посмеялись.
см. цитату выше. В приведенной ссылке нормальный вариант когда сначала ИЩУТ запись, а потом по ее СУЩЕСТВОВАНИЮ или нет делают update или insert.Нельзя ли, НЕ ДЕЛАЯ ДОПОЛНИТЕЛЬНОГО SELECT, в момент, когда процедура споткнулась на INSERT, узнать номер, ID или еще
ты определись сначала, что у тебя является идентификатором записи. А потом подумай над тем, что ты спросил.как выяснить идентификатор этой записи, которая содержит набор таких же значений составного поля, что и в запросе INSERT.
Если у тебя на таблице только ПК, то вопроса как такового нет. Если же есть еще и альтернативный ключ, то ты уж тогда как-нибудь сам разберись, чего ты пытаешься задублировать - или повторить значение ПК, или повторить значение альтернативного ключа.
В общем, с моделью данных разберись