Oracle - Problema con los Triggers

 
Vista:

Problema con los Triggers

Publicado por M. Teresa Linares (2 intervenciones) el 08/03/2001 11:23:15
Espero que pueda resolver mi problema.

Imagine una base de datos con una serie de tablas, en este caso interesan tres de ellas.
tabla UNO, y tabla DOS están relacionadas entre si, a través de una tabla
intermedia, tabla TRES, que posee 2 foreign keys pertenecientes a las dos
tablas principales. estas foreign keys NO tinen activado
el on delete cascade.
Creo un trigger que se dispara despues de borrar una linea
de la tabla TRES(tabla intermedia) y lo que hace es borrar
una serie de filas de la tabla UNO (una de las tablas principales, con la que esta relacionada).

Cada vez que intento borrar algo de la tabla TRES (la tabla intermedia), y salta el trigger,
provoca un error diciendo que la tabla intermedia esta mutando.
Lo he intentado todo, y unicamente quetando la referencia es como no muta (cosa que modificaria el
diseño, que no es posible).

¿podría ayudarme?¿sabria como solucionar el problema?
El trigger esta puesto a "AFTER DELETE" y las foreign key, como ya he dicho no tienen on delete cascade.
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:Problema con los Triggers

Publicado por Oracleadicto (1 intervención) el 15/03/2001 09:38:42
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