Está en la página 1de 3

fjvillatoro

/*
##############################################################################
# DISPARADORES (implementacion)
##############################################################################
#
# Descripcion: Ejemplo e implementacion de disparadores (trigger) en Oracle
#
##############################################################################
#
# Autor: fjvillatorod
#
# Revision : 2020
#
##############################################################################
*/

-- CREAR TABLA temporal para implementación


-- =================================================================
CREATE TABLE hr.employees_copy AS
SELECT employee_id, first_name, last_name, salary
FROM hr.employees
WHERE salary < 4000
--42 registros
;

--Agregar llave primaria


alter table hr.employees_copy
add constraint PK_EMPLOYEES_COPY
primary key("EMPLOYEE_ID");

-- NOTAS PREVIAS
-- =================================================================
/*
create or replace trigger MI_TRIGGER
before | after | instead of -- MOMENTO
insert | update | delete -- EVENTO
of CAMPOS -- solo para update
on MI_TABLA
for each row -- NIVEL de fila, se activa una vez por cada registro
| statement -- NIVEL de sentencia, se activa una sola vez
when CONDICION -- opcional
begin
-- sentencias
end MI_TRIGGER;

Datos utiles
>> Valores
:old -- registro antiguo
:new -- nuevo registro
user -- nombre de usuario
>> Predicados condicionales
inserting -- True cuando se esta insertando (:new)

-1-
fjvillatoro

deleting -- True cuando se esta eliminando informacion (:old)


updating -- True cuando se esta actualizando (:new & :old)

*/

-- DISPARADOR
-- Ver 1.0
-- =================================================================
-- Se crea el disparador basico por cada registro afectado
CREATE OR REPLACE TRIGGER hr.tri_log_employees
BEFORE
INSERT OR UPDATE OR DELETE ON hr.employees_copy
BEGIN
dbms_output.put_line('Disparador basico sobre la tabla hr.employees_copy' );
END tri_log_employees;

-- >> Realizar pruebas

-- Ver 1.1
-- =================================================================
-- Se implementacion de predicado condicional
CREATE OR REPLACE TRIGGER hr.tri_log_employees
BEFORE
INSERT OR UPDATE OR DELETE ON hr.employees_copy
BEGIN
IF updating THEN
dbms_output.put_line('Se actualizó un registro en la tabla hr.employees_copy' );
END IF;
END tri_log_employees;

-- >> Realizar pruebas

-- Ver 1.2
-- =================================================================
-- Se implementacion de old|new con predicado
CREATE OR REPLACE TRIGGER hr.tri_log_employees
BEFORE
INSERT OR UPDATE OR DELETE ON hr.employees_copy
FOR EACH ROW
BEGIN
IF updating('FIRST_NAME') THEN
dbms_output.put_line('El nombre del empleado '
||:old.employee_id||' cambio de '
||:old.first_name||' a '||:new.first_name||' por '||user);
END IF;
END tri_log_employees;

-- >> Realizar pruebas

-- PRUEBAS

-2-
fjvillatoro

-- =================================================================
SELECT *
FROM HR.employees_copy
WHERE employee_id = 115;
;

--Se actualiza el salario


update HR.employees_copy
set salary = 3200
where employee_id = 115
and salary = 3100;

--Se actualiza el primer nombre


update HR.employees_copy
set first_name = 'AAlexander'
where employee_id = 115
and first_name = 'Alexander';

-- ELIMINACION DE OBJETOS
-- =================================================================
--Eliminar Disparador
DROP TRIGGER hr.tri_log_employees;
--Eliminar tabla
DROP TABLE hr.employees_copy;

-- T A R E A
-- =================================================================
/*
Modifique el disparador realizado en clase para que registre dos eventos (insert/update)

TAREA PARA LA SEMANA


Modifique el anterior disparador para que imprima:
- El evento realizado: insertar | eliminar | actualizar,
- El codigo del empleado afectado por el evento
- La hora del evento, y
- El usuario que realiza el evento.
*/

-3-

También podría gustarte