Está en la página 1de 8

insert into emple (emp_no, apellido, dept_no)

values(1000, 'ruiz', 10);


create or replace trigger t1
before insert on emple
begin
dbms_output.put_line('Se va a modificar la tabla');
end;
/
-----------------------------------------haz un disparador donde al insertar un nuevo amepleado en la tabla emple se guar
de el usuario y la fecha en la tabla auditar
create table auditar(
usuario varchar2(15),
fecha date
);
create or replace trigger t2
before insert on emple
begin
insert into auditar values(user, sysdate);
end;
/
----------------------------------------------------------guarda los datos de una tabla que despues borres en otra tabla diferente
-- para crear una copia vacia de una tabla
create table emple2 as
select * from emple
where emp_no=0;
create or replace trigger t3
before delete on emple for each row
begin
insert into emple2 values(
:old.emp_no, :old.apellido, :old.oficio, :old.dir, :old.fecha_alt, :old.
salario, :old.comision, :old.dept_no
);
dbms_output.put_line(:old.emp_no||' '||:old.dept_no);
end;
/
---ejer 3
----haz un trigger de tal forma que al borrar un departamento traslade "antes" a tod
os
sus empleados al departamento 40.

create or replace trigger t4


before delete on depart for each row
begin
update emple set dept_no=40
where dept_no=:old.dept_no;
end;
/
-------------------------------1. Al borrar, editar o insertar un producto en la tabla PRODUCTOS guardar todos s
us datos en la tabla AUDITAR_PRODUCTOS.
Guardar tambin el nombre del usuario que realiz la accin y la fecha.
Esta tabla tiene los mismos campos que PRODUCTOS y adems USUARIO y FECHA.
DROP TABLE AUDITAR_PRODUCTOS;
create table auditar_productos as
select * from productos where cod_producto=0;
alter table auditar_productos add(usuario varchar(15) DEFAULT USER, fecha date D
EFAULT SYSDATE);
ALTER TABLE VENTAPRO DISABLE CONSTRAINT FK_COD_PRODUCTO
create or replace trigger t6
before delete OR INSERT OR UPDATE on productos for each row
begin
IF INSERTING THEN
INSERT INTO AUDITAR_PRODUCTOS(COD_PRODUCTO, DESCRIPCION, LINEA_P
RODUCTO, PRECIO)
VALUES(:NEW.COD_PRODUCTO, :NEW.DESCRIPCION, :NEW.LINEA_PRODUCTO,
:NEW.PRECIO);
ELSIF DELETING THEN
INSERT INTO AUDITAR_PRODUCTOS(COD_PRODUCTO, DESCRIPCION, LINEA_P
RODUCTO, PRECIO)
VALUES(:OLD.COD_PRODUCTO, :OLD.DESCRIPCION, :OLD.LINEA_PRODUCTO,
:OLD.PRECIO);
ELSIF UPDATING THEN
INSERT INTO AUDITAR_PRODUCTOS(COD_PRODUCTO, DESCRIPCION, LINEA_P
RODUCTO, PRECIO)
VALUES(:OLD.COD_PRODUCTO, :OLD.DESCRIPCION, :OLD.LINEA_PRODUCTO,
:OLD.PRECIO);
INSERT INTO AUDITAR_PRODUCTOS(COD_PRODUCTO, DESCRIPCION, LINEA_P
RODUCTO, PRECIO)
VALUES(:NEW.COD_PRODUCTO, :NEW.DESCRIPCION, :NEW.LINEA_PRODUCTO,
:NEW.PRECIO);
END IF;
end;
/
ALTER TRIGGER T1 DISABLE;
ENABLE;
3. Haz un trigger que al borrar, editar o insertar un alumno de la tabla ALUMNOS
guarde su DNI, nombre completo,
el usuario que lo borr, la fecha y el tipo de sentencia lleva a cabo (INSERT, UP
DATE, DELETE).

Se guardar en la tabla AUDITAR_ALUMNOS que contar con los siguientes campos: DNI,
APENOM, USUARIO, FECHA, SENTENCIA.
(Determina el tipo de dato correcto para cada columna).
CREATE TABLE AUDITAR_ALUMNOS(
DNI
vARCHAR2(10),
APENOM VARCHAR2(30),
USUARIO VARCHAR(20),
FECHA DATE,
SENTENCIA VARCHAR(10)
);
CREATE OR REPLACE TRIGGER T8
BEFORE DELETE OR INSERT OR UPDATE ON ALUMNOS FOR EACH ROW
BEGIN
IF INSERTING THEN
INSERT INTO AUDITAR_ALUMNOS VALUES(:NEW.DNI,
SYSDATE,'INSERT');
ELSIF DELETING THEN
INSERT INTO AUDITAR_ALUMNOS VALUES(:OLD.DNI,
SYSDATE,'DELETE');
ELSIF UPDATING THEN
INSERT INTO AUDITAR_ALUMNOS VALUES(:OLD.DNI,
SYSDATE,'UPDATE_OLD');
INSERT INTO AUDITAR_ALUMNOS VALUES(:NEW.DNI,
SYSDATE,'UPDATE_NEW');
END IF;
END;
/

:NEW.APENOM, USER,
:OLD.APENOM, USER,
:OLD.APENOM, USER,
:NEW.APENOM, USER,

4 Al borrar, editar o9 insertar un profesor en la tabla PROFESORES guardar todos


sus datos en la tabla AUDITAR_profes.
Guardar tambien el nombre del usuario que realizo la accion y la fecha.
esta tabla tiene los mismos campos que PROFESORES y ademas USUARIO y FECHA.
drop TABLE auditar_profes;
create table auditar_profes (
cod_centro number(4),
dni number(10),
apellidos varchar2(30),
especialidad varchar2(16),
usuario varchar2(16),
fecha date,
accion varchar2(15)
);
create or replace trigger t10
after delete or insert or update on profesores for each row
begin
if deleting then
insert into auditar_profes values(:old.cod_centro,:old.d
ni,:old.apellidos,:old.especialidad,user,sysdate,'DELETE');
elsif inserting then
insert into auditar_profes values(:new.cod_centro,:new.d
ni,:new.apellidos,:new.especialidad,user,sysdate,'INSERT');
elsif updating then
insert into auditar_profes values(:old.cod_centro,:old.d
ni,:old.apellidos,:old.especialidad,user,sysdate,'UPDATE_OLD');

insert into auditar_profes values(:new.cod_centro,:new.d


ni,:new.apellidos,:new.especialidad,user,sysdate,'UPDATE_NEW');
end if;
end;
/
triggers de sustitucioooooooooon
7 crea la vista vistadep(emp_no, apellido, dept_no)y crea el trigger de sustituc
ion necesario para insertar los datos en la tabla
create or replace view vistadep as
select emp_no, apellido, dnombre
from emple e, depart d
where e.dept_no=d.dept_no;
create or replace trigger t_vistadep
instead of insert on vistadep
declare
v_dept_no emple.dept_no%type;
begin
select dept_no into v_dept_no from depart
where dnombre=:new.dnombre;
insert into emple(emp_no, apellido,dept_no)
values(:new.emp_no, :new.apellido, v_dept_no);
end;
/
insert into vistadep values(9000,'gili','VENTAS');
12 haz una vista donde veamos el numero del departamento, su nombre y el numero
total de empleados que trabajan en el.
haz el trigger necesario para ingresar datos en esta vista (excepto el calculado
).
create or replace view numero as
select d.dept_no, dnombre, count(emp_no) as numero_total from emple e, depart d
where d.dept_no=e.dept_no (+)
group by d.dept_no, dnombre;
create or replace trigger t_numero
instead of insert on numero
declare
begin
insert into depart(dept_no, dnombre)
values(:new.dept_no, :new.dnombre);
end;
/
insert into numero (dept_no, dnombre) values(50,club');
13.
Haz una vista donde visualizaremos el articulo, cod_fabricante, peso, categoria
y beneficio(precio_venta - Precio_costo.)
haz el trigger necesario que permite insertar datos en la vista.
create or replace view acpcb as
select articulo, cod_fabricante, peso, categoria, (precio_venta - precio_costo)
as beneficio from articulos;

create or replace trigger t_acpcb


instead of insert on acpcb
begin
insert into articulos values(:new.articulo, :new.cod_fabricante, :new.pe
so, :new.categoria,null,null,null);
end;
/
insert into acpcb values('perro',999,34,'PRIMERA',null);
13.b
actializar el trigger anterior para poder borrar tambien filas en la tabla artic
ulos.
create or replace trigger t_acpcb
instead of insert or update on acpcb
begin
if inserting then
insert into articulos values(:new.articulo, :new.cod_fabricante, :new.pe
so, :new.categoria,null,null,null);
elsif deleting then
delete articulos where :old.articulo=articulo and :old.cod_fabricante=co
d_fabricante and :old.peso=peso and :old.categoria=categoria;
end if;
end;
/
2. Haz la vista EMP_DEP con los campos EMP_NO, APELLIDO, SALARIO, OFICIO, DNOMBR
E con los datos de las tablas EMPLE y DEPART.
Haz un trigger de sustitucin que nos permita borrar, insertar y editar cualquier
campo.
CREATE OR REPLACE VIEW EMP_DEP AS
SELECT EMP_NO, APELLIDO, SALARIO, OFICIO, DNOMBRE FROM EMPLE E, DEPART D
WHERE E.DEPT_NO=D.DEPT_NO;
CREATE OR REPLACE TRIGGER T_EMP_DEP
INSTEAD OF DELETE OR INSERT OR UPDATE
ON EMP_DEP
DECLARE
V_DEPT_NO DEPART.DEPT_NO%TYPE;
BEGIN
IF DELETING THEN
DELETE EMPLE WHERE EMP_NO=:OLD.EMP_NO;
ELSIF INSERTING THEN
----SELECT DEPT_NO INTO V_DEPT_NO FROM DEPART
WHERE DNOMBRE=:NEW.DNOMBRE;
----INSERT INTO EMPLE(EMP_NO, APELLIDO, SALARIO, OFICIO, DEPT_NO)
VALUES(:NEW.EMP_NO, :NEW.APELLIDO, :NEW.SALARIO, :NEW.OFICIO, V_
DEPT_NO);
ELSIF UPDATING THEN
---SELECT DEPT_NO INTO V_DEPT_NO FROM DEPART
WHERE DNOMBRE=:NEW.DNOMBRE;
-----

UPDATE EMPLE SET EMP_NO=:NEW.EMP_NO, APELLIDO=:NEW.APELLIDO, SAL


ARIO=:NEW.SALARIO, OFICIO=:NEW.OFICIO, dept_no=v_dept_no
WHERE EMP_NO=:OLD.EMP_NO;
END IF;
END;
/
insert into emp_deP values(1, 'PEPE', 1000, 'VENDEDOR', 'PRUEBA');
delete emp_dep where salario<2000;
update emp_dep set dnombre='NADA' where emp_no = 7934;

3.- del libro pag 354;


CREATE VIEW DEPARTAM AS
SELECT DEPART.DEPT_NO, DNOMBRE, LOC,
COUNT(EMP_NO) TOT_EMPLE FROM EMPLE, DEPART
WHERE EMPLE.DEPT_NO (+) = DEPART.DEPT_NO
GROUP BY DEPART.DEPT_NO, DNOMBRE, LOC;
Construye un disparador que permita realizar actualizaciones en la tabla departa partir de la vista departam,
de forma similar al ejemplo del trigger t_ges_emplead. Se
contemplarn las siguientes operaciones:

Insertar y borrar departamento.


Modificar la localidad de un departamento

create or replace trigger t_departam


instead of insert or delete or update on departam
begin
if inserting then
insert into depart(dept_no, dnombre, loc)
values(:new.dept_no, :new.dnombre, :new.loc);
elsif deleting then
delete depart where dept_no=:old.dept_no;
elsif updating ('LOC') then
update depart set loc=:new.loc
where dept_no=:old.dept_no;
end if;
end;
/
7. Usa las tablas de ALUMNOS, NOTAS y ASIGNATURAS.
Haz una vista de las tres tablas donde veamos DNI, APENOM, NOMBRE (de la asi
gnatura) y NOTA.
Haz un trigger que nos permita realizar cualquier operacin sobre la vista:
matricular alumnos existentes, actualizar una nota o borrar la matricula de
un alumno existente.
create or replace view v_20 as
select al.dni, apenom, nombre, nota from alumnos al, notas n, asignaturas ag
where al.dni=n.dni and n.cod=ag.cod

order by dni
;
create or replace trigger t_20
instead of insert or delete or update on V_20
declare
v_cod asignaturas.cod%type;
begin
if inserting then
select cod into v_cod from asignaturas where nombre=:new.nombre;
insert into notas
values(:new.dni,v_cod, null);
elsif deleting then
select cod into v_cod from asignaturas where nombre=:old.nombre;
delete notas where dni=:old.dni and cod=v_cod;
elsif updating ('NOTA')then
update notas set nota=:new.nota
where dni=:old.dni and cod=v_cod;
end if;
end;
/
5. Modifica el trigger del ejercicio 2 de tal forma que si el departamento no e
xiste,
lo da de alta en la tabla DEPART asocindole como DEPT_NO la siguiente decena dis
ponible.
Posteriormente dar de alta al empleado en dicho departamento.
CREATE OR REPLACE VIEW EMP_DEP AS
SELECT EMP_NO, APELLIDO, SALARIO, OFICIO, DNOMBRE FROM EMPLE E, DEPART D
WHERE E.DEPT_NO=D.DEPT_NO;
CREATE OR REPLACE TRIGGER T_EMP_DEP
INSTEAD OF DELETE OR INSERT OR UPDATE
ON EMP_DEP
DECLARE
V_DEPT_NO DEPART.DEPT_NO%TYPE;
BEGIN
IF DELETING THEN
DELETE EMPLE WHERE EMP_NO=:OLD.EMP_NO;
ELSIF INSERTING THEN
----SELECT DEPT_NO INTO V_DEPT_NO FROM DEPART
WHERE DNOMBRE=:NEW.DNOMBRE;
----INSERT INTO EMPLE(EMP_NO, APELLIDO, SALARIO, OFICIO, DEPT_NO)
VALUES(:NEW.EMP_NO, :NEW.APELLIDO, :NEW.SALARIO, :NEW.OFICIO, V_
DEPT_NO);
ELSIF UPDATING THEN
---SELECT DEPT_NO INTO V_DEPT_NO FROM DEPART
WHERE DNOMBRE=:NEW.DNOMBRE;
----UPDATE EMPLE SET EMP_NO=:NEW.EMP_NO, APELLIDO=:NEW.APELLIDO, SAL
ARIO=:NEW.SALARIO, OFICIO=:NEW.OFICIO, dept_no=v_dept_no
WHERE EMP_NO=:OLD.EMP_NO;
END IF;

END;
/

6. Crea la tabla de contabilidad de los departamentos CONT_DEP con


el nmero, el nombre del departamento y el sueldo medio (salario + comisin) de cad
a departamento.
Haz un trigger tal que cuando insertemos, borremos o modifiquemos el DEPT_NO o
el SALARIO o la COMISIN de la tabla EMPLE
pase los nuevos datos calculados a la tabla CONT_DEP.
create table CONT_DEP
as
select d.dept_no, dnombre, round(avg(salario + nvl(comision,0)),1) as sueldo_me
dio from emple e, depart d
where d.dept_no=e.dept_no
group by d.dept_no, dnombre;

También podría gustarte