DBAtlas · Атлас эксплуатации баз данных

1785: Introducing FOREIGN KEY constraint may cause cycles or multiple cascade paths

SQL Server

Что это значит?

Добавляемый внешний ключ может создать цикл или несколько путей каскадного удаления/обновления к одной и той же таблице при каскадных операциях (ON DELETE/UPDATE CASCADE). SQL Server отклоняет его, чтобы избежать неоднозначного каскадного поведения.

Почему возникает?

FK с каскадным действием, создающий циклическую ссылку между таблицами (A->B->A) или несколько каскадных путей к одной таблице. SQL Server запрещает это, чтобы предотвратить неоднозначный порядок каскада и бесконечные циклы.

Как исправить

Определите внешний ключ как ON DELETE NO ACTION / ON UPDATE NO ACTION (уберите каскад): ALTER TABLE child ADD CONSTRAINT fk ... FOREIGN KEY (...) REFERENCES parent(...) ON DELETE NO ACTION; Реализуйте необходимое каскадное удаление с помощью триггера INSTEAD OF DELETE: триггер сначала удаляет дочерние строки, затем родительскую строку (например, DELETE c FROM child c JOIN deleted d ON c.parent_id = d.id; DELETE e FROM parent e JOIN deleted d ON e.id = d.id;). Триггер AFTER DELETE не подойдёт: проверка FK выполняется до триггера, поэтому удаление отклоняется с ошибкой 547. Пересмотрите циклические зависимости в модели данных.

Открыть в DBAtlas →

Ещё по этой СУБД