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

Preguntas similare

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
>



Respuesta Responder a este mensaje
#2 Jorge González
12/09/2006 - 00:29 | Informe spam
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

Respuesta Responder a este mensaje
#3 Jorge González
12/09/2006 - 01:55 | Informe spam
Rolandpish

la integridad referencial no depende de la opción ON UPDATE CASCADE ni de la
opción (equivalente para delete) ON DELETE CASCADE.

Si quitás esa opción lo que está haciendo es que el update no se propague a
través de la relación. Pero la integridad referencial sigue presente y
válida. Recordá que la presencia del constraint es la que enforza la
integridad referencia. Las opciones de actualización y borrado en cascada
son sólo digamos "un valor agregado" configurable.

No te recomendaría usar integridad referencial con TRIGGERS porque es un
tanto engorroso y mucho menos eficiente. Sí te recomiendo evaluar las
razones por las cuales querés hacer uso de UPDATE en cascada, ya que si no
se controla esta opción, puede ser peligrosa y llevar a errores
involuntarios que corromperían tus datos.

chequeá la documentación sobre ON UPDATE CASCADE e integridad referencial y
cualquier duda sigo a la orden.

saludos


"Rolandpish" escribió en el mensaje
news:
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
>



email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida