Error en Trigger con procedimiento

Cristina
29 de Noviembre del 2004
Hola.
Tengo una trigger asociado a una tabla, dicho trigger debe saltar cuanodo se inserta o se elimina un registro.
El trigger llama a un procedimiento crea (con dbms_sql) una vista dependiendo de los datos de la tabla inicial.
Al insertar un registro, este es el error que me da:

ORA-04092: no se ha podido COMMIT en un disparador
ORA-06512: en "SYS.DBMS_SYS_SQL", línea 491
ORA-06512: en "SYS.DBMS_SQL", línea 32
ORA-06512: en "ZARAGOZA.CREARVIEWTOTAL", línea 61
ORA-06512: en "ZARAGOZA.TRG_CAMBIO_VIEW", línea 6
ORA-04088: error durante la ejecución del disparador 'ZARAGOZA.TRG_CAMBIO_VIEW'

¿alguna sugerencia?
Muchas gracias

jc3000
29 de Noviembre del 2004
En los triggers no se puede poner commit

cristina
29 de Noviembre del 2004
No he puesto commit en el procedimiento.
De hecho el procedimiento hace una lectura mediante un cursor de la tabla en la que ha saltado el trigger y con los datos que obtiene crea una vista.

set
29 de Noviembre del 2004
escribe el codigo del trigger para ver si hay un error de lógica

slds

cristina
29 de Noviembre del 2004
Gracias.
El trigger tan sólo hace una llamada a un procedimiento. Este es el código:

CREATE OR REPLACE TRIGGER TRG_CAMBIO_VIEW
AFTER INSERT OR DELETE ON GRL_PID

BEGIN

CREARVIEWTOTAL();

EXCEPTION
WHEN OTHERS THEN
Null;

END TRG_CAMBIO_VIEW;
/

Saludos

cristina
29 de Noviembre del 2004
Ah!! la excepción la tengo comentada de momento para que salte el error.

jc3000
29 de Noviembre del 2004
No hay peor ciego que el que no quiere ver.

El commit no tiene que estár necesariamente en el trigger.
Si en el trigger haces una llamada a un procedimiento y este hace commit, te saltará el error. Es como si el commit estuviera dentro del trigger.

NO SE PUEDE ¡ ¡ ¡ ¡

abouza
29 de Noviembre del 2004
Hola, podrias mandar el CrearViewTotal sobre todo la parte de la linea 61

saludos

cristina
29 de Noviembre del 2004
Gracias.
Te mando las últimas lineas del procedimiento
cursorDin:=DBMS_SQL.OPEN_CURSOR;
dbms_sql.parse(cursorDin,cadenaTotal,dbms_sql.v7);
aux:=dbms_sql.execute(cursorDin);
dbms_sql.close_cursor(cursorDin);

En cadenaTotal está la sentencia "CREATE OR REPLACE VIEW VIEWTOTAL ...."
cursorDin y Aux son enteros
Saludos

abouza
29 de Noviembre del 2004
Hola, despues de haberte hecho la pregunta mire una cosa en el manual...

El problema que tienes es que todas las sentencias de creacion de tablas, vistas.. tiene el COMMIT implicito y por eso te dice que no puedes hacer COMMIT en el trigger.

La solucion es que indiques que ese procedimiento es una transación autonoma y no interfiere con la otra.

En la parte de declaracion del procedimiento lo siguiente:

PRAGMA AUTONOMOUS_TRANSACTION;

Un saludo