Forums Últimos mensajes - Powered by IBM
 

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
 

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


Preguntas similares