ELIMINAR REGISTROS EN CASCADA VER. 7.0

11/08/2003 - 20:00 por Yumel Ojeda | Informe spam
Hola Amigos
quisiera saber si tienen alguna rutina de un trigger que elimine en cascada,
ó los hijos de otra tabla antes de borrar el registro de la tabla madre

bye by

Atte. Yumel Ojeda

Preguntas similare

Leer las respuestas

#1 Javier Loria\(MVP\)
12/08/2003 - 04:48 | Informe spam
Hola Yumel:
Si puedes resolver el problema en un procedimiento almacenado te lo
recomiendo, si no puedes piensa en pasarte a SQL 2000 que lo hace
automatico, sino puedes aqui esta el codigo:
/* Inicio de Codigo */
CREATE TABLE TablaMadre
(
PK INT NOT NULL PRIMARY KEY
)

CREATE TABLE TablaHija
(
PKMadre INT NOT NULL,
PKHija INT NOT NULL PRIMARY KEY
)

GO
CREATE TRIGGER Del_TablaMadre
ON dbo.TablaMadre
FOR DELETE
AS
BEGIN
IF EXISTS (SELECT *
FROM DELETED
JOIN TablaHija
ON DELETED.PK=TablaHija.PKMadre)
DELETE TablaHija
FROM DELETED JOIN TablaHija
ON DELETED.PK=TablaHija.PKMadre
END
GO
INSERT TABLAMADRE
VALUES(1)
INSERT TABLAMADRE
VALUES(2)
INSERT TABLAMADRE
VALUES(3)

INSERT TABLAHIJA
VALUES(1,1)
INSERT TABLAHIJA
VALUES(1,2)
INSERT TABLAHIJA
VALUES(1,3)
INSERT TABLAHIJA
VALUES(2,4)
INSERT TABLAHIJA
VALUES(2,5)
INSERT TABLAHIJA
VALUES(2,6)

SELECT * FROM TABLAMADRE
SELECT * FROM TABLAHIJA

DELETE TABLAMADRE
WHERE PK=1

SELECT * FROM TABLAMADRE
SELECT * FROM TABLAHIJA

DROP TABLE TABLAHIJA
DROP TABLE TABLAMADRE
/* Fin de Codigo */

Una nota para que este codigo sea ejecutado NO puede haber INTEGRIDAD
REFERENCIAL DECLARATIVA entre las Tablas :(
Por ende hay que escribir codigo para mantener dicha integridad.

Saludos,


Javier Loria
Costa Rica (MVP)
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.

Yumel Ojeda escribio:
Hola Amigos
quisiera saber si tienen alguna rutina de un trigger que elimine en
cascada, ó los hijos de otra tabla antes de borrar el registro de la
tabla madre

bye by

Atte. Yumel Ojeda
Respuesta Responder a este mensaje
#2 Miguel Egea
12/08/2003 - 08:45 | Informe spam
Gracias Javier, no pude contestarle a nuestro amigo antes justo con este
código, en mi caso yo usaría esta variante
/* código de Javier Modificado y sin probar*/
CREATE TRIGGER Del_TablaMadre
ON dbo.TablaMadre
FOR DELETE
AS
BEGIN
set nocount on
DELETE TablaHija
FROM DELETED JOIN TablaHija
ON DELETED.PK=TablaHija.PKMadre
set nocount off
END
GO
/* fin codigo de javier */


Espero que te sirva.

Saludos
Miguel Egea
http://www.portalsql.com
Sql-Server MVP
"Javier Loria(MVP)" escribió en el mensaje
news:
Hola Yumel:
Si puedes resolver el problema en un procedimiento almacenado te lo
recomiendo, si no puedes piensa en pasarte a SQL 2000 que lo hace
automatico, sino puedes aqui esta el codigo:
/* Inicio de Codigo */
CREATE TABLE TablaMadre
(
PK INT NOT NULL PRIMARY KEY
)

CREATE TABLE TablaHija
(
PKMadre INT NOT NULL,
PKHija INT NOT NULL PRIMARY KEY
)

GO
CREATE TRIGGER Del_TablaMadre
ON dbo.TablaMadre
FOR DELETE
AS
BEGIN
IF EXISTS (SELECT *
FROM DELETED
JOIN TablaHija
ON DELETED.PK=TablaHija.PKMadre)
DELETE TablaHija
FROM DELETED JOIN TablaHija
ON DELETED.PK=TablaHija.PKMadre
END
GO
INSERT TABLAMADRE
VALUES(1)
INSERT TABLAMADRE
VALUES(2)
INSERT TABLAMADRE
VALUES(3)

INSERT TABLAHIJA
VALUES(1,1)
INSERT TABLAHIJA
VALUES(1,2)
INSERT TABLAHIJA
VALUES(1,3)
INSERT TABLAHIJA
VALUES(2,4)
INSERT TABLAHIJA
VALUES(2,5)
INSERT TABLAHIJA
VALUES(2,6)

SELECT * FROM TABLAMADRE
SELECT * FROM TABLAHIJA

DELETE TABLAMADRE
WHERE PK=1

SELECT * FROM TABLAMADRE
SELECT * FROM TABLAHIJA

DROP TABLE TABLAHIJA
DROP TABLE TABLAMADRE
/* Fin de Codigo */

Una nota para que este codigo sea ejecutado NO puede haber INTEGRIDAD
REFERENCIAL DECLARATIVA entre las Tablas :(
Por ende hay que escribir codigo para mantener dicha integridad.

Saludos,


Javier Loria
Costa Rica (MVP)
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.

Yumel Ojeda escribio:
> Hola Amigos
> quisiera saber si tienen alguna rutina de un trigger que elimine en
> cascada, ó los hijos de otra tabla antes de borrar el registro de la
> tabla madre
>
> bye by
>
> Atte. Yumel Ojeda


Respuesta Responder a este mensaje
#3 Miguel Egea
14/08/2003 - 14:06 | Informe spam
Hola Javier, ¿Pecado Mayor?, la verdad es que no veo por qué , ¿que se me
puede estar escapando? Lo digo por ir buscando un sacerdote que me confiese
(lo hago siempre así :-) )



Espero que te sirva.

Saludos
Miguel Egea
http://www.portalsql.com
Sql-Server MVP
"Javier Loria(MVP)" escribió en el mensaje
news:
Hola Miguel:
Entiendo la incorporacion del SET NOCOUNT ON/OFF dentro de un contexto
donde los procedimientos no fijen este parametro y la aplicacion use la
cantidad de filas de retorno, es un cambio que eventualmente favorece al
codigo.
Pero la eliminacion de IF es un PECADO MAYOR y el codigo debe


llevarlo,

Saludos,


Javier Loria
Costa Rica (MVP)
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.

Miguel Egea escribio:
> Gracias Javier, no pude contestarle a nuestro amigo antes justo con
> este código, en mi caso yo usaría esta variante
> /* código de Javier Modificado y sin probar*/
> CREATE TRIGGER Del_TablaMadre
> ON dbo.TablaMadre
> FOR DELETE
> AS
> BEGIN
> set nocount on
> DELETE TablaHija
> FROM DELETED JOIN TablaHija
> ON DELETED.PK=TablaHija.PKMadre
> set nocount off
> END
> GO
> /* fin codigo de javier */
>
>
>
> Saludos
> Miguel Egea
> http://www.portalsql.com
> Sql-Server MVP
> "Javier Loria(MVP)" escribió en el mensaje
> news:
>> Hola Yumel:
>> Si puedes resolver el problema en un procedimiento almacenado te
>> lo recomiendo, si no puedes piensa en pasarte a SQL 2000 que lo hace
>> automatico, sino puedes aqui esta el codigo:
>> /* Inicio de Codigo */
>> CREATE TABLE TablaMadre
>> (
>> PK INT NOT NULL PRIMARY KEY
>> )
>>
>> CREATE TABLE TablaHija
>> (
>> PKMadre INT NOT NULL,
>> PKHija INT NOT NULL PRIMARY KEY
>> )
>>
>> GO
>> CREATE TRIGGER Del_TablaMadre
>> ON dbo.TablaMadre
>> FOR DELETE
>> AS
>> BEGIN
>> IF EXISTS (SELECT *
>> FROM DELETED
>> JOIN TablaHija
>> ON DELETED.PK=TablaHija.PKMadre)
>> DELETE TablaHija
>> FROM DELETED JOIN TablaHija
>> ON DELETED.PK=TablaHija.PKMadre
>> END
>> GO
>> INSERT TABLAMADRE
>> VALUES(1)
>> INSERT TABLAMADRE
>> VALUES(2)
>> INSERT TABLAMADRE
>> VALUES(3)
>>
>> INSERT TABLAHIJA
>> VALUES(1,1)
>> INSERT TABLAHIJA
>> VALUES(1,2)
>> INSERT TABLAHIJA
>> VALUES(1,3)
>> INSERT TABLAHIJA
>> VALUES(2,4)
>> INSERT TABLAHIJA
>> VALUES(2,5)
>> INSERT TABLAHIJA
>> VALUES(2,6)
>>
>> SELECT * FROM TABLAMADRE
>> SELECT * FROM TABLAHIJA
>>
>> DELETE TABLAMADRE
>> WHERE PK=1
>>
>> SELECT * FROM TABLAMADRE
>> SELECT * FROM TABLAHIJA
>>
>> DROP TABLE TABLAHIJA
>> DROP TABLE TABLAMADRE
>> /* Fin de Codigo */
>>
>> Una nota para que este codigo sea ejecutado NO puede haber INTEGRIDAD
>> REFERENCIAL DECLARATIVA entre las Tablas :(
>> Por ende hay que escribir codigo para mantener dicha integridad.
>>
>> Saludos,
>>
>>
>> Javier Loria
>> Costa Rica (MVP)
>> Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
>> que pueda ser copiado y pegado al Query Analizer.
>> La version de SQL y Service Pack tambien ayuda.
>>
>> Yumel Ojeda escribio:
>>> Hola Amigos
>>> quisiera saber si tienen alguna rutina de un trigger que elimine en
>>> cascada, ó los hijos de otra tabla antes de borrar el registro de la
>>> tabla madre
>>>
>>> bye by
>>>
>>> Atte. Yumel Ojeda


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