MSSQLSERVER_1785

Aplica-se a: SQL Server

Details

Attribute Valor
Nome do Produto SQL Server
ID do Evento 1785
Origem do evento MSSQLSERVER
Componente SQLEngine
Nome simbólico CRTFKINVTOPO
Texto da mensagem Introduzir a restrição de CHAVE ESTRANHA '%.ls' na tabela '%.ls' pode causar ciclos ou múltiplos caminhos em cascata. Especifique SEM DELETE AÇÃO ou SEM UPDATE AÇÃO, ou modifique outras restrições de CHAVE ESTRANGEIRA.

Explanation

Recebes esta mensagem de erro porque, no SQL Server, uma tabela não pode aparecer mais do que uma vez numa lista de todas as ações referenciais em cascata que são iniciadas por uma DELETE ou uma UPDATE instrução. A árvore de ações referenciais em cascata deve ter apenas um caminho para uma tabela particular na árvore de ações referenciais em cascata.

Uma mensagem de erro como a seguinte é reportada ao utilizador:

Servidor: Msg 1785, Nível 16, Estado 1, Linha 1 Introduzir a restrição de CHAVE ESTRANHA 'fk_two' na tabela 'table2' pode causar ciclos ou múltiplos caminhos em cascata. Especifique SEM DELETE AÇÃO ou SEM UPDATE AÇÃO, ou modifique outras restrições de CHAVE ESTRANGEIRA. Servidor: Msg 1750, Nível 16, Estado 1, Linha 1 Não foi possível criar restrição. Ver erros anteriores

Ação do usuário

Para resolver este problema, crie uma chave estrangeira que crie um único caminho para uma tabela numa lista de ações referenciais em cascata.

Podes impor a integridade referencial de várias formas. A Integridade Referencial Declarativa (DRI) é a forma mais básica, mas também a menos flexível. Se precisares de mais flexibilidade, mas ainda assim queres um alto grau de integridade, podes usar gatilhos em vez disso.

Mais informações

O seguinte código de exemplo é um exemplo de tentativa de criação de CHAVE ESTRANGEIRA que gera a mensagem de erro:

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.

Consulte também

Integridade Referencial em Cascata