Es una funcionalidad del PL/SQL en la cual un subprograma puede actuar independientepemente de la transacción que lo contiene.
Miremos como funciona con este ejemplo ....
CREATE TABLE tabla1 (campo int);
CREATE TABLE tabla2 (campo int);
CREATE SEQUENCE secuencia_s ;
/* Este es un trigger normal de inserción, si la transaccion se deshace,
se deshace la insercion en la tabla2 */
CREATE OR REPLACE TRIGGER pa_trigger
AFTER INSERT ON tabla1 FOR EACH ROW
DECLARE
i PLS_INTEGER;
BEGIN
select secuencia_s.nextval into i from dual;
INSERT INTO tabla2
VALUES
(i);
END;
INSERT INTO tabla1 VALUES (1);
SELECT COUNT(*) FROM tabla1;
count(*)
1
SELECT COUNT(*) FROM tabla2;
count(*)
1
Rollback;
SELECT COUNT(*) FROM tabla1;
count(*)
0
SELECT COUNT(*) FROM tabla2;
count(*)
0
Ahora miremoslo con la transacción autónoma
CREATE OR REPLACE TRIGGER PA_trigger
AFTER INSERT ON tabla1 FOR EACH ROW
DECLARE
PRAGMA AUTONOMOUS_TRANSACTION;
i PLS_INTEGER;
BEGIN
select secuencia_s.nextval into i from dual;
INSERT INTO tabla2
VALUES
(i);
COMMIT;
END;
/*Realizamos la inserción */
INSERT INTO tabla1 VALUES (1);
SELECT COUNT(*) FROM tabla1;
count(*)
1
SELECT COUNT(*) FROM tabla2;
count(*)
1
/* si deshacemos la transacción de la tabla1 */
Rollback;
SELECT COUNT(*) FROM tabla1;
count(*)
0
/* la transacción de la tabla2 quedara confirmada, Es ideal para manejar logs */
SELECT COUNT(*) FROM tabla2;
count(*)
1
CREATE TABLE tabla1 (campo int);
CREATE TABLE tabla2 (campo int);
CREATE SEQUENCE secuencia_s ;
/* Este es un trigger normal de inserción, si la transaccion se deshace,
se deshace la insercion en la tabla2 */
CREATE OR REPLACE TRIGGER pa_trigger
AFTER INSERT ON tabla1 FOR EACH ROW
DECLARE
i PLS_INTEGER;
BEGIN
select secuencia_s.nextval into i from dual;
INSERT INTO tabla2
VALUES
(i);
END;
INSERT INTO tabla1 VALUES (1);
SELECT COUNT(*) FROM tabla1;
count(*)
1
SELECT COUNT(*) FROM tabla2;
count(*)
1
Rollback;
SELECT COUNT(*) FROM tabla1;
count(*)
0
SELECT COUNT(*) FROM tabla2;
count(*)
0
Ahora miremoslo con la transacción autónoma
CREATE OR REPLACE TRIGGER PA_trigger
AFTER INSERT ON tabla1 FOR EACH ROW
DECLARE
PRAGMA AUTONOMOUS_TRANSACTION;
i PLS_INTEGER;
BEGIN
select secuencia_s.nextval into i from dual;
INSERT INTO tabla2
VALUES
(i);
COMMIT;
END;
/*Realizamos la inserción */
INSERT INTO tabla1 VALUES (1);
SELECT COUNT(*) FROM tabla1;
count(*)
1
SELECT COUNT(*) FROM tabla2;
count(*)
1
/* si deshacemos la transacción de la tabla1 */
Rollback;
SELECT COUNT(*) FROM tabla1;
count(*)
0
/* la transacción de la tabla2 quedara confirmada, Es ideal para manejar logs */
SELECT COUNT(*) FROM tabla2;
count(*)
1
No hay comentarios:
Publicar un comentario