Error de: "ciclos o múltiples rutas de cascada"

11/09/2006 - 22:47 por Rolandpish | Informe spam
Hola. Muchas gracias por su tiempo.
Tengo un gran problema con SQL Server 2000 (versión en Inglés).

Mis tablas son estas: (USUARIOS y SOLICITUDES):

USUARIOS (
[LOGIN] [varchar] (10) NOT NULL ,
[NOMBRE] [varchar] (20) NOT NULL
)

en donde LOGIN es mi llave primaria.

El problema viene cuando trato de crear la tabla SOLICITUDES.
El funcionamiento de las solicitudes es el siguiente: un usuario digita la
solicitud para que sea guardada en la base de datos. Un par de días después,
otro usuario aprueba dicha solicitud. Esto me implica el usar en mi tabla
SOLICITUDES dos llaves foráneas referenciando a la tabla USUARIOS: una para
el usuario que digita y otra para el usuario que aprueba.

Pues esta es la porción de código para crear la tabla SOLICITUDES:
(nótese que el campo APROBADA_POR es una llave foránea que puede ser NULL ya
que en el momento de guardar la solicitud no existe el usuario que aprueba)

CREATE TABLE SOLICITUDES (
[ID] [numeric](5, 0) NOT NULL ,
[FECHA] [datetime] NOT NULL ,
[NOTAS] [varchar] (100) NOT NULL ,
[DIGITADA_POR] [varchar] (10) NOT NULL ,
[APROBADA_POR] [varchar] (10) NULL
) ON [PRIMARY]
GO

ALTER TABLE SOLICITUDES ADD
CONSTRAINT [PK__SOLICITUDES__07DE5BCC] PRIMARY KEY (
[ID]
) ON [PRIMARY]
GO

ALTER TABLE SOLICITUDES ADD
CONSTRAINT [FK__SOLICITUDES__DIG__15702E88] FOREIGN KEY (
[DIGITADA_POR]
) REFERENCES [USUARIOS] ( [LOGIN] ) ON UPDATE CASCADE ,
CONSTRAINT [FK__SOLICITUDES__APR__12742E08] FOREIGN KEY (
[APROBADA_POR] ) REFERENCES [USUARIOS] ( [LOGIN] ) ON UPDATE CASCADE


y el siguiente error ocurre:

Introducing FOREIGN KEY constraint 'FK__REQUESTS__APR__12742E08' on table
'REQUESTS' may cause cycles or multiple cascade paths. Specify ON DELETE NO
ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints.
Could not create constraint. See previous errors.


Bien, luego de esto hice una nueva tabla llamada APROBACIONES con dos
campos: SOLICITUD_ID y APROBADA_POR para así no declarar el campo
APROBADA_POR (ni su constraint) en la tabla SOLICITUDES. Así cuando una
solicitud es aprobada, se crea un nuevo registro en APROBACIONES y listo.
Pero, cuando ejecuto el script me vuelve a dar el mismo error.

Yo realmente sé lo que SQL Server quiere decir con "ciclos" o "múltiples
rutas de cascada" y las relaciones circulares que pueden ocurrir. Pero siento
que en este caso no hay nada de eso. Lo que sucede es simplemente dos llaves
foráneas referenciando a la misma tabla.

Alguien podría ayudarme a saber qué sucede y cómo puedo solucionarlo?

Les agradezo muchísimo
Un saludo
 

Leer las respuestas

#1 Rolandpish
11/09/2006 - 23:37 | Informe spam
Muchísimas gracias por tu ayuda Jorge.
El problema que tengo es que si le quito el ON UPDATE pierdo la integridad
referencial a ese campo. Lo que quiero evitar es programar la integridad
referencial dentro del lenguaje de programación.

Podré corregir esto con triggers? (no tengo experiencia con triggers)

Gracias
Un saludo

"Jorge González" wrote:

Estimado Rolandpish

SQL SERVER no logra manejar un UPDATE en cascada en dos relaciones
simultáneas entre las misma tabla y ese es tu caso.

Ambas relaciones tienen ON UPDATE CASCADE, lo cual significa que si
actualizás un LOGIN, sql server debe "cascadear" el update a la tabla de
solicitudes "2 veces" por decirlo de esa manera (ya que hay 2 relaciones que
tienen indicado hacerlo así). Para corregir el problema podés eliminar el ON
UPDATE CASCADE de una o ambas relaciones y ya no vas a tener el problema.

Espero que la info te haya sido de utilidad

saludos

"Rolandpish" escribió en el mensaje
news:
> Hola. Muchas gracias por su tiempo.
> Tengo un gran problema con SQL Server 2000 (versión en Inglés).
>
> Mis tablas son estas: (USUARIOS y SOLICITUDES):
>
> USUARIOS (
> [LOGIN] [varchar] (10) NOT NULL ,
> [NOMBRE] [varchar] (20) NOT NULL
> )
>
> en donde LOGIN es mi llave primaria.
>
> El problema viene cuando trato de crear la tabla SOLICITUDES.
> El funcionamiento de las solicitudes es el siguiente: un usuario digita la
> solicitud para que sea guardada en la base de datos. Un par de días
> después,
> otro usuario aprueba dicha solicitud. Esto me implica el usar en mi tabla
> SOLICITUDES dos llaves foráneas referenciando a la tabla USUARIOS: una
> para
> el usuario que digita y otra para el usuario que aprueba.
>
> Pues esta es la porción de código para crear la tabla SOLICITUDES:
> (nótese que el campo APROBADA_POR es una llave foránea que puede ser NULL
> ya
> que en el momento de guardar la solicitud no existe el usuario que
> aprueba)
>
> CREATE TABLE SOLICITUDES (
> [ID] [numeric](5, 0) NOT NULL ,
> [FECHA] [datetime] NOT NULL ,
> [NOTAS] [varchar] (100) NOT NULL ,
> [DIGITADA_POR] [varchar] (10) NOT NULL ,
> [APROBADA_POR] [varchar] (10) NULL
> ) ON [PRIMARY]
> GO
>
> ALTER TABLE SOLICITUDES ADD
> CONSTRAINT [PK__SOLICITUDES__07DE5BCC] PRIMARY KEY (
> [ID]
> ) ON [PRIMARY]
> GO
>
> ALTER TABLE SOLICITUDES ADD
> CONSTRAINT [FK__SOLICITUDES__DIG__15702E88] FOREIGN KEY (
> [DIGITADA_POR]
> ) REFERENCES [USUARIOS] ( [LOGIN] ) ON UPDATE CASCADE ,
> CONSTRAINT [FK__SOLICITUDES__APR__12742E08] FOREIGN KEY (
> [APROBADA_POR] ) REFERENCES [USUARIOS] ( [LOGIN] ) ON UPDATE CASCADE
>
>
> y el siguiente error ocurre:
>
> Introducing FOREIGN KEY constraint 'FK__REQUESTS__APR__12742E08' on table
> 'REQUESTS' may cause cycles or multiple cascade paths. Specify ON DELETE
> NO
> ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints.
> Could not create constraint. See previous errors.
>
>
> Bien, luego de esto hice una nueva tabla llamada APROBACIONES con dos
> campos: SOLICITUD_ID y APROBADA_POR para así no declarar el campo
> APROBADA_POR (ni su constraint) en la tabla SOLICITUDES. Así cuando una
> solicitud es aprobada, se crea un nuevo registro en APROBACIONES y listo.
> Pero, cuando ejecuto el script me vuelve a dar el mismo error.
>
> Yo realmente sé lo que SQL Server quiere decir con "ciclos" o "múltiples
> rutas de cascada" y las relaciones circulares que pueden ocurrir. Pero
> siento
> que en este caso no hay nada de eso. Lo que sucede es simplemente dos
> llaves
> foráneas referenciando a la misma tabla.
>
> Alguien podría ayudarme a saber qué sucede y cómo puedo solucionarlo?
>
> Les agradezo muchísimo
> Un saludo
>



Preguntas similares