Поделиться через


MSSQLSERVER_1785

Область применения: SQL Server

Сведения

Атрибут Значение
Название продукта SQL Server
ИД события 1785
Источник событий MSSQLSERVER
Компонент SQLEngine
Символическое имя CRTFKINVTOPO
Текст сообщения Введение ограничения FOREIGN KEY "%.ls" для таблицы "%.ls" может привести к появлению циклов или множественных каскадных путей. Укажите ON DELETE NO ACTION или ON UPDATE NO ACTION либо измените другие ограничения внешнего ключа (FOREIGN KEY).

Описание

Это сообщение об ошибке появляется из-за того, что в SQL Server таблица не может появляться более одного раза в списке всех каскадных ссылочных действий, запускаемых инструкцией DELETE или UPDATE. Дерево каскадных ссылочных действий должно иметь только один путь к определенной таблице в дереве каскадных ссылочных действий.

Пользователю выводится сообщение об ошибке наподобие следующего:

Сервер: Msg 1785, Level 16, State 1, Line 1, Ввод ограничения FOREIGN KEY "fk_two" в таблице "table2" может привести к циклам или нескольким каскадным путям. Укажите ON DELETE NO ACTION или ON UPDATE NO ACTION либо измените другие ограничения внешнего ключа (FOREIGN KEY). Сервер: Msg 1750, level 16, State 1, Line 1 Не удалось создать ограничение. См. описание предыдущих ошибок.

Действие пользователя

Чтобы устранить эту проблему, создайте внешний ключ, который создаст один путь к таблице в списке каскадных ссылочных действий.

Обеспечить целостность ссылок можно несколькими способами. Декларативная ссылочная целостность (DRI) — это самый простой, но и наименее гибкий способ. Если требуется большая гибкость с сохранением высокого уровня целостности, можно использовать триггеры.

Дополнительные сведения

Следующий пример кода демонстрирует попытку создания внешнего ключа, которая приводит к сообщению об ошибке:

USE tempdb
GO

CREATE TABLE table1 (user_ID INTEGER NOT NULL PRIMARY KEY, user_name
CHAR(50) NOT NULL)
GO

CREATE TABLE table2 (author_ID INTEGER NOT NULL PRIMARY KEY, author_name
CHAR(50) NOT NULL, lastModifiedBy INTEGER NOT NULL, addedby INTEGER NOT NULL)
GO

ALTER TABLE table2 ADD CONSTRAINT fk_one FOREIGN KEY (lastModifiedby)
REFERENCES table1 (user_ID) ON DELETE CASCADE ON UPDATE cascade
GO

ALTER TABLE table2 ADD CONSTRAINT fk_two FOREIGN KEY (addedby)
REFERENCES table1(user_ID) ON DELETE NO ACTION ON UPDATE cascade
GO
--this fails with the error because it provides a second cascading path to table2.

ALTER TABLE table2 ADD CONSTRAINT fk_two FOREIGN KEY (addedby)
REFERENCES table1 (user_ID) ON DELETE NO ACTION ON UPDATE NO ACTION
GO
-- this works.

См. также

Каскадная целостность ссылок