Противоречивые CASCADE и RESTRICT иностранных ключевых требований?

голоса
2

Я работаю в базе данных, которая отслеживает файлы и зависимости в проектах. Короче говоря, у меня есть две основные таблицы; списки ПРОЕКТОВ табличных имен проектов и другие свойства, таблица ФАЙЛОВ списка файлов. Каждые точки входа файла в проект в качестве внешнего ключа установлен в CASCADE, так что если я удалить запись проекта из базы данных, все файловые записи исчезают, а также. Все идет нормально.

Теперь у меня есть дополнительная таблица зависимостей. Каждая запись в таблице зависимостей два файла, указав, что первый файл зависит от второго. Опять эти внешние ключи, первый установлен в CASCADE (так, если удалить запись файла, эта запись будет удалена), но второй установлен в RESTRICT (так что я не имею право удалить запись файла, если какие-либо другие файлы в зависимости в теме). Опять же, все, кажется, хорошо.

К сожалению, я, кажется, уже не могу удалить проект с помощью одного SQL удалить заявление! В Удалять пытаюсь каскадно-удалять файлы, но если они присутствуют в таблице зависимостей, Ограничить внешний ключ предотвращает удаление (несмотря на то, что запись в таблице зависимостей будет удалена, потому что другой столбец CASCADE). Единственный способ решения проблемы у меня есть, чтобы вычислить точный порядок, чтобы удалить файлы, поэтому ни одна из записей зависимостей ограничений не нарушаются, и удалить файл записи по одному за раз, прежде чем пытаться удалить проект.

Есть ли способ, чтобы создать свою схему базы данных таким образом один SQL удалить из таблицы проектов будет правильно каскад других удалений? Я использую Firebird 2.1, но я не знаю, если это делает никакой разницы - кажется, что там должен быть способ сделать эту работу?

Задан 09/12/2008 в 19:51
источник пользователем
На других языках...                            


2 ответов

голоса
4

Вы не можете контролировать порядок удаления через каскадный внешний ключ, но вы можете быть в состоянии спроектировать триггер PROJECTSдля удаления строк в FILESтом , что принадлежит к этому проекту и также перечислено в DEPENDENCIESкачестве зависимого от других FILES. Сделать это BEFORE DELETEтриггер, так что он должен выполнить перед каскадом эффектов.

Что-то вроде этого:

CREATE TRIGGER Del_Child_Files FOR PROJECTS
BEFORE INSERT IGNORE 
AS BEGIN
  FOR SELECT F.FILE_ID FROM FILES F JOIN DEPENDENCIES D 
      ON F.FILE_ID = D.CHILD_ID
    WHERE F.PROJECT_ID = OLD.PROJECT_ID
    INTO :file_id
  DO
    DELETE FROM FILES WHERE FILE_ID = :file_id;
  DONE
END

Поэтому при удалении проекта, это удаляет все «дочерние» файлы проекта, которые зависят от других файлов, и это каскады удалять строки в DEPENDENCIESтак все остальные файлы свободны от зависимостей. Ваше удаление проекта теперь может каскадно удалить эти файлы.

Я не проверял это и мой Firebird синтаксис может быть ржавым, но, возможно, это будет вам начать.

Очевидно, пожалуйста, проверить это на копии ваших данных, а не живые данные!

Ответил 09/12/2008 в 20:24
источник пользователем

голоса
0

отложила ли система поддержки ограничений, в которых проверочное ограничении не может быть отложены до коммита точки?

Может быть, это просто Oracle вещь, хотя.

Ответил 09/12/2008 в 20:11
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more