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