2009-07-09 5 views
5

¿El desencadenador posterior a la actualización se iniciará si hay una reversión?Reversión y desencadenamiento de ORACLE

Escenario: Digamos que actualizamos una tabla A y el activador en la tabla A se inicia y actualiza otra tabla B con los detalles. Si se produce una reversión en la tabla A debido a algún error de procesamiento, ¿el desencadenador hará que la tabla B revierte el cambio?

Respuesta

9

Sí, lo hará.

disparadores trabajan en el volumen de transacciones de la declaración DML (ya sea iniciado por usted explícitamente o por la declaración DML sí implícitamente)

Cuando esta transacción se revierte, todos los cambios realizados por los disparadores también se deshacen.

Sin embargo, si se pone

PRAGMA autonomous_transaction 

en la definición del disparador, el disparador se iniciará su propia transacción que debe comprometerse antes de que finalice el gatillo.

+1

Así que la transacción autónoma es buena si desea registrar todos los INTENTOS para realizar una actualización (incluso si fallan o se retrotraen), pero MALA si solo desea la acción desencadenada realizada cuando las actualizaciones de desencadenamiento tienen éxito y se confirman. ¡Tener cuidado! –

+1

Necesita COMMIT explícita para transacciones autónomas. Si no lo hace, fallará con "ORA-06519: transacción autónoma activa detectada y revertida" – jva

+0

@jva: tiene razón, solucionando. – Quassnoi

3

Solo una nota: si define el disparador de nivel de instrucción DESPUÉS DE LA ACTUALIZACIÓN (sin la cláusula FOR EACH ROW), no se activará si la instrucción DML en la tabla falla y se revierte.

Cuestiones relacionadas