Error con eliminación en cascada

13/07/2006 - 14:34 por j.rabaso | Informe spam
Hola,

Tengo una tabla "Productos" y otra que es "Agrupación". Donde cada
producto
se puede agrupar con ninguno , uno o muchos productos, y tambien guardo
un
histórico de agrupación.

Productos(id, cRefer) à Clave principal "id"

Agrupación(id, idProd1, idProd2, dFecha) à Clave principal "id" y
clave única "idProd1+idProd2+dFecha"

Ejemplo:

Producto (1, "12345")
Producto (2, "54321")
Producto (3, "56789")
Producto (4, "98765")
Producto (5, "11223")
Producto (6, "22334")

Agrupacion(1, 1, 2, 02/01/2005)
Agrupacion(1, 1, 2, 12/07/2006)
Agrupacion(1, 1, 3, 12/07/2006)
Agrupacion(1, 4, 4, 12/07/2006) Es decir, que no se agrupa con nadie
Agrupacion(1, 5, 6, 12/07/2006)

Si con SqlServer Express 2005 hago la relación:

Agrupacion.idProd1 con Producto.id y digo que actualice y elimine en
cascada
toda va bien, pero si añado una nueva relación Agrupacion.idProd2 con

Producto.id y digo que actualice y elimine en cascada me da un error y
dice
que se producirían ciclo esn cascada. Como puedo crear estas
relaciones,
para asegurar que si eliminan un registro de la tabla "Producto"
tambien se
eliminirá de la tabla "Composición"?

Gracias

Preguntas similare

Leer las respuestas

#1 Alejandro Mesa
13/07/2006 - 14:52 | Informe spam
,

Analizemos este ejemplo:

Agrupacion(?, 4, 5, 12/07/2006)
Agrupacion(?, 5, 6, 13/07/2006)

Si eliminamos (4, 5), entonces queremos eliminar los productos 4 y 5 en la
tabla [productos]. Si eliminamos el producto 5 en la tabla [productos]
entonces habra que eliminar la agrupacion (5, 6) en la tabla [agrupacion] y
asi sucesivamente. Ves por que SQL Server se niega a crear este tipo de
borrado y/o actualizacion en cascada, pues como SQL Server infiere, se esta
creando multiples caminos en la cascada.

Ejemplo:

create table dbo.t1 (
c1 int not null unique
)
go

create table dbo.t2 (
c1 int not null,
c2 int not null
)
go

alter table dbo.t2
add constraint fk_t2_t1_c1 foreign key (c1) references dbo.t1(c1)
on delete cascade
on update cascade
go

alter table dbo.t2
add constraint fk_t2_t1_c2 foreign key (c2) references dbo.t1(c1)
on delete cascade
on update cascade
go

drop table dbo.t2, dbo.t1
go

En estos casos, la actualizacion y/o borrado en cascada se tendra que hacer
por codigo y por lo tanto no puedes usar DRI ya que estas son evaluadas en
primer lugar.


AMB

"" wrote:

Hola,

Tengo una tabla "Productos" y otra que es "Agrupación". Donde cada
producto
se puede agrupar con ninguno , uno o muchos productos, y tambien guardo
un
histórico de agrupación.

Productos(id, cRefer) à Clave principal "id"

Agrupación(id, idProd1, idProd2, dFecha) à Clave principal "id" y
clave única "idProd1+idProd2+dFecha"

Ejemplo:

Producto (1, "12345")
Producto (2, "54321")
Producto (3, "56789")
Producto (4, "98765")
Producto (5, "11223")
Producto (6, "22334")

Agrupacion(1, 1, 2, 02/01/2005)
Agrupacion(1, 1, 2, 12/07/2006)
Agrupacion(1, 1, 3, 12/07/2006)
Agrupacion(1, 4, 4, 12/07/2006) Es decir, que no se agrupa con nadie
Agrupacion(1, 5, 6, 12/07/2006)

Si con SqlServer Express 2005 hago la relación:

Agrupacion.idProd1 con Producto.id y digo que actualice y elimine en
cascada
toda va bien, pero si añado una nueva relación Agrupacion.idProd2 con

Producto.id y digo que actualice y elimine en cascada me da un error y
dice
que se producirían ciclo esn cascada. Como puedo crear estas
relaciones,
para asegurar que si eliminan un registro de la tabla "Producto"
tambien se
eliminirá de la tabla "Composición"?

Gracias


Respuesta Responder a este mensaje
#2 Alejandro Mesa
13/07/2006 - 15:01 | Informe spam
Corrección,

Si eliminamos (4, 5), entonces queremos eliminar los productos 4 y 5 en la
tabla [productos]. Si eliminamos el producto 5 en la tabla [productos]
entonces habra que eliminar la agrupacion (5, 6) en la tabla [agrupacion] y
asi sucesivamente. Ves por que SQL Server se niega a crear este tipo de
borrado y/o actualizacion en cascada, pues como SQL Server infiere, se esta
creando multiples caminos en la cascada.



Si eliminamos el producto 5 en la tabla [productos], entonces debemos
eliminar la agrupacion (4, 5) y la agrupacion (5, 6). Como vez, se deben usar
diferentes caminos.


AMB

"Alejandro Mesa" wrote:

,

Analizemos este ejemplo:

Agrupacion(?, 4, 5, 12/07/2006)
Agrupacion(?, 5, 6, 13/07/2006)

Si eliminamos (4, 5), entonces queremos eliminar los productos 4 y 5 en la
tabla [productos]. Si eliminamos el producto 5 en la tabla [productos]
entonces habra que eliminar la agrupacion (5, 6) en la tabla [agrupacion] y
asi sucesivamente. Ves por que SQL Server se niega a crear este tipo de
borrado y/o actualizacion en cascada, pues como SQL Server infiere, se esta
creando multiples caminos en la cascada.

Ejemplo:

create table dbo.t1 (
c1 int not null unique
)
go

create table dbo.t2 (
c1 int not null,
c2 int not null
)
go

alter table dbo.t2
add constraint fk_t2_t1_c1 foreign key (c1) references dbo.t1(c1)
on delete cascade
on update cascade
go

alter table dbo.t2
add constraint fk_t2_t1_c2 foreign key (c2) references dbo.t1(c1)
on delete cascade
on update cascade
go

drop table dbo.t2, dbo.t1
go

En estos casos, la actualizacion y/o borrado en cascada se tendra que hacer
por codigo y por lo tanto no puedes usar DRI ya que estas son evaluadas en
primer lugar.


AMB

"" wrote:

> Hola,
>
> Tengo una tabla "Productos" y otra que es "Agrupación". Donde cada
> producto
> se puede agrupar con ninguno , uno o muchos productos, y tambien guardo
> un
> histórico de agrupación.
>
> Productos(id, cRefer) à Clave principal "id"
>
> Agrupación(id, idProd1, idProd2, dFecha) à Clave principal "id" y
> clave única "idProd1+idProd2+dFecha"
>
> Ejemplo:
>
> Producto (1, "12345")
> Producto (2, "54321")
> Producto (3, "56789")
> Producto (4, "98765")
> Producto (5, "11223")
> Producto (6, "22334")
>
> Agrupacion(1, 1, 2, 02/01/2005)
> Agrupacion(1, 1, 2, 12/07/2006)
> Agrupacion(1, 1, 3, 12/07/2006)
> Agrupacion(1, 4, 4, 12/07/2006) Es decir, que no se agrupa con nadie
> Agrupacion(1, 5, 6, 12/07/2006)
>
> Si con SqlServer Express 2005 hago la relación:
>
> Agrupacion.idProd1 con Producto.id y digo que actualice y elimine en
> cascada
> toda va bien, pero si añado una nueva relación Agrupacion.idProd2 con
>
> Producto.id y digo que actualice y elimine en cascada me da un error y
> dice
> que se producirían ciclo esn cascada. Como puedo crear estas
> relaciones,
> para asegurar que si eliminan un registro de la tabla "Producto"
> tambien se
> eliminirá de la tabla "Composición"?
>
> Gracias
>
>
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida