Я работаю над базой данных, которая отслеживает файлы и зависимости в проектах. Вкратце, у меня есть две основные таблицы; В таблице PROJECTS перечислены имена проектов и другие свойства, в таблице FILES перечислены файлы. Каждая запись файла указывает на проект в качестве внешнего ключа, установленного в CASCADE, поэтому, если я удаляю запись проекта из базы данных, все записи файла также исчезают. Пока все хорошо.
Теперь у меня есть дополнительная таблица ЗАВИСИМОСТИ. Каждая запись в таблице зависимостей - это два файла, указывающих, что первый файл зависит от второго. Опять же, это внешние ключи, первый установлен на CASCADE (поэтому, если я удаляю запись файла, эта запись удаляется), но второй устанавливается на RESTRICT (поэтому я не могу удалить запись файла, если какие-либо другие файлы зависят в теме). Опять же, все выглядит хорошо.
К сожалению, похоже, я больше не могу удалить проект с помощью одного оператора SQL! Удаление пытается каскадно удалить файлы, но если какой-либо из них появится в таблице DEPENDENCIES, внешний ключ RESTRICT предотвращает удаление (даже если эта запись в таблице зависимостей будет удалена, поскольку другой столбец - CASCADE). Единственный обходной путь, который у меня есть, - это рассчитать точный порядок удаления файлов, чтобы ни одно из ограничений записи зависимостей не нарушалось, и удалять записи файлов по одной перед попыткой удалить проект.
Есть ли способ настроить схему базы данных, чтобы одно удаление SQL из таблицы проектов правильно каскадно удаляло другие? Я использую Firebird 2.1, но я не знаю, имеет ли это какое-то значение - похоже, должен быть способ заставить это работать?