|
|
|
Механизм каскадных удалений
|
|||
|---|---|---|---|
|
#18+
Типичная задача: при удалении записи в родительской таблице должны автоматически удаляться соответствующие записи в дочерней (например, при удалении накладной должны удаляться все пункты накладой). В принципе с помощью тригера решается элементарно, и обычно я так и делал. А тут, поленился создавать тригер и просто при создании внешнего ключала указал ON DELETE CASCADE. Результат - записи в дочерней таблице удаляет - все ок, но в ней не срабатывает тригер AFTER DELETE, который должен в случае удаления записей произвести перерасчет в некоторой накопительной таблице. Убираю ON DELETE CASCADE и реализовываю каскадные удаления с помощью тригера - все работает замечательно. И теперь меня "гложет" вопрос почему так происходит? - ведь, как написано в документации, при указании ON DELETE CASCADE, фактически создается системный тригер, который выполняет удаления. Грешил вначале на то что внешние ключи находятся вне контекста транзакций, но это не оправдывает такой логики работы, т.к. каскадные удаления, сделанные при указании ON DELETE CASCADE, происходят (я проверял) в контексте транзакций. Кто нибудь может мне объяснить посчему так происходит? - оно конечно не принципиально, но все таки интересно понять логику :) P.S. Да, совсем забыл - сервер Firebird 1.0 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2003, 19:20 |
|
||
|
Механизм каскадных удалений
|
|||
|---|---|---|---|
|
#18+
Я повторил все то, что ты описал - все тригеры срабатывают на ура... :/ С уважением! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2003, 17:36 |
|
||
|
|

start [/forum/topic.php?fid=40&fpage=495&tid=1579585]: |
0ms |
get settings: |
7ms |
get forum list: |
18ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
45ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
44ms |
get tp. blocked users: |
2ms |
| others: | 221ms |
| total: | 355ms |

| 0 / 0 |
