borrar en cascada

26/12/2005 - 20:06 por Jose | Informe spam
Hola a todos,

He tenido un lapsus y ahora mismo no recuerdo como se hacia lo siguiente:
Tengo una tabla de bancos y otra de productos bancarios relacionados
1 banco - N productos

Lo que quiero hacer es cuando se borre un banco se borren tambien todos los
productos relacionados con ese banco
he de hacer una subselect para borrar los productos tb o puedo hacer alguna
manera de que cuando se borre un banco se puedan borrar todos los productos
de ese banco automaticamente .

Gracias a todos y felices fiestas.


J.

Preguntas similare

Leer las respuestas

#1 Maxi
26/12/2005 - 21:05 | Informe spam
Hola Jose, ve a las relaciones de la tabla hijo y checkea el tilde de borrar
en cascada. Si lo quieres hacer desde el Query Analizer entonces revisa en
tus libros on line la instruccion ALTER TABLE


Salu2
Maxi [MVP SQL SERVER]


"Jose" escribió en el mensaje
news:OO%
Hola a todos,

He tenido un lapsus y ahora mismo no recuerdo como se hacia lo siguiente:
Tengo una tabla de bancos y otra de productos bancarios relacionados
1 banco - N productos

Lo que quiero hacer es cuando se borre un banco se borren tambien todos
los productos relacionados con ese banco
he de hacer una subselect para borrar los productos tb o puedo hacer
alguna manera de que cuando se borre un banco se puedan borrar todos los
productos de ese banco automaticamente .

Gracias a todos y felices fiestas.


J.

Respuesta Responder a este mensaje
#2 Guillermo Roldán
26/12/2005 - 21:06 | Informe spam
Hola Jose,

Tienes varias maneras de acometer lo que quieres:

1) Utilizar Integridad Refenrencia, con la cláusula ON DELETE CASCADE de las
foreign keys. A mí personalmente no me gusta nada, pues considero más seguro
el borrado explícito por aplicación o por procedimiento almacenado, pero es
una opción muy sencilla.
2) Si todos los accesos a tus datos son a través de procedimientos
almacenados, en el procedimiento almacenado de borrado puedes incluir una
sentencia DELETE con una cláusuala WHERE MY_ID=@MY_ID, donde MY_ID es un
campo que hace de clave primaria o índice único. En este escenario, podrías
incluir un parámetro en tu procedimiento almacenado como @BORRA_CASCADA que
si es igual a 1 ejecuta el DELETE, y en caso contrario no lo ejecuta, por
darle versatilidad a tu procedure.
3) Puedes utilizar un TRIGGER que en el evente DELETE ejecute el borrado en
cascada con una sentencia DELETE como la anterior.

Mi preferida es la opción 2 (para mi los triggers... para lo justito nada
más). Te pongo un ejemplo:

CREATE PROCEDURE dbo.DelArticulo
@ART_ID VARCHAR(12),
@FAM_ID CHAR(2),
@SCATA_ID CHAR(2),
@CATA_ID CHAR(2)
WITH ENCRYPTION
AS
BEGIN TRAN

DELETE FROM dbo.PRECIOS_ARTICULOS
WHERE CATA_ID=@CATA_ID
AND SCATA_ID=@SCATA_ID
AND FAM_ID=@FAM_ID
AND ART_ID=@ART_ID

IF @@ERROR <> 0
BEGIN
PRINT 'Se produjeron errores al borrar los Precios de los Artículos
en Cascada.'
ROLLBACK TRAN
RETURN -1
END

DELETE dbo.ARTICULOS
WHERE CATA_ID=@CATA_ID
AND SCATA_ID=@SCATA_ID
AND FAM_ID=@FAM_ID
AND ART_ID=@ART_ID

IF @@ERROR <> 0
BEGIN
PRINT 'Se produjeron errores al eliminar el Artículo.'
ROLLBACK TRAN
RETURN -1
END

COMMIT TRAN

RETURN 0
GO

Saludos,
Guillermo

"Jose" escribió en el mensaje
news:OO#
Hola a todos,

He tenido un lapsus y ahora mismo no recuerdo como se hacia lo siguiente:
Tengo una tabla de bancos y otra de productos bancarios relacionados
1 banco - N productos

Lo que quiero hacer es cuando se borre un banco se borren tambien todos


los
productos relacionados con ese banco
he de hacer una subselect para borrar los productos tb o puedo hacer


alguna
manera de que cuando se borre un banco se puedan borrar todos los


productos
de ese banco automaticamente .

Gracias a todos y felices fiestas.


J.


Respuesta Responder a este mensaje
#3 Jose
27/12/2005 - 00:08 | Informe spam
Solo puedo deciros, que muchisimas gracias por los consejos. Me apunto
vuestros consejos para evitar futuros lapsus !!

gracias !!!

J.

"Guillermo Roldán" escribió en el
mensaje news:%
Hola Jose,

Tienes varias maneras de acometer lo que quieres:

1) Utilizar Integridad Refenrencia, con la cláusula ON DELETE CASCADE de
las
foreign keys. A mí personalmente no me gusta nada, pues considero más
seguro
el borrado explícito por aplicación o por procedimiento almacenado, pero
es
una opción muy sencilla.
2) Si todos los accesos a tus datos son a través de procedimientos
almacenados, en el procedimiento almacenado de borrado puedes incluir una
sentencia DELETE con una cláusuala WHERE MY_ID=@MY_ID, donde MY_ID es un
campo que hace de clave primaria o índice único. En este escenario,
podrías
incluir un parámetro en tu procedimiento almacenado como @BORRA_CASCADA
que
si es igual a 1 ejecuta el DELETE, y en caso contrario no lo ejecuta, por
darle versatilidad a tu procedure.
3) Puedes utilizar un TRIGGER que en el evente DELETE ejecute el borrado
en
cascada con una sentencia DELETE como la anterior.

Mi preferida es la opción 2 (para mi los triggers... para lo justito nada
más). Te pongo un ejemplo:

CREATE PROCEDURE dbo.DelArticulo
@ART_ID VARCHAR(12),
@FAM_ID CHAR(2),
@SCATA_ID CHAR(2),
@CATA_ID CHAR(2)
WITH ENCRYPTION
AS
BEGIN TRAN

DELETE FROM dbo.PRECIOS_ARTICULOS
WHERE CATA_ID=@CATA_ID
AND SCATA_ID=@SCATA_ID
AND FAM_ID=@FAM_ID
AND ART_ID=@ART_ID

IF @@ERROR <> 0
BEGIN
PRINT 'Se produjeron errores al borrar los Precios de los
Artículos
en Cascada.'
ROLLBACK TRAN
RETURN -1
END

DELETE dbo.ARTICULOS
WHERE CATA_ID=@CATA_ID
AND SCATA_ID=@SCATA_ID
AND FAM_ID=@FAM_ID
AND ART_ID=@ART_ID

IF @@ERROR <> 0
BEGIN
PRINT 'Se produjeron errores al eliminar el Artículo.'
ROLLBACK TRAN
RETURN -1
END

COMMIT TRAN

RETURN 0
GO

Saludos,
Guillermo

"Jose" escribió en el mensaje
news:OO#
Hola a todos,

He tenido un lapsus y ahora mismo no recuerdo como se hacia lo siguiente:
Tengo una tabla de bancos y otra de productos bancarios relacionados
1 banco - N productos

Lo que quiero hacer es cuando se borre un banco se borren tambien todos


los
productos relacionados con ese banco
he de hacer una subselect para borrar los productos tb o puedo hacer


alguna
manera de que cuando se borre un banco se puedan borrar todos los


productos
de ese banco automaticamente .

Gracias a todos y felices fiestas.


J.






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