Несколько FK с ON DELETE CASCADE в одну и ту же таблицу (MSSQL2008)

Я столкнулся с проблемой, описанной KB321843 и этот вопрос. Оба говорят только о MS SQL Server 2005 (или старше), а я использую 2008 год.

Я действительно надеялся, что это будет исправлено в последних версиях, но похоже, что это не так. Может ли кто-нибудь подтвердить это (или, лучше сказать, как я могу заставить его работать)?


person David Schmitt    schedule 09.07.2009    source источник


Ответы (1)


Это не может быть исправлено.

Что, если вы укажете один каскад в таблице как NULL, другой - DELETE. Как это можно решить?

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

person gbn    schedule 09.07.2009
comment
Семантика, которую я хочу, очень проста: у меня есть ссылка на себя N: M в отдельной таблице. В этой таблице есть два FK для исходной таблицы, и если я удалю одну из записей в основной таблице, мне больше не понадобятся соединения с другими элементами. Даже в смешанном случае NULL и DELETE возможна прямая реализация. Postgres 8.1, например, не имеет абсолютно никаких проблем с этим вариантом использования и ВСЕГО работает так, как ожидалось. - person David Schmitt; 09.07.2009
comment
Для данной таблицы соединений (X, Y), где X указывает ON DELETE CASCADE, а Y указывает ON DELETE SET NULL и содержит кортежи (3,2) и (2,3). После удаления кортежа с id = 3 в указанной таблице таблица соединений будет содержать (2, NULL). Что ему еще делать ?! - person David Schmitt; 10.07.2009
comment
Удалите (3,2), он должен попытаться сделать оба: удалить кортеж (2, 3) из-за ON DELETE CASCADE и изменить его на (2, NULL) из-за ON DELETE SET NULL = конфликт. А как быть с удалением, где id ‹4? - person gbn; 10.07.2009
comment
ON DELETE - это атрибут предложения REFERENCES. Таким образом, реализация точно знает, на какой FK следует воздействовать. Также я не вижу конфликта при установке одного из FK в NULL и (затем) удалении кортежа из-за другого. - person David Schmitt; 26.08.2009
comment
Придется просто не согласиться. Мой пример удаления, где id ‹4 фиксирует его для меня. - person gbn; 26.08.2009