|
|
|
Как остановить неявно стартуемую транзакцию при выполнении триггера ?
|
|||
|---|---|---|---|
|
#18+
Проблема такая, есть две таблицы одна справочник товаров, другая список накладных. При попытке удалить товар из справочника срабатывает триггер "Перед удалением" , проверяет наличие этого товара в списке накладных и, если он есть, должен производить откат транзакции. 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; Каким образом отменить удаление. Если можно пример плззззззз. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2002, 09:25 |
|
||
|
Как остановить неявно стартуемую транзакцию при выполнении триггера ?
|
|||
|---|---|---|---|
|
#18+
Привет! В твоем примере все просто - возбуди EXCEPTION, которое откатит все действия в твоем триггере. EXCEPTION myex; передварительно сойздав его CREATE EXCEPTION myex "Something terrible!" Однако сам подход не совсем корректен, на мой взгляд. Ведь другой человек в параллельно выполняющейся транзакции может использовать товар из справочника, который твой Select count(*) не увидит (данные то еще не подтверждены). В результате - битая ссылка на несуществующий товар. Надежнее, на мой взгляд, связать справочник товаров с накладной по внешнему ключу FOREIGN KEY (FK), который при попытке удаления используемого товара сразу будет ругаться. отловить ругань в try ...// удаляем except /// ShowMessage(извини не могу) end и все путем. Твой вариант с Select count() не является алтернативой FK, так как внешний ключ видит даже неподтвержденные изменения и не даст создать битой ссылки. С уважением, Алексей Ковязин, www.interbase-world.com ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2002, 19:34 |
|
||
|
Как остановить неявно стартуемую транзакцию при выполнении триггера ?
|
|||
|---|---|---|---|
|
#18+
А если я не хочу, чтобы выдавалось сообщение exception? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.04.2004, 20:39 |
|
||
|
Как остановить неявно стартуемую транзакцию при выполнении триггера ?
|
|||
|---|---|---|---|
|
#18+
Ну и лови его в try ... except А вообще, кого-то плющит. Ветка эта за 2002-й год... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.04.2004, 20:54 |
|
||
|
Как остановить неявно стартуемую транзакцию при выполнении триггера ?
|
|||
|---|---|---|---|
|
#18+
А если удаляют из DBGrid нажатием Ctrl-D или из DBNavigatorа. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.04.2004, 22:44 |
|
||
|
Как остановить неявно стартуемую транзакцию при выполнении триггера ?
|
|||
|---|---|---|---|
|
#18+
2Мимопроходящий А вообще, кого-то плющит. Ветка эта за 2002-й год... Может он с того времени и решает этот вопрос. 8-) 2umpim А может просто форинкей поставить без каскадного удаления? И никаких тригеров не надо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.04.2004, 10:19 |
|
||
|
|

start [/forum/topic.php?fid=40&fpage=476&tid=1578827]: |
0ms |
get settings: |
10ms |
get forum list: |
16ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
57ms |
get topic data: |
9ms |
get forum data: |
4ms |
get page messages: |
54ms |
get tp. blocked users: |
2ms |
| others: | 257ms |
| total: | 413ms |

| 0 / 0 |
