1785: Introducing FOREIGN KEY constraint may cause cycles or multiple cascade paths (a constraint FOREIGN KEY pode causar ciclos ou vários caminhos em cascata)
SQL ServerO que significa?
A foreign key que você está adicionando pode criar um ciclo ou vários caminhos de exclusão/atualização em cascata até a mesma tabela em operações em cascata (ON DELETE/UPDATE CASCADE). O SQL Server a rejeita para evitar um comportamento ambíguo em cascata.
Por que acontece?
Uma FK com ação em cascata criando uma referência circular entre tabelas (A->B->A) ou vários caminhos em cascata até uma tabela. O SQL Server não permite isso para evitar uma ordem ambígua de cascata e loops infinitos.
Como resolver
Defina a foreign key como ON DELETE NO ACTION / ON UPDATE NO ACTION (remova a cascata): ALTER TABLE child ADD CONSTRAINT fk ... FOREIGN KEY (...) REFERENCES parent(...) ON DELETE NO ACTION; Implemente a exclusão em cascata necessária com uma trigger INSTEAD OF DELETE: a trigger exclui primeiro as linhas filhas e depois a linha pai (por exemplo, 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;). Uma trigger AFTER DELETE não funciona; a verificação da FK é executada antes da trigger, por isso a exclusão é rejeitada com o erro 547. Revise as dependências circulares no modelo de dados.
Mais entradas deste banco
- 1101Could not allocate a new page because of insufficient disk space in filegroup (não foi possível alocar uma nova página por falta de espaço em disco no filegroup)
- 3729Cannot DROP because it is being referenced by object (não é possível remover porque outro objeto o referencia)
- 3961Snapshot isolation transaction failed because the object was modified by a DDL statement (a transação snapshot falhou porque um comando DDL modificou o objeto)
- 9421XML parsing: illegal xml character
- 15151Cannot find the object/principal because it does not exist or you do not have permission (o objeto/principal não foi encontrado porque não existe ou você não tem permissão)
- 4834You do not have permission to use the bulk load statement (você não tem permissão para usar o comando de carga em massa)
- 10928Resource limit for the database has been reached (Azure SQL) (o limite de recursos do banco foi atingido)