ORA-04091 error en trigger de actualizacion realizo una consulta en la misma tabla de la a

nelw
03 de Diciembre del 2009
necesito crear un trigger que al actualizarme un campo de una tabla me inserte una fila en otra pero los valores de esta fila son valores que estas en la tabla que esta siendo actualizada me saca el siguiete error

ORA-04091 error de acceso tabla mutando

el codigo es el siguiente alguien tiene una solucion por favor

CREATE OR REPLACE TRIGGER "USUARIO"."ACTU_CIEGO" BEFORE
UPDATE OF "CIEGO"
ON "USUARIOGESMOSA"."OPERACIONES_DEUDA"
FOR EACH ROW WHEN (OLD.NUMERO_OPERACION=OLD.NUMERO_OPERACION
AND OLD.TIPO_MERCADO=OLD.TIPO_MERCADO)
DECLARE
FECHA DATE;
CIEGOOLD OPERACIONES_DEUDA.CIEGO%TYPE;
CIEGONEW OPERACIONES_DEUDA.CIEGO%TYPE ;
NUMEROOPE OPERACIONES_DEUDA.NUMERO_OPERACION%TYPE;
IMPORDESEMAN OPERACIONES_DEUDA.IMPORTE_DESEMBOLSAR%TYPE;
IMPORDESEMACTU OPERACIONES_DEUDA.IMPORTE_DESEMBOLSAR%TYPE;
ESTAOPEANT OPERACIONES_DEUDA.ESTADO_OPERACION%TYPE;
ESTAOPEACTU OPERACIONES_DEUDA.ESTADO_OPERACION%TYPE;
CURSOR CURSOR_OPE_MODIFI IS SELECT NUMERO_OPERACION , IMPORTE_DESEMBOLSAR, ESTADO_OPERACION
FROM FUSION_DETALLE_CLIENTE
WHERE NUMERO_OPERACION =:OLD.NUMERO_OPERACION;

BEGIN

FOR REGISTROMODI IN CURSOR_OPE_MODIFI LOOP
NUMEROOPE :=REGISTROMODI.NUMERO_OPERACION;
IMPORDESEMAN :=REGISTROMODI.IMPORTE_DESEMBOLSAR;
IMPORDESEMACTU :=IMPORDESEMAN;
ESTAOPEANT :=REGISTROMODI.ESTADO_OPERACION;
ESTAOPEACTU :=ESTAOPEANT;
END LOOP;

SELECT TO_DATE(SYSDATE,'DD-MM-YYYY HH24:MI') INTO FECHA FROM DUAL;
INSERT INTO MODIFICACION_OPE_CIEGOS VALUES(NUMEROOPE,FECHA,'CIEGO','CIEGO',IMPORDESEMAN,IMPORDESEMACTU,ESTAOPEANT,ESTAOPEACTU);
END;

mamg_14_2
03 de Diciembre del 2009
Un error de tabla mutante es muy común cuando tratas de hacer una operación dml en la tabla dónde quieres consultar...
para solucionar esto tienes que crear dos disparadores, uno que almacene los datos que quieres consultar en un paquete (package) o tabla (opcional) y el otro disparador lo que debes hacer es realizar la operación dml, usando los datos que ingresaste en tu paquete o tabla auxilar... esa es la única forma de solucionar la tabla mutante...

Huskie
03 de Diciembre del 2009
Obviamente el after update no te rula ¿ verdad ?

nelw
03 de Diciembre del 2009
pero que pasa cual es el error

Huskie
03 de Diciembre del 2009
Nada, olvidalo

placa1783
03 de Diciembre del 2009
por lo poco que me acuerdo de base de datos (que puede que este mal)
cuando escribis una tabla se bloquea tanto para lectura como escritura, y seguramente estas tratando leer antes de terminar de modificarla (aunque de eso se encarga DBM y te deberia de ser transparente),
es lo mismo que un SO con procesos concurrentes cuando acceden a memoria compartida
Lo que te dice Huskie supongo yo que es que tenes que escribir algo del estilo " CREATE OR REPLACE TRIGGER "USUARIO"."ACTU_CIEGO" AFTER UPDATE OF "CIEGO"
ON "USUARIOGESMOSA"."OPERACIONES_DEUDA" "
que te permita hacer lo que queres (luego de que se desbloque la tabla)

vos usas un BEFOR (talvez nisiquiera tengas el dato al que queres acceder)

julio
03 de Diciembre del 2009
Que tal,
cuando construyes un trigger tienes que utilizar
la menor cantidad de instruccion posibles, con tal
de que no violes la atomicidad de la transaccion,
y quisa el problema sea que tenes un cursos, tenes
un ciclo y usas variables que no necesitas, porque
el mismo administrador maneja los valores viejos y los
nuevos, entonces si quieres hechale una revisada a
esta pagina que esta muy completa con respecto a
triggers http://shrek.wccnet.org/~chasselb/ora291/ExtraMaterial/PL8_9_Triggers.html#Recursive%20triggers
y si queres de todas formas explicame mejor que es lo
que queres hacer, y en que momento queres que se
ejecute el trigger, y veo si te puedo ayudar.