Compartir a través de


MSSQLSERVER_1785

Se aplica a: SQL Server

Detalles

Attribute Valor
Nombre del producto SQL Server
Id. de evento 1785
Origen de eventos MSSQLSERVER
Componente SQLEngine
Nombre simbólico CRTFKINVTOPO
Texto del mensaje Si especifica la restricción FOREIGN KEY "%.ls" en la tabla "%.ls", podrían producirse ciclos o múltiples rutas en cascada. Especifique ON DELETE NO ACTION o UPDATE NO ACTION, o bien modifique otras restricciones FOREIGN KEY.

Explicación

Recibe este mensaje de error porque, en SQL Server, una tabla no puede aparecer más de una vez en una lista de todas las acciones referenciales en cascada iniciadas por una instrucción DELETE o UPDATE. El árbol de acciones referenciales en cascada solo debe tener una ruta de acceso a una tabla determinada en el árbol de acciones referenciales en cascada.

El usuario recibe un mensaje de error similar al siguiente:

Servidor: Msg 1785, Level 16, State 1, Line 1 Introducing FOREIGN KEY constraint 'fk_two' on table 'table2' puede provocar ciclos o varias rutas de acceso en cascada. Especifique ON DELETE NO ACTION o UPDATE NO ACTION, o bien modifique otras restricciones FOREIGN KEY. Servidor: msg 1750, nivel 16, estado 1, línea 1 No se pudo crear la restricción. Consulte los errores anteriores

Acción del usuario

Para resolver este problema, cree una clave externa que cree una ruta de acceso única a una tabla en una lista de acciones referenciales en cascada.

Puede aplicar la integridad referencial de varias maneras. La integridad referencial declarativa (DRI) es la forma más básica, pero también la menos flexible. Si necesita más flexibilidad, pero aún desea un alto grado de integridad, puede usar desencadenadores en su lugar.

Información adicional

El código de ejemplo siguiente es un ejemplo de un intento de creación de FOREIGN KEY que genera el mensaje de error:

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 también

Integridad referencial en cascada