Trigger

03/08/2005 - 22:58 por Novatito | Informe spam
Tengo dos tablas relacionadas uno a varios ( Menu - Submenu )

puedo crear un trigger que se ejecute cuando elimino un registro en la tabla
padre (Menu) y que me elimine todos los registros correspondientes en la
tabla hija (Submenu)
pues me sale el siguiente error

Instrucción DELETE en conflicto con la restricción COLUMN REFERENCE
'FK_submenu_menu'. El conflicto ha aparecido en la base de datos 'pensiones',
tabla 'submenu', column 'idmenu'.
Se terminó la instrucción.

aca esta el trigger

CREATE TRIGGER TRG_DEL_MENU
ON MENU
FOR DELETE
AS
BEGIN
SET NOCOUNT ON
DELETE SUBMENU
FROM DELETED
JOIN SUBMENU
ON DELETED.IDMENU=SUBMENU.IDMENU
SET NOCOUNT OFF
END
 

Leer las respuestas

#1 Alejandro Mesa
03/08/2005 - 23:19 | Informe spam
Estas dos tablas estan relacionadas, lo que significa que la tabla sub_menu
tiene una restricion de clave foranea que apunta o referencia a la tabla
menu. SQL Server chequea primero las restricciones y si todo esta bien
entonces dispara el trigger. Como la tabla sub_menu referencia filas en la
tabla menu, entonces sql server no dejara que se elimine una fila en la tabla
menu si es que existe alguna fila en la tabla sub_menu que la referencia.
Este proceso lo puedes hacer de forma declarativa usando la opcion ON DELETE
/ ON UPDATE cuando creas la restriccion en la sentencia CREATE / ALTER TABLE.
Otra forma de hacerlo es no usando las restricciones de referencia
declarativas (no crear restriccion de clave foranea) y usar triggers para
hacer las validaciones respectivas (preferible de hacerlo de forma
declarativa). Tambien puedes hacerlo usando procedimientos almacenados.

Ejemplo:

create table t1 (
c1 int not null identity primary key
)
go

create table t2 (
c1 int not null,
constraint fk_t2_t1 foreign key (c1) references t1(c1) on delete cascade
)
go

insert into t1 default values
insert into t1 default values

insert into t2 values(1)
insert into t2 values(2)

select * from t2

delete t1 where c1 = 1

select * from t1
select * from t2
go

alter table t2
drop constraint fk_t2_t1
go

create trigger tr_t1_del on t1
for delete
as
set nocount on

delete t2
where exists(select * from deleted where t2.c1 = deleted.c1)
go

delete t1 where c1 = 2
go

select * from t1
select * from t2
go

drop table t2, t1
go


AMB


"Novatito" wrote:

Tengo dos tablas relacionadas uno a varios ( Menu - Submenu )

puedo crear un trigger que se ejecute cuando elimino un registro en la tabla
padre (Menu) y que me elimine todos los registros correspondientes en la
tabla hija (Submenu)
pues me sale el siguiente error

Instrucción DELETE en conflicto con la restricción COLUMN REFERENCE
'FK_submenu_menu'. El conflicto ha aparecido en la base de datos 'pensiones',
tabla 'submenu', column 'idmenu'.
Se terminó la instrucción.

aca esta el trigger

CREATE TRIGGER TRG_DEL_MENU
ON MENU
FOR DELETE
AS
BEGIN
SET NOCOUNT ON
DELETE SUBMENU
FROM DELETED
JOIN SUBMENU
ON DELETED.IDMENU=SUBMENU.IDMENU
SET NOCOUNT OFF
END

Preguntas similares