Ошибка ограничения внешнего ключа.

Добрый день.

При замещении базового объекта возникает следующая ошибка:

Ошибка сохранения: Введение ограничения внешнего ключа (FOREIGN KEY) "FK2J2iqfKkMp0jtMuJaM78caLDQY" для таблицы "DocumentProduct" может привести к появлению циклов или множественных каскадных путей. Укажите ON DELETE NO ACTION или ON UPDATE NO ACTION либо измените другие ограничения внешнего ключа (FOREIGN KEY).
Нельзя создать ограничение. См. предыдущие ошибки.

Нашла аналогичный топик:

https://community.terrasoft.ru/forum/topic/11534

Там предлагается делать следующее:

ALTER TABLE DocumentProduct
DROP CONSTRAINT FK2J2iqfKkMp0jtMuJaM78caLDQY

Но у меня в sql возникает другая ошибка:

Сообщение 3728, уровень 16, состояние 1, строка 1
FK2J2iqfKkMp0jtMuJaM78caLDQY не является ограничением.
Сообщение 3727, уровень 16, состояние 0, строка 1
Нельзя удалить ограничение. См. предыдущие ошибки.

Нравится

5 комментариев

Здравствуйте Александра,

обычно такая ошибка в SQL Server Management Studio возникает при втором и больше выполнении срипта на удаление объекта. После первого выполнения скрипта соостветстсвующее ограничение удаляется из системной таблицы sys.foreign_keys. Если выполнить тот же скрипт еще раз, то система не сможет больше найти нужную запись в sys.foreign_keys, поэтом скажет, что данный объект не является ограничением. Пожалуйста перекомпилируйте объект еще раз.

"Александр Ведмидь" написал:

Здравствуйте Александра,

обычно такая ошибка в SQL Server Management Studio возникает при втором и больше выполнении срипта на удаление объекта. После первого выполнения скрипта соостветстсвующее ограничение удаляется из системной таблицы sys.foreign_keys. Если выполнить тот же скрипт еще раз, то система не сможет больше найти нужную запись в sys.foreign_keys, поэтом скажет, что данный объект не является ограничением. Пожалуйста перекомпилируйте объект еще раз.

Компилировала несколько раз, перезапускала IIS, все то же самое.

Пробовала снова создать замещающий объект, без создания новых полей скомпилировать его. Результат тот же.

Здравствуйте Александра,

Разобрался с причиной проблемы на похожем примере с таблицей AccountBillingInfo, дело в том, что базовый AccountBillingInfo содержит поле AccountId, которое ссылается на таблицу Account с каскадным удалением. При замещении объекта система пытается создать такую же каскадную связь для этого поля, что приводит к ошибке, которую мы видим в дизайнере.
Чтобы найти это ограничение выполняем скрипт:

SELECT fk.name [constraint name], obj.name [parent table name], o.name [referenced table name]
FROM sys.foreign_keys fk
INNER JOIN sys.objects o
ON fk.referenced_object_id = o.object_id
INNER JOIN sys.objects obj
ON fk.parent_object_id = obj.object_id
WHERE (fk.delete_referential_action_desc = 'CASCADE' or fk.update_referential_action_desc = 'CASCADE') and obj.name IN ('Account', 'AccountBillingInfo', 'Contact', 'Country')

После чего можем либо удалить найденное ограничение (подставьте найденное имя ограничения)
ALTER TABLE [dbo].[AccountBillingInfo]
drop CONSTRAINT [FKMEzS5qAz0Eo3Zxv0YomqG1h6Js]

либо убрать каскадную связь на удаление

--drop constraint at first
ALTER TABLE [dbo].[AccountBillingInfo]
drop CONSTRAINT [FKMEzS5qAz0Eo3Zxv0YomqG1h6Js]
--create again without cascade actions
ALTER TABLE [dbo].[AccountBillingInfo] WITH CHECK ADD CONSTRAINT [FKMEzS5qAz0Eo3Zxv0YomqG1h6Js] FOREIGN KEY([AccountId])
REFERENCES [dbo].[Account] ([Id])
--ON DELETE CASCADE
GO

И перекомпилировать объект.
Больше ошибка на моей конфигурации не воспроизводилась.

Работает! Огромное спасибо!

Показать все комментарии