You are on page 1of 17

ESCUELA POLITCNICA NACIONAL

INGENIERA DE SISTEMAS INFORMTICOS


Y DE COMPUTACIN
BASES DE DATOS DISTRIBUIDAS SIC 534
LABORATORIO N. 4
Replicacin bidireccional
Alumno: Wilson Wladimir Lpez Siguencia.
Fecha: Jueves, 12 de noviembre de 2009.
Prof.: Ing. Francisco Villavicencio
Referencia
1 Introduccin
1 Consultas
5 Desarrollo
2 Conclusiones
1 Referencias

tem

Nota

INTRODUCCIN
El objetivo de esta prctica de laboratorio es conocer los procedimientos para replicar una base de
datos en forma bidireccional e implementar los objetos necesarios para realizar la replicacin.
En base a esto, para lograr la mencionada replicacin bidireccional, hay que asegurarse que tanto en
el servidor ORCL y en el servidor BDDDF8, existen los correspondientes Databases Link, los
cuales permiten establecer comunicacin entre ellos, en el caso de su ausencia se debe
obligatoriamente crearlos usando las declaraciones ya conocidas, caso contrario no es posible
continuar con la prctica.
Los objetos clave y necesarios para implementar este tipo de replicacin son los triggers y los
cursores, que en conjunto permitirn replicar los nuevos datos ingresados una tabla. El
procedimiento consiste en crear una misma tabla en los dos servidores de datos, as como un trigger
que permita actualizar los datos que se ingresan en la tabla de cualquiera de los servidores, para
luego replicar estos datos, en la tabla del segundo servidor.
Al desarrollar este procedimiento, claramente se identifica que este sistema cae en el modelo
referencial ANSI/SPARC, basado en datos.
Por ltimo se analizar el procedimiento para crear reportes o informes de datos, haciendo uso de la
herramienta Reports de Oracle, la cual permite crear un sin nmero de reportes, de diferentes
caractersticas y tipos.

CONSULTAS
Replicacin bidireccional
Triggers.
Un trigger o disparador es un procedimiento u objeto que se ejecuta cuando se cumple una condicin
establecida, al realizar una operacin de insercin (INSERT), actualizacin (UPDATE) o eliminacin
(DELETE) de registros.
Los triggers son usados para mejorar la administracin de la Base de datos, sin la necesidad de que el usuario
ejecute una sentencia de SQL.
Un trigger previene errores de datos, sincroniza tablas, modifica valores de una vista, etc.
Los triggers no aceptan parmetros o argumentos, adems, no pueden ejecutar las operaciones COMMIT o
ROLLBACK por que estas son parte de la sentencia SQL del disparador, por ltimo pueden causar errores de
mutaciones en las tablas, si se han escrito de manera deficiente.
Componentes principales
La estructura bsica de un trigger es:
- Llamada de activacin: es la sentencia que permite "disparar" el cdigo a ejecutar.
- Restriccin: es la condicin necesaria para realizar el cdigo. Esta restriccin puede ser de tipo
condicional o de tipo nulidad.
- Accin a ejecutar: es la secuencia de instrucciones a ejecutar una vez que se han cumplido las
condiciones iniciales.
Tipos
Los triggers se clasifican de acuerdo a la cantidad de ejecuciones que a realizar, estos son:
- Row Triggers.- Son los disparadores de fila. Se ejecutaran n-veces si se llama n-veces desde la tabla
asociada al trigger.
- Statement Triggers.- Son los disparadores de secuencia. Se ejecutan una sola vez, sin importar la
cantidad de veces que se cumpla con la condicin.
Sintaxis:
CREATE [OR REPLACE] TRIGGER <nombre_trigger>
{BEFORE|AFTER}
{DELETE|INSERT|UPDATE [OF col1, col2, ..., colN]
[OR {DELETE|INSERT|UPDATE [OF col1, col2, ..., colN]...]}
ON <nombre_tabla>
[FOR EACH ROW [WHEN (<condicion>)]]
DECLARE
-- variables locales
BEGIN
-- Sentencias
[EXCEPTION]
-- Sentencias control de excepcin
END <nombre_trigger>;

Cursores
Es una estructura de control utilizada para el recorrido y procesamiento de los registros del resultado de una
consulta.
Tipos de cursores.

Los cursores pueden ser de dos tipos: implcitos y explcitos.


Los cursores implcitos son declarados usando PL/SQL y DML, incluyen consultas que retornan una sola fila
Los cursores explcitos, se usan para consultas que retornan ms de una fila, estos cursores son declarados
por el programador y son manipulados a travs de sentencias especficas en bloques ejecutables.
Para controlar los cursores explcitos se usan los siguientes comandos:
DECLARE.- Crea un rea SQL
OPEN.- Ejecuta la consulta asociada al cursor, se obtienen las filas y se sita el cursor en una posicin antes
de la primera fila: fila en curso
FETCH.- Introduce los valores de la fila en curso en las variables declaradas en el bloque.
CLOSE.- Libera el cursor

Tablas mutantes
Son tablas que estn siendo modificadas por una de las siguientes sentencias SQL: INSERT, UPDATE,
DELETE o por efectos de un ON DELETE CASCADE.
Las restricciones que se aplican a estas tablas son:
Las instrucciones de tipo FOR EACH ROW o FOR EACH STATEMENT no pueden ni leer ni
modificar una tabla que est mutando.

Oracle Reports
Oracle Reports es una poderosa herramienta que tiene por objetivo el diseo y la generacin de informes.
Permite la creacin de reportes en archivos jsp (Java Server pages), rdf, xml, rtf entre otros.
De igual manera permite enviar el resultado de los informes a archivos de texto, pdf, html, xml, rtf, de texto
delimitados, entre otros, lo cual permite su lectura y publicacin en diversos formatos.
Al igual que Oracle Forms, esta herramienta contiene un navegador de objetos desde el cual se puede
acceder a cada uno de los elementos que conforman la definicin de un reporte.

DESARROLLO
Preliminares:
Asuma que se desea mantener informacin de promociones de productos en todas las sucursales con la
finalidad de liquidar rpidamente ciertos saldos. Desde cualquier sucursal, un empleado puede
alimentar la Bdd con dicha informacin.
PROMOCIONES = (CODIGOP, DESCRIPCION, STOCK,
FECHAINICIAL, FECHAFINAL)
CP = CODIGOP
D_CODIGOP = CHAR (5) ABCDE, C = P
D_DESCRIPCION = CHAR (40)
D_STOCK = NUMBER (10, 2)
D_FECHAINICIAL = DATE
D_FECHAFINAL = DATE
El siguiente diagrama de red, permite identificar claramente cmo debe estar establecida la replicacin
bidireccional, en este sistema distribuido. Claramente se nota que la idea consiste en replicar una tabla en los
dos servidores de datos y luego haciendo uso de un trigger, duplicar los nuevos datos que ingresan a la tabla
PROMOCIONES del servidor en uso y de la tabla del otro servidor, Es decir que al ingresar un nuevo
registro, este debe replicarse en todo el sistema.

Siguiendo la lnea del modelo ANSI/SPARC basado en datos, el diagrama para este sistema distribuido es el
siguiente:

ACTIVIDADES.
Verificacin del acceso a los nodos:

1.- Conctese al BDDDF8 con su Uid y Password


SQL> COLUMN OBJECT_NAME FORMAT A20;
COLUMN OBJECT_TYPE FORMAT A20;
SQL> SELECT OBJECT_NAME, OBJECT_TYPE
FROM USER_OBJECTS;
Se ingresa al servidor BDDDF8 usando el respectivo nombre de usuario y password; una vez dentro del
servidor, se procede a dar el respectivo formato a las columnas OBJECT_NAME y OBJECT_TYPE.
SQL> COLUMN OBJECT_NAME FORMAT A20;
SQL> COLUMN OBJECT_TYPE FORMAT A20;
SQL> SELECT OBJECT_NAME, OBJECT_TYPE
2 FROM USER_OBJECTS
3 order by 2;
OBJECT_NAME
OBJECT_TYPE
--------------------------------------ORCL
DATABASE LINK
SYS_C0048822
INDEX
PK_CLIENTES
INDEX
MISDATOS4
SYNONYM
MISDATOS2
SYNONYM
MISDATOS3
SYNONYM
MISDATOS1
SYNONYM
RUPD$_CLIENTES
TABLE
CLIENTES
TABLE
MLOG$_CLIENTES
TABLE
MISDATOS
TABLE
T_TODOS
TRIGGER
TODOS
VIEW
13 filas seleccionadas.

Al realizar la consulta a la tabla user_objects, se verifica la existencia del Database link ORCL que es el
enlace de datos desde el servidor BDDDF8 al servidor ORCL, adems se verifica la existencia de los
objetos: RUPD$_CLIENTES y MLOG$_CLIENTES, los cuales implican la existencia de un snopshot tipo
log sobre la tabla CLIENTES
2.- SELECT * FROM TAB@ORCL;
Al realizar esta consulta se verifica que el DBL ORCL est trabajando correctamente, ya que se logra
desplegar la informacin de las tablas existentes en el servidor ORCL.
SQL> SELECT * FROM TAB@ORCL;
TNAME
TABTYPE CLU
------------------------------ ------- --ALUMNOS
TABLE
S_CLIENTES
TABLE
CLIENTES
SYNONYM

3.- Creacin de la tabla PROMOCIONES:


CREATE TABLE PROMOCIONES
(CODIGOP CHAR (5)
CHECK (SUBSTR(CODIGOP, 3, 1) = P),
DESCRIPCION CHAR (40),
STOCK NUMBER (10, 2),
FECHAINICIAL DATE,

FECHAFINAL DATE,
CONSTRAINT PK_PROMOCIONES PRIMARY KEY (CODIGOP));
Los campos de esta tabla son los siguientes:
- CODIGOP.- Acepta hasta cinco caracteres, pero obligatoriamente el caracter nmero 3 debe ser una
letra P. Algunos cdigos vlidos son: ABP12, ABP13, 12PAB, 13PAB, etc.
- DESCRIPCION.- Acepta una descripciones de promociones de hasta 40 caracteres.
- STOCK.- Es un nmero doble de dos dgitos despus del punto decimal.
- FECHAINICIAL.- Guarda la fecha de inicio de la promocin.
- FECHAFINAL.- Guarda la fecha de finalizacin de la promocin.
- Cabe recalcar que al final del bloque de creacin de esta tabla, se crea un constraint, que no es ms que
la declaracin de una clave primaria que en este caso corresponde al campo CODIGOP. El nombre de
este constraint es de mucha utilidad ya que permite identificar claramente, que la tabla promociones
tiene una clave primaria; este nombre se lo puede ver al realizar una consulta a la tabla user_objects. Si
no se realiza esto, ORACLE generar un nombre aleatorio para identificar este constraint.
SQL> CREATE TABLE PROMOCIONES
2 (CODIGOP CHAR (5)
3 CHECK (SUBSTR(CODIGOP, 3, 1) = 'P'),
4 DESCRIPCION CHAR (40),
5 STOCK NUMBER (10, 2),
6 FECHAINICIAL DATE,
7 FECHAFINAL DATE,
8 CONSTRAINT PK_PROMOCIONES PRIMARY KEY (CODIGOP));
Tabla creada.

Para verificar la creacin de esta tabla, as como el nombre del constraint creado, se realiza una consulta a la
tabla user_objects.
SQL> SELECT OBJECT_NAME, OBJECT_TYPE
2 FROM USER_OBJECTS
3 order by 2;
OBJECT_NAME
-------------------ORCL
PK_PROMOCIONES
PK_CLIENTES
SYS_C0048822
MISDATOS4
MISDATOS1
MISDATOS2
MISDATOS3
RUPD$_CLIENTES
MLOG$_CLIENTES
CLIENTES
MISDATOS
PROMOCIONES
T_TODOS
TODOS
15 filas seleccionadas.

OBJECT_TYPE
-------------------DATABASE LINK
INDEX
INDEX
INDEX
SYNONYM
SYNONYM
SYNONYM
SYNONYM
TABLE
TABLE
TABLE
TABLE
TABLE
TRIGGER
VIEW

4.- Creacin del disparador de para replicar en otro (s) nodo:


CREATE OR REPLACE TRIGGER T_PROMOCIONES
AFTER INSERT ON PROMOCIONES
FOR EACH ROW
DECLARE
CURSOR C1 IS
SELECT 1 FROM PROMOCIONES@ORCL
WHERE CODIGOP = :NEW.CODIGOP;

X C1%ROWTYPE;
BEGIN
OPEN C1;
FETCH C1 INTO X;
IF C1%NOTFOUND THEN
INSERT INTO PROMOCIONES@ORCL
VALUES (:NEW.CODIGOP, :NEW.DESCRIPCION, :NEW.STOCK,
:NEW.FECHAINICIAL, :NEW.FECHAFINAL);
CLOSE C1;
END IF;
END;
.
/
Esta sentencia SQL genera un disparador o trigger, con las siguientes caractersticas:
- Lnea 1: Se crea o se remplaza (si es que ya existe) un disparador con el nombre T_PROMOCIONES.
- Lnea 2: Indica que este disparador se va a ejecutar despus que se ingrese un nuevo registro en la tabla
PROMOCIONES.
- Lnea 3: Indica un bucle que se ejecuta por cada una de las filas o registros de la tabla
PROMOCIONES.
- Lnea 4: Indica el inicio de un nuevo bloque de cdigo para crear un cursor.
- Lnea 5: Declara un nuevo cursor con el nombre C1.
- Lnea 6: Se realiza una seleccin todas las claves de la tabla PROMOCIONES del servidor ORCL (no
del servidor que actualmente se est usando que es BDDDF8)
- Lnea 7: La seleccin anterior se la realiza, siempre y cuando el campo CODIGOP de la tabla
PROMOCIONES sea igual al contenido del nuevo registro almacenado en memoria.
- Lnea 8: Se crea una variable de tipo C1 que tiene el nombre X.
- Lnea 9: Se inicia la ejecucin del cursor
- Lnea 10: Se realiza la apertura del cursor C1.
- Lnea 11: Se almacena los valores del cursor C1 dentro de la variable X y avanza el puntero a la
siguiente fila del cursor.
- Lnea 12: Se determina si el actual puntero del cursor retorna una fila.
- Lnea 13, 14, 15, 16: De cumplirse la anterior sentencia, insertar en la tabla PROMOCIONES los valores
que existen en memoria, correspondientes a los campos para dicha tabla.
- Lnea 17: Cierra el cursor, una vez que se haya procesado todas las filas del cursor.
- Lnea 18: Cierra la sentencia IF.
- Lnea 19: Cierra el bloque de programa.
SQL> CREATE OR REPLACE TRIGGER T_PROMOCIONES
2 AFTER INSERT ON PROMOCIONES
3 FOR EACH ROW
4 DECLARE
5 CURSOR C1 IS
6 SELECT 1 FROM PROMOCIONES@ORCL
7 WHERE CODIGOP = :NEW.CODIGOP;
8 X C1%ROWTYPE;
9 BEGIN
10 OPEN C1;
11 FETCH C1 INTO X;
12 IF C1%NOTFOUND THEN
13 INSERT INTO PROMOCIONES@ORCL
14 VALUES
15 (:NEW.CODIGOP, :NEW.DESCRIPCION, :NEW.STOCK,
16 :NEW.FECHAINICIAL, :NEW.FECHAFINAL);
17 CLOSE C1;
18 END IF;
19 END;
20 .
SQL> /
Aviso: Disparador creado con errores de compilacin.

Al ejecutar esta sentencia se obtiene un aviso el cual indica que el disparador ha sido creado, pero este tiene
errores de compilacin.
Para observar los errores que se est cometiendo al crear este disparador, se ejecuta la sentencia SHOW
ERROR TRIGGER T_PROMOCIONE.
Es error que nos advierte que el trigger creado tiene errores de compilacin es el 3/15, el cual indica que la
tabla a la cual se quiere acceder remotamente no existe; es decir, no existe la tabla PROMOCIONES en el
servidor ORCL.
Para solucionar este problema, se debe de iniciar sesin en el servidor ORCL, crear la tabla
PROMOCIONES y ejecutar nuevamente el trigger, para lo cual no es necesario borrar el trigger ya que este
en su implementacin tiene la sentencia REPLACE, lo cual permite reemplazar el trigger en el caso que este
ya exista.
SQL> SHOW ERROR TRIGGER T_PROMOCIONES;
Errores para TRIGGER T_PROMOCIONES:
LINE/COL ERROR
-------- ----------------------------------------------------------------2/8
PLS-00341: declaration of cursor 'C1' is incomplete or malformed
3/1
PL/SQL: SQL Statement ignored
3/15 PL/SQL: ORA-00942: la tabla o vista no existe
5/3
PL/SQL: Item ignored
8/1
PL/SQL: SQL Statement ignored
8/15 PLS-00320: the declaration of the type of this expression is incomplete or malformed
10/1 PL/SQL: SQL Statement ignored
10/13 PL/SQL: ORA-00942: la tabla o vista no existe
SQL> REM BDDDF8;

Al volver a ejecutar el cdigo de la declaracin del trigger y al realizar una consulta a la tabla user_objects,
se verifica la existencia del trigger, en el servidor BDDDF8.
SQL> SELECT OBJECT_NAME, OBJECT_TYPE
2 FROM USER_OBJECTS
3 order by 2;
OBJECT_NAME
OBJECT_TYPE
--------------------------------------ORCL
DATABASE LINK
SYS_C0048822
INDEX
PK_CLIENTES
INDEX
PK_PROMOCIONES INDEX
MISDATOS1
SYNONYM
MISDATOS4
SYNONYM
MISDATOS2
SYNONYM
MISDATOS3
SYNONYM
CLIENTES
TABLE
PROMOCIONES
TABLE
MLOG$_CLIENTES
TABLE
RUPD$_CLIENTES
TABLE
MISDATOS
TABLE
T_TODOS
TRIGGER
T_PROMOCIONES
TRIGGER
TODOS
VIEW
16 filas seleccionadas.

En si un cursor es un archive que tiene un inicio y un final, que tiene algunos registros. En este caso, el
cursor C1, coloca en un registro el nmero 1 cuando existe un nuevo :NEW.CODIGO en memoria y si este
nmero cdigo no existe en la tabla PROMOCIONES.
C1

BOF

EOF
Las acciones que se realizan en el diagrama de estados de transacciones son las siguientes:
La flecha de bucle que se indica en el inicio de una transaccin
indica que en trigger pone un 1 en cada registro del cursor C1 por
cada tupla o registro que encuentre del resultado de la consulta
SQL correspondiente.
Todos los nuevos registros que se trate de ingresen a una tabla,
primero se almacenan en la memoria del computador. Para acceder
a estos registros se usa la siguiente sintaxis:
:NEW.nombre de columna
El ejecutar el comando COMMIT la base de datos pasa a un estado
comprometido (consistente), con lo que los nmeros registros
almacenados en memoria se almacenan en disco y se procede a
realizar un borrado de memoria.
En el caso de ejecutar el comando ROLLBACK , la base de datos
pasa a un estado fallido, y se retorna al ltimo estado consistente,
en este caso todos los nuevos registros almacenados en memoria
se borran.
El correspondiente diagrama de secuencia de este cursor es:

5.- Conctese al ORCL con su Uid y Password


Se inicia sesin en el servidor ORCL con el correcto nombre de usuario y clave
6.- Creacin de la tabla PROMOCIONES:
CREATE TABLE PROMOCIONES
(CODIGOP CHAR (5)
CHECK (SUBSTR(CODIGOP, 3, 1) = P),
DESCRIPCION CHAR (40),
STOCK NUMBER (10, 2),
FECHAINICIAL DATE,
FECHAFINAL DATE,
CONSTRAINT PK_PROMOCIONES PRIMARY KEY (CODIGOP));

Una vez dentro del servidor ORCL, se procede a crear una nueva tabla llamada PROMOCIONES, que tiene
los mismos atributos y dominio que la tabla que fue creada en el servidor BDDDF8.
SQL> CREATE TABLE PROMOCIONES
2 (CODIGOP CHAR (5)
3 CHECK (SUBSTR(CODIGOP, 3, 1) = 'P'),
4 DESCRIPCION CHAR (40),
5 STOCK NUMBER (10, 2),
6 FECHAINICIAL DATE,
7 FECHAFINAL DATE,
8 CONSTRAINT PK_PROMOCIONES PRIMARY KEY (CODIGOP));
Tabla creada.

7.- Creacin del disparador para la rplica en otro(s) nodos:


CREATE OR REPLACE TRIGGER T_PROMOCIONES
AFTER INSERT ON PROMOCIONES
FOR EACH ROW
DECLARE
CURSOR C1 IS
SELECT 1 FROM PROMOCIONES@BDDDF8
WHERE CODIGOP = :NEW.CODIGOP;
X C1%ROWTYPE;
BEGIN
OPEN C1;
FETCH C1 INTO X;
IF C1%NOTFOUND THEN
INSERT INTO PROMOCIONES@BDDDF8
VALUES
(:NEW.CODIGOP, :NEW.DESCRIPCION, :NEW.STOCK,
:NEW.FECHAINICIAL, :NEW.FECHAFINAL);
CLOSE C1;
END IF;
END;
.
/
Luego de haber creado la tabla PROMOCIONES, se retorna a la sesin abierta en el servidor BDDDF8 y se
vuelve a ejecutar el trigger T_PROMOCIONES para replicar las nuevas filas que se vayan insertando en la
tabla PROMOCIONES pero con sesin abierta en dicho servidor.
Luego de igual manera, se ejecuta la misma definicin del trigger T_PROMOCIONES pero esta vez en el
servidor ORCL, lo cual permite ver claramente que se realiza la replicacin de las nuevas filas que se
inserten en la tabla PROMOCIONES del servidor ORCL en la tabla PROMOCIONES del servidor BDDDF8.
SQL> CREATE OR REPLACE TRIGGER T_PROMOCIONES
2 AFTER INSERT ON PROMOCIONES
3 FOR EACH ROW
4 DECLARE
5 CURSOR C1 IS
6 SELECT 1 FROM PROMOCIONES@BDDDF8
7 WHERE CODIGOP = :NEW.CODIGOP;
8 X C1%ROWTYPE;
9 BEGIN
10 OPEN C1;
11 FETCH C1 INTO X;
12 IF C1%NOTFOUND THEN
13 INSERT INTO PROMOCIONES@BDDDF8
14 VALUES
15 (:NEW.CODIGOP, :NEW.DESCRIPCION, :NEW.STOCK,
16 :NEW.FECHAINICIAL, :NEW.FECHAFINAL);
17 CLOSE C1;

18 END IF;
19 END;
20 .
SQL> /
Disparador creado.

Es decir; que al crear en los servidores de datos BDDDF8 y ORCL una tabla con el mismo nombre, y un
trigger que permite replicar las nuevas filas que se ingresen en la tabla PROMOCIONES de cada servidor,
queda establecida la doble replicacin de datos.
Para verificar la existencia del DBL al servidor BDDDF8, la tabla PROMOCIONES, el nombre del
constraint PK_PROMOCIONES que identifica a la clave primaria de dicha tabla y el trigger creado para
replicar las filas insertadas en esta tabla cuando se inicia sesin en el servidor de datos ORCL; primero se da
el formato correspondiente a las columnas object_name y object_type y se realiza una consulta a la tabla
user_objects.
SQL> COLUMN OBJECT_NAME FORMAT A20;
SQL> COLUMN OBJECT_TYPE FORMAT A20;
SQL> SELECT OBJECT_NAME, OBJECT_TYPE
2 FROM USER_OBJECTS
3 order by 2;
OBJECT_NAME
OBJECT_TYPE
--------------------------------------BDDDF8.REGRESS.RDBMS DATABASE LINK
.DEV.US.ORACLE.COM
PK_CLIENTES
INDEX
PK_PROMOCIONES
INDEX
SYS_C0015193
INDEX
S_CLIENTES
MATERIALIZED VIEW
CLIENTES
SYNONYM
S_CLIENTES
TABLE
ALUMNOS
TABLE
PROMOCIONES
TABLE
T_PROMOCIONES
TRIGGER
10 filas seleccionadas.

Una vez realizado estas operaciones en el servidor ORCL, se procede a ingresar datos en la tabla
PROMOCIONES y se verifica la existencia de los mismos tanto en la tabla PROMOCIONES del servidor en
mencin, como en la tabla PROMOCIONES del servidor BDDDF8, y viceversa.
Insercin de datos desde el servidor ORCL y verificacin de los mismos en los dos servidores de datos.
Se ingresa un nuevo registro en la tabla PROMOCIONES
SQL> INSERT INTO PROMOCIONES VALUES
2 ('00P01', 'CUADERNO UNIVERSITARIO 100H',100,SYSDATE + 4, SYSDATE +20);
1 fila creada.

Se verifica la existencia del nuevo registro tanto en la tabla PROMOCIONES del servidor ORCL, como en la
tabla PROMOCIONES del servidor BDDF8.
SQL> SELECT * FROM PROMOCIONES;
CODIG DESCRIPCION
STOCK FECHAINI FECHAFIN
----- ---------------------------------------- --------- -------- -------00P01 CUADERNO UNIVERSITARIO 100H
100 09/11/09 25/11/09
SQL> SELECT * FROM PROMOCIONES@BDDDF8;
CODIG DESCRIPCION
STOCK FECHAINI FECHAFIN
----- ---------------------------------------- --------- -------- -------00P01 CUADERNO UNIVERSITARIO 100H
100 09/11/09 25/11/09

Se ejecuta el comando ROLLBACK para dejar a la base de datos en el ltimo estado consistente que estuve,
por lo tanto se verifica la no existencia del nuevo registro ingresado, tanto local como remotamente.

SQL> ROLLBACK;
Rollback terminado.
SQL> SELECT * FROM PROMOCIONES;
ninguna fila seleccionada
SQL> SELECT * FROM PROMOCIONES@BDDDF8;
ninguna fila seleccionada

Se vuelve a insertar un nuevo registro en la tabla PROMOCIONES


SQL> INSERT INTO PROMOCIONES VALUES
2 ('00P01', 'CUADERNO UNIVERSITARIO 100H',100,SYSDATE + 4, SYSDATE +20);
1 fila creada.

Se ejecuta el comando COMMIT para pasar o dejar a la base de datos en nuevo estado consistente y se
verifica la existencia de los datos tanto local como remotamente.
SQL> COMMIT;
Validacin terminada.
SQL> SELECT * FROM PROMOCIONES;
CODIG DESCRIPCION
STOCK FECHAINI FECHAFIN
----- ---------------------------------------- --------- -------- -------00P01 CUADERNO UNIVERSITARIO 100H
100 09/11/09 25/11/09
SQL> SELECT * FROM PROMOCIONES@BDDDF8;
CODIG DESCRIPCION
STOCK FECHAINI FECHAFIN
----- ---------------------------------------- --------- -------- -------00P01 CUADERNO UNIVERSITARIO 100H
100 09/11/09 25/11/09

Se intenta realizar una operacin de ROLLBACK para dejar a la tabla PROMOCIONES sin datos, pero esta
acciones es imposible de realizar ya que el comando ROLLBACK deja a la base de datos en el ltimo estado
consistente que estuvo, por lo cual al realizar las respectivas consultas en la tabla PROMOCIONES, esta va a
contener datos.
SQL> ROLLBACK;
Rollback terminado.
SQL> SELECT * FROM PROMOCIONES;
CODIG DESCRIPCION
STOCK FECHAINI FECHAFIN
----- ---------------------------------------- --------- -------- -------00P01 CUADERNO UNIVERSITARIO 100H
100 09/11/09 25/11/09
SQL> SELECT * FROM PROMOCIONES@BDDDF8;
CODIG DESCRIPCION
STOCK FECHAINI FECHAFIN
----- ---------------------------------------- --------- -------- -------00P01 CUADERNO UNIVERSITARIO 100H
100 09/11/09 25/11/09

Se ejecuta el comando exit para salir del servidor ORCL.


SQL> exit;

Insercin de datos desde el servidor BDDDF8 y verificacin de los mismos en los dos servidores de datos.
Se ejecutan los mismos pasos realizado en la insercin de datos desde el servidor ORCL
SQL> INSERT INTO PROMOCIONES VALUES
2 ('00P04', 'RESMA DE PAPEL BOND',75,SYSDATE + 4, SYSDATE +20);
1 fila creada.
SQL> INSERT INTO PROMOCIONES VALUES
2 ('00P05', 'RESLTADOR AZUL',85,SYSDATE + 4, SYSDATE +20);

1 fila creada.
SQL> SELECT * FROM PROMOCIONES;
CODIG DESCRIPCION
STOCK FECHAINI FECHAFIN
----- ---------------------------------------- --------- -------- -------00P01 CUADERNO UNIVERSITARIO 100H
100 09/11/09 25/11/09
00P02 LAPZ STANDALER
200 09/11/09 25/11/09
00P04 RESMA DE PAPEL BOND
75 09/11/09 25/11/09
00P05 RESLTADOR AZUL
85 09/11/09 25/11/09
SQL> SELECT * FROM PROMOCIONES@ORCL;
CODIG DESCRIPCION
STOCK FECHAINI FECHAFIN
----- ---------------------------------------- --------- -------- -------00P01 CUADERNO UNIVERSITARIO 100H
100 09/11/09 25/11/09
00P02 LAPZ STANDALER
200 09/11/09 25/11/09
00P04 RESMA DE PAPEL BOND
75 09/11/09 25/11/09
00P05 RESLTADOR AZUL
85 09/11/09 25/11/09
SQL> COMMIT;
Validacin terminada.

Para verificar que la mutacin de una tabla, se realiza un pequeo cambio en la declaracin del trigger y se lo
vuelve a ejecutar. Este pequeo cambio se lo realiza en la lnea 6. Lo que se intenta realizar es, estando en el
mismo servidor (BDDDF8) se intenta coleccionar los datos en la tabla que sufri cambios, ms no en la tabla
a la cual se debe realizar la replicacin de datos.
SQL> CREATE OR REPLACE TRIGGER T_PROMOCIONES
2 AFTER INSERT ON PROMOCIONES
3 FOR EACH ROW
4 DECLARE
5 CURSOR C1 IS
6 SELECT 1 FROM PROMOCIONES@BDDDF8
7 WHERE CODIGOP = :NEW.CODIGOP;
8 X C1%ROWTYPE;
9 BEGIN
10 OPEN C1;
11 FETCH C1 INTO X;
12 IF C1%NOTFOUND THEN
13 INSERT INTO PROMOCIONES@ORCL
14 VALUES
15 (:NEW.CODIGOP, :NEW.DESCRIPCION, :NEW.STOCK,
16 :NEW.FECHAINICIAL, :NEW.FECHAFINAL);
17 CLOSE C1;
18 END IF;
19 END;
20 .
SQL> /
Disparador creado.

Es por esta razn que al intentar ingresar un Nuevo registro en la tabla PROMOCIONES, se obtiene un error
afirmando que la tabla est mutando; es decir, la tabla est siendo afectada por una operacin de INSERT,
UPDATE y DELETE, por tal razn esta no puede modificarse.
SQL> INSERT INTO PROMOCIONES VALUES
2 ('00P03', 'MOCHILA PARA LAPTOP',45,SYSDATE + 4, SYSDATE +20);
INSERT INTO PROMOCIONES VALUES
*
ERROR en lnea 1:
ORA-04091: la tabla DLOPEZ.PROMOCIONES est mutando, puede que el disparador/la funcin no puedan
verla
ORA-06512: en "DLOPEZ.T_PROMOCIONES", lnea 3
ORA-06512: en "DLOPEZ.T_PROMOCIONES", lnea 7
ORA-04088: error durante la ejecucin del disparador 'DLOPEZ.T_PROMOCIONES'

8. Creacin de reportes.
Al iniciar el Report Builder se inicia automticamente un cuadro de dialogo en el cual es posible elegir la
opcin de usar un wizard o asistente, el cual gua al usuario para la creacin de un reporte con diferentes
caractersticas:

Inicio del asistente.

En este cuadro de dialogo se debe dar un titulo al reporte, y es posible elegir entre 8 distintos tipos de
reportes, algunos de los cuales se van a observar a continuacin. En este caso se usar el asistente para crear
un reporte tipo tabular.

En el siguiente cuadro de dialogo se elige la opcin de usar una sentencia SQL.

Se da clic en el botn conectar para iniciar sesin en cualquiera de los dos servidores de datos y proceder a
indicar la correspondiente sentencia SQL de la tabla que se desea realizar el respectivo reporte.

Una vez conectado al servidor de datos e indicar la sentencia SQL, se procede a elegir los campos que se
desea incluir en el reporte.

Para concluir, se elige el estilo que se dese que tenga el reporte, y se finaliza el asistente de reportes.

Por ltimo se tiene la visualizacin de un reporte tipo tabular.

A continuacin las visualizaciones de algunos tipos de reportes


Tipo carta

Tipo formulario

Tipo matriz

CONCLUSIONES
1. Es importante asegurarse que existan los correspondientes Database Links en cada uno de los
servidores, caso contrario, los servidores no pueden establecer conexin entre s, lo cual implica que
la prctica no se puede desarrollar.
2. Al ejecutar el comando ROLLBACK, se borra todos los nuevos registros existente en memoria, en el
lado opuesto, al ejecutar el comando COMMIT, todos estos nuevos registros son almacenados en
disco para proceder al borrado de memoria.
3. Al establecer el proceso de replicacin bidireccional en este sistema, queda claramente demostrado
como se encuentra estructurado el modelo arquitectnico ANSI/SPARC.
4. El uso de la herramienta Reports de Oracle es de mucha utilidad para la creacin de reportes e
informes sobre las tablas de una base de datos, siempre y cuando se quiere generar un informe
rpido, resumido y no tan personalizado.

REFERENCIAS
1.
2.
3.
4.
5.
6.
7.

http://es.wikipedia.org/wiki/Trigger_(base_de_datos)
http://es.wikipedia.org/wiki/Cursor_(base_de_datos)
http://www.devjoker.com/asp/ver_contenidos.aspx?co_contenido=54
http://www.devjoker.com/contenidos/Tutorial-PLSQL/32/Cursores-en-PLSQL.aspx
http://www.conocimientosweb.net/dcmt/ficha14846.html
http://www.zonaoracle.com/?q=node/2201
http://www.scribd.com/search?cx=007890693382555206581%3A7fgc6et2hmk&cof=FORID
%3A10&ie=UTF-8&c=&ft=&q=TRIGGER#915

You might also like