Trigger en PL/SQL

Esta es la primera vez que trato de hacer un trigger en Oracle 7, por lo que soy bastante inexperta en PL/SQL.
Lo que trato de hacer es que antes de borrar una fila en la Tabla1 se inserten determinadas columnas de esa fila a borrar en la Tabla2. Estas tablas no tienen foreign keys entre si y yo lo hago haciendo un Before Delete on Tabla1 un insert on Tabla2. El problema es que si le pongo For Each Row me dice que la Tabla2 está mutando, y si no lo pongo, me hace el insert para todas las filas de la Tabla1 en vez de hacerlo sólo para fila que quiere borrarse.
Me gustaría saber qué puedo hacer para solucionar ésto o si hay alguna forma de identificar de forma única a la fila que se va a borrar, para poder hacer el insert de ésa solamente. Se que existen las variables :new y :old, pero si no me equivoco sólo funcionan en los updates.

1 Respuesta

Respuesta
1
Es raro que te de un error de tabla mutante para T2 si el trigger pertenece a T1 y no existe ninguna clave foránea entre ellas. ¿No sera que en T2 hay otro trigger para INSERT que intenta acceder a T1? Es que no tiene explicación, vamos. Las variables :new y :old solo se pueden usar en triggers FOR EACH ROW, pero si la operación es un INSERT :old no existe, y si es un DELETE :new tampoco existe.
Hay una solución muy rebuscada que consiste en utilizar un PACKAGE, que contenga una variable de tipo TABLE ( es un array ). Luego creas dos triggers, el primero FOR EACH ROW donde guardas en el array del package la clave primaria o lo que sea de las filas afectadas. El segundo NO ha de ser EACH ROW, y en el te recorres el array y accedes a la tabla que sea, sin problemas de tablas mutantes. Las variables de un package son locales a la sesión, por lo que no tendrás problemas de concurrencia con otros usuarios.
Suerte

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas