|
|
|
Временое отключение триггера
|
|||
|---|---|---|---|
|
#18+
Есть две таблицы в мастер-детайл. На детайл висит триггер, который проверяет, что если ни одной записи в детайл, соответвующей конкретной записи в мастер, не остается, то и из мастера тоже удалить. Другими словами - запись в главной таблице не может существовать без подчиненных. Теперь надо сделать в одной транзакции такое действие: 1. удалить для конретной мастер-записи все дочерние записи 2. записать другие для той же мастер-записи. Естествено при наличии триггера вторую часть я уже сделать не смогу, т.к. мастер-запись удалиться. Вопрос. Будет ли правильным такое решение? create procedure test as begin Отключить_триггер Удалить записи Включить триггер добавить записи end ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2007, 11:33 |
|
||
|
Временое отключение триггера
|
|||
|---|---|---|---|
|
#18+
Гость74Теперь надо сделать в одной транзакции такое действие: 1. удалить для конретной мастер-записи все дочерние записи 2. записать другие для той же мастер-записи. Естествено при наличии триггера вторую часть я уже сделать не смогу, т.к. мастер-запись удалиться. Вопрос. Будет ли правильным такое решение? create procedure test as begin Отключить_триггер Удалить записи Включить триггер добавить записи endЕсли БД Oracle, то об одной транзакции говорить не приходиться, т.к. отключение/подключение триггера это DDL. Ну и сам подход, ИМХО, достаточно сомнителен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2007, 11:51 |
|
||
|
Временое отключение триггера
|
|||
|---|---|---|---|
|
#18+
Гость74Другими словами - запись в главной таблице не может существовать без подчиненных. Может, достаточно в мастер таблице просто добавить запись и не добавлять в подчиненную. Интересная постановка задачи ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2007, 12:04 |
|
||
|
Временое отключение триггера
|
|||
|---|---|---|---|
|
#18+
Обычная задача. Вы, например, пишите сообщение адесованное нескольким получателям. Само сообщение без хотя бы одного получателя существовать не может. Что здесь необычного? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2007, 12:10 |
|
||
|
Временое отключение триггера
|
|||
|---|---|---|---|
|
#18+
авторТеперь надо сделать в одной транзакции такое действие: 1. удалить для конретной мастер-записи все дочерние записи 2. записать другие для той же мастер-записи. Сделайте наоборот: 1. Сначала вставьте "другие для той же мастер-записи" - сохранив "куда-нибудь" их идентификаторы. 2. Удалите записи, не соответсвующие "новым" идетнификаторм. ЗЫ. Отключение триггеров, даже в тех СУБД, где DDL транзакционных, ни есть хорошая практика. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2007, 13:33 |
|
||
|
Временое отключение триггера
|
|||
|---|---|---|---|
|
#18+
Либо перед удаление добавить суррогатную запись в detail-таблицу, после вставки ее грохнуть. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2007, 13:31 |
|
||
|
Временое отключение триггера
|
|||
|---|---|---|---|
|
#18+
Гость74Обычная задача. Ничего не обычная, очередной бред. Если есть ограничение, что у мастера хотя бы одна деталь должна быть, то при удалении последней детали должна быть блокировка этой операции, а не каскадное удаление мастера. Если надо удалить все - удалять мастера. Это если надо именно такое поведение на уровне БД. В чем я, лично, очень сомневаюсь. Ибо если в документе надо одну строку удалить, а другую вставить, то порядок, в котором это будет сделано, вообще говоря, неважен. Добавьте еще условие, что у мастера ровно одна деталь - получите полный П. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2007, 14:33 |
|
||
|
Временое отключение триггера
|
|||
|---|---|---|---|
|
#18+
Гость74Само сообщение без хотя бы одного получателя существовать не может Запросто. Оно не может быть отправлено . Разницу чувствуете? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2007, 14:36 |
|
||
|
Временое отключение триггера
|
|||
|---|---|---|---|
|
#18+
>Запросто. Оно не может быть отправлено. Разницу чувствуете Чувствую. Только вы условие задачи до конца не знаете :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2007, 09:04 |
|
||
|
Временое отключение триггера
|
|||
|---|---|---|---|
|
#18+
Гость74>Запросто. Оно не может быть отправлено. Разницу чувствуете Чувствую. Только вы условие задачи до конца не знаете :-) Потому что его кто-то не описал до конца? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2007, 10:10 |
|
||
|
Временое отключение триггера
|
|||
|---|---|---|---|
|
#18+
Гость74. Какие проблемы? Сделайте ХП, удалите сначала в ней записи из детайл, а потом - из мастер. Тригер отработает правильно.. Это называется - каскадное удалени. Однако это в 99% случаев нарушит объективную информацию. Не целостность базы, а именно информацию. Было что-то - и пропало. Я, как всегда, считаю, что удаление нужно только для ошибочно введенных записей. И на них ограничения по удалению обычно не распространяются. Потому что нормальный оператор удалит ошибку из мастер до того, как к нему привязали детайл. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2007, 22:06 |
|
||
|
|

start [/forum/topic.php?fid=32&fpage=111&tid=1544189]: |
0ms |
get settings: |
9ms |
get forum list: |
18ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
119ms |
get topic data: |
11ms |
get forum data: |
4ms |
get page messages: |
58ms |
get tp. blocked users: |
2ms |
| others: | 232ms |
| total: | 461ms |

| 0 / 0 |
