ORA-04091 error en trigger de actualizacion realizo una consulta en la misma tabla de la a
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;
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;
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...
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...
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)
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)
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.
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.