SQL - Tablas mutando. Problema con triggers

 
Vista:

Tablas mutando. Problema con triggers

Publicado por M Teresa linares (2 intervenciones) el 05/03/2001 13:52:05
estoy trabajando con una base de datos, en la que deseo borrar una serie de filas y he decidido utilizar disparadores.
el problema es que comienzo a borrar desde una tabla y a partir de ella lanzo un disparador para que borre otra tabla con la que esta relacionada mediante una clave foranea que tiene la primera de ellas.
cuando lanzo el procedimiento, me dice que la primera tabla se esta mutando, y que el disparador no puede verla. si quito la referencia de la clave foranea, todo funciona bien, pero entonces fastidio el diseño de la bd. ¿como se podria solucionar?
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Tablas mutando. Problema con triggers

Publicado por Angel (20 intervenciones) el 05/03/2001 14:44:46
La verdad es que no entiendo muy bien que problema puedes tener. De todas formas si haces algo parecido a lo siguiente te funcionara bien.

----
create table t2
(c2 int, constraint pk_c2t2 primary key (c2))
go

create table t1
(c1 int,c2 int,
constraint pk_c1t1 primary key (c1),
constraint fk_c2t1 foreign key (c2) references t2)
go

create trigger tg_del_t1
on t1 for delete as
delete from t2 where c2 in (select distinct c2 from deleted)
go
----

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Tablas mutando. Problema con triggers

Publicado por oracleadicto (4 intervenciones) el 15/03/2001 15:28:35

Hola Teresa.

Sobre las tablas mutantes... la verdad es que no hay solución sencilla. Oracle te cuenta
una serie de jugarretas para evitarlas mediante software más o menos enrevesadas.

Supongo que el origen del problema lo conoces por lo que explicas en tu mail. Como
el problema del borrado y tabla mutante da en los triggers de tipo row pero no en los
statement, nosotros borrabamos en los statement.
Pero, ¿cómo sabes tu en un trigger statement las filas que se han borrado?

Necesitas crear y usar los tipos de triggers before statement, after row y after
statement junto con un paquete.

En el paquete creas una variable que sea binary integer que hará de contador y una
tabla o varray con los campos necesarios para saber la primary key de la tabla remota
a borrar (la A).

En el trigger before statement de la tabla C, que solo se lanza 1 vez por cada borrado
aunque borres 100 filas, inicializas a 0 la variable contador. En el trigger after row del
borrado de C, incrementas la variable y asignas al array de esa posición (1, 2, 3 ...
100) los valores de la primary key del registro de A que quieres borrar (en vez de
borrar aquí, lo almacenas en el array). Finalmente, en el after statement del borrado de
C, que también se lanza 1 sola vez, te recorres el array desde 1 hasta el contador
seleccionando la primary key de la tabla de A y haciendo ahí el borrado. No muta y
funciona bien.

Lo he explicado muy por encima. Piénsalo y si tienes dudas lo comentas.
Un saludo.
--------------------------------------------------
Aprende los conceptos básicos de administración Oracle en: http://www.zunda.net
--------------------------------------------------
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar