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.