Procedimiento Rollback En Oracle

Páginas: 5 (1042 palabras) Publicado: 15 de septiembre de 2011
1. Descripción del problema
Desarrollar una solución para implementar logs donde se guardan las transacciones recientes en memoria, esto porque el almacenamiento en disco en lento, aparte de los problemas de atomicidad ya conocidos, generalmente el gestor usa este redo log buffer para cuando se cierre la base se den por hechas las transacciones.
Entonces estelaboratorio busca el desarrollo de una solución de rollback para las transacciones hechas en un tiempo t1, transcurrido un tiempo t2 puedan regresar a como estaban en t1.
Básicamente la solución que se propone consiste en:
table bitacora: que registra fecha, y sql inversa (operación undo).
trigger logti: disparador asociado a la tabla iésima.(i= 0,...,n).
procedure undo: procedimiento que recibe un tiempo t1. Ejecuta las sql tomadas de la tabla bitácora, donde el tiempo < t1.

2. DDL Tablas y Datos
-- Este sería el archivo rollback.sql, el script para las tablas y datos.

-- execute undo ( to_date('20110521141400','YYYYMMDDHH24:MI:SS'));
-- tables
create table t1(
a int,
b int,
c int,
constraint pkt1rb primary key (a)
);

create table t2(
x int,
y int,
z int,
a int,constraint pkt2rb primary key (x),
constraint fk1t2rb foreign key (a) REFERENCES t1 (a)
);

create table t3(
m int,
n int,
o int,
x int,
constraint pkt3rb primary key (m),
constraint fk1t3rb foreign key (x)REFERENCES t2 (x));
);

create table bitacora(
fecha date,
-- redo varchar(50),
undo varchar(50)
);

-- trigger log para t1
CREATE OR REPLACE TRIGGER LOGT1
AFTER INSERT OR UPDATE OR DELETE ON t1FOR EACH ROW
DECLARE
actual date; DML varchar(50);
cursor c2 is SELECT SYSDATE FROM DUAL; -- saca la fecha y hora del sistema
BEGIN
open c2;
fetch c2 into actual;
IF (INSERTING) THEN -- redo insert/ undo delete
DML :='delete from t1 where a='||to_char(:new.a);
ELSIF(DELETING) THEN -- redo delete/undo insert
DML := 'insert into t1 (a,b,c) values ('||:old.a||','|| :old.b||',' ||:old.c||')';
ELSE -- redo update /undo update
DML := 'update t1 set b= '||:old.b||',c= '||:old.c||' where a='||:old.a;END IF;

INSERT INTO bitacora (fecha, undo) values (actual, DML);
--COMMIT;
close c2;
END;
/

-- trigger log para t2
CREATE OR REPLACE TRIGGER LOGT2
AFTER INSERT OR UPDATE OR DELETE ON t2FOR EACH ROW
DECLARE
actual date; DML varchar(50);
cursor c2 is SELECT SYSDATE FROM DUAL; -- saca la fecha y hora del sistema
BEGIN
open c2;
fetch c2 into actual;
IF (INSERTING) THEN -- redo insert/ undo delete
DML...
Leer documento completo

Regístrate para leer el documento completo.

Estos documentos también te pueden resultar útiles

  • Oracle y Los Procedimientos Almacenados Desarrollados En Java
  • Procedimiento compras oracle
  • Procedimientos almacenados en oracle
  • ORACLE
  • Oracle
  • Oracle
  • Oracle
  • oracle

Conviértase en miembro formal de Buenas Tareas

INSCRÍBETE - ES GRATIS