CURSO
BASE DE DATOS 1
SEMESTRE 2023-I
CURSO
SGBD Oracle
SEMESTRE 2023-I
Presentación de la Sesión
1
Temario
2
¿Qué es un trigger?
Disparadores (Triggers)
Disparadores (Triggers)
¿Qué es un TRIGGER?
Un disparador define una acción que la base de datos debe
llevar a cabo cuando se produce algún suceso relacionado
con la misma.
Los disparadores (TRIGGERS) pueden utilizarse para
completar la integridad referencial, también para imponer
reglas de negocio complejas o para auditar cambios en los
datos.
El código contenido en un disparador, denominado cuerpo
del disparador está formado por bloques PL/SQL.
Disparadores (Triggers)
Utilización
Utilización interna para la explotación o administración de la BD: Utilización externa para la implementación de reglas de
Implementación de restricciones. De integridad de datos. negocio:
Actualización de vistas materializadas. (si no están soportadas Ejemplo: si pasan 7 días sin que el cliente haya pagado una
de forma transparente por el SGBD) o atributos derivados. factura, se le envía un email, se le bloquea la posibilidad de
Seguridad y auditoría. Registro de acciones sobre objetos realizar más compras, y se registra como moroso.
de la BD.
Gestión de versiones. mantenimiento de datos históricos
Realización automática de copias de los datos.
Disparadores (Triggers)
Eventos
En general, la fuente del evento podría ser: Granularidad de los cambios
Una sentencia del DML: Disparadores a nivel de tupla. Un cambio en una sola tupla
Insert, Delete, Update se considera una ocurrencia del evento.
Antes o después (Before / After ) Disparadores a nivel de sentencia. Los cambios en todas las
La finalización de una transacción: tuplas se consideran una ocurrencia del evento.
Commit, rollback
Una excepción:
Violación de permisos de acceso, bloqueos, etc.
El reloj del sistema.
Otros (DDL, DATABASE).
Disparadores (Triggers)
Condiciones y Acciones
Condición: Ejemplo:
Un predicado sobre la BD. Si ningún empleado puede ganar más que su jefe, podemos
definir una regla de negocio donde el evento sea la inserción
Acción:
en la tabla empleados, la condición que el salario introducido
Comandos SQL
sea mayor que el del jefe, y la acción abortar la
Comandos PL/SQL (SQL extendido) transacción.
Llamadas externas
Abortar la transacción: ROLLBACK
Disparadores (Triggers)
Tipos de disparadores en Oracle
DML (Data Manipulation Language):
Disparados por sentencias DML: INSERT, UPDATE, DELETE
Condición adicional con la cláusula WHEN
INSTEAD OF:
Definidos sobre vistas
Permiten transformar una actualización sobre vistas no directamente actualizables en actualizaciones adecuadas
sobre las tablas base.
Triggers sobre eventos de sistema o de usuario:
Definidos sobre un esquema (SCHEMA) o sobre la BD (DATABASE)
Eventos de sistema: arranque y parada, transacciones, errores
Eventos de usuarios: entrada en el sistema, salida del sistema, sentencias DDL: CREATE, ALTER, DROP
Disparadores (Triggers)
Creación de disparador
CREATE [OR REPLACE] TRIGGER nombre
{BEFORE | AFTER | INSTEAD OF} -- Temporalidad del Evento
{INSERT | DELETE | UPDATE [OF <atributos>]} ON <tabla>
[REFERENCING {NEW AS …, OLD AS …}+]
[FOR EACH ROW]
[WHEN condición]
[DECLARE -- Declaración de variables
. . .]
BEGIN
-- cuerpo del disparador (bloque PL/SQL)
[EXCEPTION
. . .]
END;
Disparadores (Triggers)
Eliminación del disparador
DROP TRIGGER nombre_disparador;
Activar/Desactivar del disparador
ALTER TRIGGER nombre_disparador {DISABLE | ENABLE};
ALTER TABLE nombre_tabla {ENABLE | DISABLE} ALL TRIGGERS;
Disparadores (Triggers)
Disparadores
Disparadores a nivel de fila (ROW TRIGGERS):
FOR EACH ROW
Ejecutan la acción una vez por cada fila que se vea afectada por la sentencia que dispara el trigger
Lógicamente, no se dispara si no se ve afectada ninguna fila
Ejemplo: cuando se borre un cliente de la tabla de clientes, borrarlo también de la tabla de personas
Disparadores a nivel de sentencia (STATEMENT TRIGGERS):
Por defecto (cuando no se indica “FOR EACH ROW”)
Ejecutan una sola vez la acción asociada, con independencia del número de filas afectadas por la sentencia que dispara
el trigger
Ejemplo: cuando se borre en la tabla de clientes mostrar un mensaje de error indicando que no se pueden borrar
clientes
Disparadores (Triggers)
Disparadores
Disparadores BEFORE:
Ejecutan la acción asociada antes de la ejecución de la sentencia correspondiente
Por tanto, pueden utilizarse para decidir si la sentencia debe ejecutarse o no o para cambiar la ejecución de la misma
(fijar valores alternativos antes de que se escriban en disco).
Disparadores AFTER:
Ejecutan la acción asociada después de la ejecución de la sentencia.
Disparadores INSTEAD OF:
Ejecutan la acción asociada en lugar de la sentencia correspondiente.
Muy útil para vistas.
Disparadores (Triggers)
Registros OLD y NEW.
Estas variables se utilizan del mismo modo que cualquier otra
EVENTO PSEUDO REGISTROS
variable, con la salvedad de que no es necesario declararlas, son de :OLD :NEW
tipo %ROWTYPE y contienen una copia del registro antes (OLD) y INSERT
después (NEW) de la acción SQL (INSERT, UPDATE, DELETE) que DELETE
ha ejecutado el TRIGGER. UPDATE
Utilizando esta variable podemos acceder a los datos que se están
insertando, actualizando o borrando.
La siguiente tabla resume los valores regresados por estos Pseudo
registros en diferentes eventos.
Disparadores (Triggers)
Ejemplo de disparadores en Oracle
Disparadores (Triggers)
Ejemplo 1
Crear un TRIGGER en el esquema HR con el nombre INS_EMPL, que se va a ejecutar cada vez que se realiza un registro
en la tabla REGIONS.
Dentro del TRIGGER INS_EMPL, se registra en el siguiente mensaje en la tabla LOG_TABLE 'INSERCION EN LA TABLA
REGIONS' y el usuario que realizo el registro en la tabla REGIONS (USER).
La tabla LOG_TABLE , tiene siguientes columnas:
LOG_COLUMN VARCHAR2(200)
USER_NAME VARCHAR2(20)
Disparadores (Triggers)
Ejemplo 1
CREATE TABLE LOG_TABLE
(
LOG_COLUMN VARCHAR2(200),
USER_NAME VARCHAR2(20)
);
CREATE OR REPLACE TRIGGER INS_EMPL
AFTER INSERT ON REGIONS
BEGIN
INSERT INTO LOG_TABLE VALUES('INSERCION EN LA TABLA REGIONS',USER);
END;
Disparadores (Triggers)
Ejemplo 2
Crear un TRIGGER en el esquema HR con nombre TR1_REGION, en la cual solo permita al usuario HR insertar datos
en la tabla REGIONS, caso contrario mostrar un mensaje personalizado a través de una excepción.
CREATE OR REPLACE TRIGGER TR1_REGION
BEFORE INSERT ON REGIONS BEGIN
IF USER <>'HR' THEN
RAISE_APPLICATION_ERROR(-20000,'SOLO HR PUEDE TRABAJAR EN REGIONS');
END IF;
END;
Disparadores (Triggers)
Ejemplo 3
Modificar el TRIGGER con nombre TR1_REGION, en la cual solo permita al usuario HR insertar, eliminar y actualizar (únicamente la
columna REGION_NAME) datos en la tabla REGIONS, si es un usuario distinto a HR mostrar un mensaje personalizado a través de una
excepción.
CREATE OR REPLACE TRIGGER TR1_REGION
BEFORE INSERT OR UPDATE OF REGION_NAME OR DELETE ON REGIONS
BEGIN
IF USER <>'HR' THEN
RAISE_APPLICATION_ERROR(-20000,'SOLO HR PUEDE TRABAJAR EN REGIONS');
END IF;
END
Disparadores (Triggers)
Ejemplo 4
Eliminar el TRIGGER TR1_REGION, posteriormente crear un TRIGGER en el esquema HR con nombre TR2_REGION, cada vez que se realice
una inserción, eliminación y modificación (REGION_NAME, REGION_ID) de datos de la tabla REGIONS, registrar las operaciones realizadas
en la tabla LOG_TABLE e indicar el usuario que realiza los cambios.
DROP TRIGGER TR1_REGION;
Disparadores (Triggers)
Ejemplo 4
CREATE OR REPLACE TRIGGER TR2_REGION
BEFORE INSERT OR UPDATE OR DELETE ON REGIONS
BEGIN
IF INSERTING THEN
INSERT INTO LOG_TABLE VALUES ('INSERCION',USER);
END IF;
IF UPDATING('REGION_NAME') THEN
INSERT INTO LOG_TABLE VALUES ('UPDATE DE REGION_NAME', USER);
END IF;
IF UPDATING('REGION_ID') THEN
INSERT INTO LOG_TABLE VALUES ('UPDATE DE REGION_ID', USER);
END IF;
IF DELETING THEN
INSERT INTO LOG_TABLE VALUES ('DELETE', USER);
END IF;
END;
Disparadores (Triggers)
Ejemplo 5
Modificar el TRIGGER TR2_REGION, ahora debe ejecutar el TRIGGER cada vez que manipulen los registros (FOR EACH ROW), en las
operaciones de inserción, eliminación y modificación (REGION_NAME, REGION_ID) de datos de la tabla REGIONS, registrar las
operaciones realizadas en la tabla LOG_TABLE e indicar el usuario que realiza los cambios.
Cuando se realiza una inserción o modificación los datos de la columna REGION_NAME, deben estar en mayúsculas
Disparadores (Triggers)
Ejemplo 5
CREATE OR REPLACE TRIGGER TR2_REGION
BEFORE INSERT OR UPDATE OR DELETE ON REGIONS
FOR EACH ROW
BEGIN
IF INSERTING THEN
:NEW.REGION_NAME:=UPPER(:NEW.REGION_NAME);
INSERT INTO LOG_TABLE VALUES ('INSERCION',USER);
END IF;
IF UPDATING('REGION_NAME') THEN
:NEW.REGION_NAME:=UPPER(:NEW.REGION_NAME);
INSERT INTO LOG_TABLE VALUES ('UPDATE DE REGION_NAME', USER);
END IF;
IF UPDATING('REGION_ID') THEN
INSERT INTO LOG_TABLE VALUES ('UPDATE DE REGION_ID', USER);
END IF;
IF DELETING THEN
INSERT INTO LOG_TABLE VALUES ('DELETE', USER);
END IF;
END;
UPDATE REGIONS SET REGION_NAME = UPPER(REGION_NAME); COMMIT;
Disparadores (Triggers)
Ejemplo 6
Modificar el TRIGGER TR2_REGION y agregarle una clausula global para que permita registrar datos en la tabla LOG_TABLE, en la
cual el nuevo dato REGION_ID debe ser mayor que 1000
Disparadores (Triggers)
Ejemplo 6
CREATE OR REPLACE TRIGGER TR2_REGION
BEFORE INSERT OR UPDATE OR DELETE
ON REGIONS
FOR EACH ROW
WHEN (NEW.REGION_ID> 1000)
BEGIN
IF INSERTING THEN
:NEW.REGION_NAME:=UPPER(:NEW.REGION_NAME);
INSERT INTO LOG_TABLE VALUES ('INSERCION',USER);
END IF;
IF UPDATING('REGION_NAME') THEN
:NEW.REGION_NAME:=UPPER(:NEW.REGION_NAME);
INSERT INTO LOG_TABLE VALUES ('UPDATE DE REGION_NAME', USER);
END IF;
IF UPDATING('REGION_ID') THEN
INSERT INTO LOG_TABLE VALUES ('UPDATE DE REGION_ID', USER);
END IF;
IF DELETING THEN
INSERT INTO LOG_TABLE VALUES ('DELETE', USER);
END IF;
END;
Disparadores (Triggers)
Ejemplo 7
Eliminar el TRIGGER TR2_REGION.
Crear el TRIGGER TR3_REGION que sea de tipo compuesto (COMPOUND TRIGGER) en la cual se ejecute cuando se realcen los
evento de insertar, eliminar y modificar y a su vez debe controlar los eventos BEFORE y AFTER.
Considerar dentro del TRIGGER las sentencias a nivel comando (STATEMENT) y a nivel fila (ROW).
DROP TRIGGER TR2_REGION;
Disparadores (Triggers)
Ejemplo 7
CREATE OR REPLACE TRIGGER TR3_REGION
FOR DELETE OR INSERT OR UPDATE ON REGIONS
COMPOUND TRIGGER
BEFORE STATEMENT IS BEGIN
INSERT INTO LOG_TABLE VALUES('BEFORE STATEMENT',USER);
END BEFORE STATEMENT;
AFTER STATEMENT IS BEGIN
INSERT INTO LOG_TABLE VALUES('AFTER STATEMENT',USER);
END AFTER STATEMENT;
BEFORE EACH ROW IS BEGIN
INSERT INTO LOG_TABLE VALUES('BEFORE EACH ROW',USER);
END BEFORE EACH ROW;
AFTER EACH ROW IS BEGIN
INSERT INTO LOG_TABLE VALUES('AFTER EACH ROW',USER); END AFTER EACH
ROW;
END;
Lenguaje de Control de Transacciones
Lenguaje de Control de Transacciones (TCL)
¿Qué es una transacción?
Una transacción es un conjunto de declaraciones SQL que Oracle trata como una sola unidad. es decir, todas las
declaraciones deben ejecutarse correctamente o ninguna de las declaraciones debe ejecutarse.
Para controlar las transacciones, Oracle no hace ninguna declaración DML permanente a menos que usted la confirme.
Si no confirma la transacción y se corta la energía o el sistema falla, entonces la transacción se recupera.
Las declaraciones de TCL disponibles en Oracle son:
COMMIT : Hacer que los cambios realizados en la transacción sean permanentes.
ROLLBACK : Revierte el estado de la base de datos al último punto de confirmación.
SAVEPOINT : Úselo para especificar un punto en la transacción al que luego puede revertir.
Lenguaje de Control de Transacciones (TCL)
COMMIT
Para que los cambios realizados en una transacción sean permanentes, emita la sentencia COMMIT.
SINTAXIS
COMMIT [WORK] [COMMENT ‘your comment’];
WORK es opcional
COMMENT es opcional, sirve por si se desea identificar la transacción en el diccionario de datos
EJEMPLO:
insert into emp (empno,ename,sal) values (101,’Abid’,2300);
commit;
Lenguaje de Control de Transacciones (TCL)
ROLLBACK
Para revertir los cambios realizados en una transacción, proporcione una declaración de ROLLBACK.
ROLLBACK restaura el estado de la base de datos al último punto de confirmación.
EJEMPLO:
delete from emp;
rollback; /* deshacer los cambios*/
Lenguaje de Control de Transacciones (TCL)
SAVEPOINT
Especifique un punto en una transacción al que luego pueda revertir.
EJEMPLO:
insert into emp (empno,ename,sal) values (109,’Sami’,3000);
savepoint a;
insert into dept values (10,’Sales’,’Hyd’);
savepoint b;
insert into salgrade values (‘III’,9000,12000);
rollback to a;
/* la fila de la tabla salgrade y dept se revertirán. En este punto, puede confirmar con commit la fila insertada en
la tabla emp o deshacer la transacción.*/
¿Preguntas o comentarios?
Conclusiones
Un desencadenante es un bloque PL / SQL con nombre
almacenado en la base de datos de Oracle y se ejecuta
automáticamente cuando se produce un evento
desencadenante.
Los triggers pueden definirse para las operaciones INSERT,
DELETE o UPDATE, y pueden dispararse antes o después de la
operación.
Una misma tabla puede tener varios triggers asociados. En tal
caso es necesario conocer el orden en el que se van a ejecutar.
Los disparadores se activan al ejecutarse la sentencia SQL.
Finalmente, el nivel de los disparadores puede ser la fila o
registro o la orden.
Referencias Bibliográficas
Oracle Help Center - Database PL/SQL User's Guide and Reference
• Using Triggers (https://docs.oracle.com/database/121/TDDDG/tdddg_triggers.htm#TDDDG50000)
• CREATE TRIGGER (https://docs.oracle.com/cd/B19306_01/server.102/b14200/statements_7004.htm)
• Database Triggers Overview (https://oracle-base.com/articles/misc/database-triggers-overview)
• COMMIT (https://docs.oracle.com/cd/B19306_01/server.102/b14200/statements_4010.htm)
• ROLLBACK (https://docs.oracle.com/cd/B19306_01/server.102/b14200/statements_9021.htm)
MUCHAS GRACIAS