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. Пересмотрите циклические зависимости в модели данных.
Ещё по этой СУБД
- 1101Could not allocate a new page because of insufficient disk space in filegroup
- 3729Cannot DROP because it is being referenced by object
- 3961Snapshot isolation transaction failed because the object was modified by a DDL statement
- 9421XML parsing: illegal xml character
- 15151Cannot find the object/principal because it does not exist or you do not have permission
- 4834You do not have permission to use the bulk load statement
- 10928Resource limit for the database has been reached (Azure SQL)