Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Временое отключение триггера / 11 сообщений из 11, страница 1 из 1
13.11.2007, 11:33
    #34934606
Гость74
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Временое отключение триггера
Есть две таблицы в мастер-детайл. На детайл висит триггер, который проверяет, что если ни одной записи в детайл, соответвующей конкретной записи в мастер, не остается, то и из мастера тоже удалить. Другими словами - запись в главной таблице не может существовать без подчиненных.
Теперь надо сделать в одной транзакции такое действие:
1. удалить для конретной мастер-записи все дочерние записи
2. записать другие для той же мастер-записи.

Естествено при наличии триггера вторую часть я уже сделать не смогу, т.к. мастер-запись удалиться.
Вопрос. Будет ли правильным такое решение?

create procedure test
as
begin
Отключить_триггер
Удалить записи
Включить триггер
добавить записи
end
...
Рейтинг: 0 / 0
13.11.2007, 11:51
    #34934688
ant74
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Временое отключение триггера
Гость74Теперь надо сделать в одной транзакции такое действие:
1. удалить для конретной мастер-записи все дочерние записи
2. записать другие для той же мастер-записи.

Естествено при наличии триггера вторую часть я уже сделать не смогу, т.к. мастер-запись удалиться.
Вопрос. Будет ли правильным такое решение?

create procedure test
as
begin
Отключить_триггер
Удалить записи
Включить триггер
добавить записи
endЕсли БД Oracle, то об одной транзакции говорить не приходиться, т.к. отключение/подключение триггера это DDL. Ну и сам подход, ИМХО, достаточно сомнителен.
...
Рейтинг: 0 / 0
13.11.2007, 12:04
    #34934737
Naf
Naf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Временое отключение триггера
Гость74Другими словами - запись в главной таблице не может существовать без подчиненных.

Может, достаточно в мастер таблице просто добавить запись и не добавлять в подчиненную.

Интересная постановка задачи
...
Рейтинг: 0 / 0
13.11.2007, 12:10
    #34934759
Гость74
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Временое отключение триггера
Обычная задача. Вы, например, пишите сообщение адесованное нескольким получателям. Само сообщение без хотя бы одного получателя существовать не может. Что здесь необычного?
...
Рейтинг: 0 / 0
13.11.2007, 13:33
    #34935170
pkarklin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Временое отключение триггера
авторТеперь надо сделать в одной транзакции такое действие:
1. удалить для конретной мастер-записи все дочерние записи
2. записать другие для той же мастер-записи.

Сделайте наоборот:

1. Сначала вставьте "другие для той же мастер-записи" - сохранив "куда-нибудь" их идентификаторы.
2. Удалите записи, не соответсвующие "новым" идетнификаторм.

ЗЫ. Отключение триггеров, даже в тех СУБД, где DDL транзакционных, ни есть хорошая практика.
...
Рейтинг: 0 / 0
14.11.2007, 13:31
    #34938335
Leshij
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Временое отключение триггера
Либо перед удаление добавить суррогатную запись в detail-таблицу, после
вставки ее грохнуть.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
14.11.2007, 14:33
    #34938702
Сергей Васкецов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Временое отключение триггера
Гость74Обычная задача.
Ничего не обычная, очередной бред.
Если есть ограничение, что у мастера хотя бы одна деталь должна быть, то при удалении последней детали должна быть блокировка этой операции, а не каскадное удаление мастера. Если надо удалить все - удалять мастера.
Это если надо именно такое поведение на уровне БД.
В чем я, лично, очень сомневаюсь. Ибо если в документе надо одну строку удалить, а другую вставить, то порядок, в котором это будет сделано, вообще говоря, неважен. Добавьте еще условие, что у мастера ровно одна деталь - получите полный П.
...
Рейтинг: 0 / 0
14.11.2007, 14:36
    #34938720
Сергей Васкецов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Временое отключение триггера
Гость74Само сообщение без хотя бы одного получателя существовать не может
Запросто. Оно не может быть отправлено . Разницу чувствуете?
...
Рейтинг: 0 / 0
16.11.2007, 09:04
    #34943716
Гость74
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Временое отключение триггера
>Запросто. Оно не может быть отправлено. Разницу чувствуете

Чувствую. Только вы условие задачи до конца не знаете :-)
...
Рейтинг: 0 / 0
16.11.2007, 10:10
    #34943887
Сергей Васкецов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Временое отключение триггера
Гость74>Запросто. Оно не может быть отправлено. Разницу чувствуете
Чувствую. Только вы условие задачи до конца не знаете :-)
Потому что его кто-то не описал до конца?
...
Рейтинг: 0 / 0
16.11.2007, 22:06
    #34946378
kittn2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Временое отключение триггера
Гость74. Какие проблемы? Сделайте ХП, удалите сначала в ней записи из детайл, а потом - из мастер. Тригер отработает правильно.. Это называется - каскадное удалени. Однако это в 99% случаев нарушит объективную информацию. Не целостность базы, а именно информацию. Было что-то - и пропало. Я, как всегда, считаю, что удаление нужно только для ошибочно введенных записей. И на них ограничения по удалению обычно не распространяются. Потому что нормальный оператор удалит ошибку из мастер до того, как к нему привязали детайл.
...
Рейтинг: 0 / 0
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Временое отключение триггера / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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