powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Как остановить неявно стартуемую транзакцию при выполнении триггера ?
7 сообщений из 7, страница 1 из 1
Как остановить неявно стартуемую транзакцию при выполнении триггера ?
    #32035281
Den
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Den
Гость
Проблема такая, есть две таблицы одна справочник товаров, другая список накладных. При попытке удалить товар из справочника срабатывает триггер "Перед удалением" , проверяет наличие этого товара в списке накладных и, если он есть, должен производить откат транзакции.

AS
declare variable C integer;
begin

/* Определяем наличие товара в накладных */

select count(Key_Tov)
from sod_nakl
where (Key_tov=old.key_tov)or (Key_tov=old.key_kat)
into :c;

/* Если товар присутствует */

if (:c>0) then begin
rollback transaction; --- КАК ДОЛЖНО БЫТЬ ??????????
post_event"Del_Tov";
end;

Каким образом отменить удаление. Если можно пример плззззззз.
...
Рейтинг: 0 / 0
Как остановить неявно стартуемую транзакцию при выполнении триггера ?
    #32035654
Привет!

В твоем примере все просто - возбуди EXCEPTION, которое откатит все действия в твоем триггере.
EXCEPTION myex;

передварительно сойздав его CREATE EXCEPTION myex "Something terrible!"

Однако сам подход не совсем корректен, на мой взгляд.
Ведь другой человек в параллельно выполняющейся транзакции может использовать товар из справочника, который твой Select count(*) не увидит (данные то еще не подтверждены).
В результате - битая ссылка на несуществующий товар.

Надежнее, на мой взгляд, связать справочник товаров с накладной по внешнему ключу FOREIGN KEY (FK), который при попытке удаления используемого товара сразу будет ругаться.
отловить ругань в
try
...// удаляем
except
/// ShowMessage(извини не могу)
end

и все путем.
Твой вариант с Select count() не является алтернативой FK, так как внешний ключ видит даже неподтвержденные изменения и не даст создать битой ссылки.

С уважением,
Алексей Ковязин,
www.interbase-world.com
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Как остановить неявно стартуемую транзакцию при выполнении триггера ?
    #32481816
umpim
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А если я не хочу, чтобы выдавалось сообщение exception?
...
Рейтинг: 0 / 0
Как остановить неявно стартуемую транзакцию при выполнении триггера ?
    #32481829
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну и лови его в try ... except
А вообще, кого-то плющит. Ветка эта за 2002-й год...
...
Рейтинг: 0 / 0
Как остановить неявно стартуемую транзакцию при выполнении триггера ?
    #32481885
umpim
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А если удаляют из DBGrid нажатием Ctrl-D или из DBNavigatorа.
...
Рейтинг: 0 / 0
Как остановить неявно стартуемую транзакцию при выполнении триггера ?
    #32482238
Серега
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Мимопроходящий
А вообще, кого-то плющит. Ветка эта за 2002-й год...
Может он с того времени и решает этот вопрос. 8-)

2umpim
А может просто форинкей поставить без каскадного удаления? И никаких тригеров не надо.
...
Рейтинг: 0 / 0
Как остановить неявно стартуемую транзакцию при выполнении триггера ?
    #32483029
umpim
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 Сергей - !!!111
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Как остановить неявно стартуемую транзакцию при выполнении триггера ?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]