Compartilhar via


MSSQLSERVER_1785

Aplica-se: SQL Server

Detalhes

Atributo Valor
Nome do produto SQL Server
ID do evento 1785
Origem do Evento MSSQLSERVER
Componente SQLEngine
Nome simbólico CRTFKINVTOPO
Texto da mensagem A introdução da restrição FOREIGN KEY '%.ls' na tabela '%.ls' pode causar ciclos ou vários caminhos em cascata. Especifique ON DELETE NO ACTION ou ON UPDATE NO ACTION, ou modifique outras restrições FOREIGN KEY.

Explicação

Você recebe essa mensagem de erro porque, no SQL Server, uma tabela não pode aparecer mais de uma vez em uma lista de todas as ações referenciais em cascata que são iniciadas por uma instrução DELETE ou UPDATE. A árvore de ações referenciais em cascata precisa ter apenas um caminho para uma tabela específica na árvore de ações referenciais em cascata.

Uma mensagem de erro semelhante à seguinte é relatada ao usuário:

Servidor: Msg 1785, Nível 16, Estado 1, Linha 1 A introdução da restrição FOREIGN KEY 'fk_two' na tabela 'table2' pode causar ciclos ou vários caminhos em cascata. Especifique ON DELETE NO ACTION ou ON UPDATE NO ACTION, ou modifique outras restrições FOREIGN KEY. Servidor: Msg 1750, Nível 16, Estado 1, Linha 1 Não foi possível criar restrição. Confira os erros anteriores

Ação do usuário

Para resolver esse problema, crie uma chave estrangeira que criará um só caminho para uma tabela em uma lista de ações referenciais em cascata.

Imponha a integridade referencial de várias maneiras. A DRI (integridade referencial declarativa) é a maneira mais básica, mas também é a menos flexível. Caso precise obter mais flexibilidade, mas ainda queira ter alto grau de integridade, use gatilhos.

Mais informações

O seguinte código de exemplo é um exemplo de uma tentativa de criação de FOREIGN KEY 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.

Confira também

Integridade referencial em cascata