0% encontró este documento útil (0 votos)
395 vistas

Taller Triggers

El documento describe la creación de diferentes triggers en una base de datos para controlar actualizaciones en tablas. Los triggers controlan que un empleado no sea jefe de más de 5 personas, que el salario no aumente más de un 20%, que un empleado y su jefe estén en el mismo departamento, y que al actualizar precios de libros se guarde un registro de la modificación.

Cargado por

Ricardo Herrera
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
395 vistas

Taller Triggers

El documento describe la creación de diferentes triggers en una base de datos para controlar actualizaciones en tablas. Los triggers controlan que un empleado no sea jefe de más de 5 personas, que el salario no aumente más de un 20%, que un empleado y su jefe estén en el mismo departamento, y que al actualizar precios de libros se guarde un registro de la modificación.

Cargado por

Ricardo Herrera
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd
Está en la página 1/ 6

TRIGGERS

1. Crear un trigger sobre la tabla empleados para que no se permita


que un empleado sea jefe de ms de cinco empleados.

CREATE OR REPLACE TRIGGER JEFE_NO_5


BEFORE
INSERT ON EMPLOYEES
FOR EACH ROW
DECLARE
jefe_de NUMBER;
BEGIN
SELECT count(*) INTO jefe_de
FROM EMPLOYEES
WHERE manager_id = :NEW.manager_id;
IF jefe_de > 5
THEN raise_application_error
(-20800,:NEW.manager_id||' No se puede ser jefe de ms de 5 empleados');
END IF;
END;
/

insert into employees values (210, 'Ricardo', 'Herrera',


'RHERRERA','515.123.4568','21/09/89', 'AD_VP',17000,0,101,90,NULL);
2. Crear un trigger para impedir que se aumente el salario de un
empleado en ms de un 20%. Es necesario comparar los valores
:old.salario y :new.salario cuando se modifica (BEFORE UPDATE).

CREATE OR REPLACE TRIGGER AUMENTO_SALARIO


BEFORE UPDATE OF salary ON employees
FOR EACH ROW
BEGIN
IF :NEW.salary > :OLD.salary*1.20
THEN raise_application_error
(-20800,:NEW.salary||' No se puede aumentar el salario en ms del 20%');
END IF;
END;
/

UPDATE EMPLOYEES SET salary=30000 WHERE employee_id=101;


3. Crear un trigger para impedir que un empleado y su jefe
pertenezcan a departamentos distintos.

CREATE OR REPLACE TRIGGER DEPARTAMENTOS_DISTINTOS


BEFORE INSERT ON EMPLOYEES
FOR EACH ROW
DECLARE
emp_dep EMPLOYEES.DEPARTMENT_ID%TYPE;
man_dep EMPLOYEES.DEPARTMENT_ID%TYPE;
BEGIN
SELECT department_id INTO man_dep FROM employees WHERE
employee_id=:NEW.manager_id;

IF :NEW.department_id <> man_dep


THEN raise_application_error
(-20800,:NEW.employee_id||' Un empleado no puede trabajar en un
departamento diferente al de su jefe');
END IF;
END;
/

insert into employees values (210, 'Ricardo', 'Herrera',


'RHERRERA','515.123.4568','21/09/89', 'AD_VP',17000,0,101,80,NULL);
4. Una librera almacena los datos de sus libros en una tabla denominada "libros" y
controla las actualizaciones del precio de los libros almacenando en la tabla "control" el
nombre del usuario, la fecha, el precio anterior y el nuevo.

Creamos las tablas con las siguientes estructuras:


create table libros(
codigo number(6),
titulo varchar2(40),
autor varchar2(30),
editorial varchar2(20),
precio number(6,2)
);
create table control(
usuario varchar2(30),
fecha date,
codigo number(6),
precioanterior number(6,2),
precionuevo number(6,2)
);
Ingresamos algunos registros en "libros":
insert into libros values(100,'Uno','Richard Bach','Planeta',25);
insert into libros values(103,'El aleph','Borges','Emece',28);
insert into libros values(105,'Matematica estas ahi','Paenza','Nuevo siglo',12);
insert into libros values(120,'Aprenda PHP','Molina Mario','Nuevo siglo',55);
insert into libros values(145,'Alicia en el pais de las maravillas','Carroll','Planeta',35);
1. Crear un trigger llamado "tr_actualizar_precio_libros" a nivel de fila que se dispara
"antes" que se ejecute un "update" sobre el campo "precio" de la tabla "libros". En el
cuerpo del disparador se debe ingresar en la tabla "control", el nombre del usuario que
realiz la actualizacin, la fecha, el cdigo del libro que ha sido modificado, el precio
anterior y el nuevo.

CREATE OR REPLACE TRIGGER tr_actualizar_precio_libros


BEFORE UPDATE OF precio
ON libros
FOR EACH ROW
BEGIN
INSERT INTO control VALUES(USER,SYSDATE,:NEW.codigo,:OLD.precio,:NEW.precio);
END tr_actualizar_precio_libros;

UPDATE libros SET precio=40 WHERE codigo=100;


select * from control;

2. Reemplazar el trigger anteriormente creado. Ahora el disparador


"tr_actualizar_precio_libros" debe controlar el precio que se est actualizando, si supera
los 50 pesos, se debe redondear tal valor a entero hacia abajo (empleando la funcin
"floor", sino lo tiene crela), es decir, se modifica el valor ingresado accediendo a
":new.precio" asignndole otro valor.

CREATE OR REPLACE TRIGGER tr_actualizar_precio_libros


BEFORE UPDATE OF precio
ON libros
FOR EACH ROW
BEGIN
IF (:new.precio>50) THEN
:new.precio:=floor(:new.precio);
END IF;
INSERT INTO control VALUES(USER,SYSDATE,:NEW.codigo,:OLD.precio,:NEW.precio);
END tr_actualizar_precio_libros;

UPDATE libros set precio=53 WHERE codigo=100;


SELECT * FROM control;
3. Creamos un disparador para mltiples eventos, que se dispare al ejecutar "insert",
"update" y "delete" sobre "libros". En el cuerpo del trigger se realiza la siguiente accin:
se almacena el nombre del usuario, la fecha y los antiguos y viejos valores de "precio":

CREATE OR REPLACE TRIGGER tr_libros


BEFORE INSERT OR UPDATE OR DELETE
ON libros
FOR EACH ROW
BEGIN
INSERT INTO control VALUES(USER,SYSDATE,:OLD.codigo,:OLD.precio,:NEW.precio);
END tr_libros;

INSERT INTO libros VALUES(101,'La vuelta al mundo en 80 das','Julio Verne','Planeta',80);


UPDATE libros SET precio=88 WHERE codigo=101;

SELECT * FROM control;

También podría gustarte