Prévia do material em texto
�PAGE � �PAGE �4� Banco de Dados II George Hamilton Em cima da tabela de EMPREGADO_JN abaixo, faça um trigger de auditoria que armazene as informações do empregado, bem como, o evento( delete ou update) que disparou este trigger, o usuário responsável pela alteração e a data do sistema. Abaixo segue a Tabela que irá armazenar as informações necessárias para a manter o histórico: CREATE TABLE EMPREGADO_JN ( Operacao VARCHAR2(3) NOT NULL, Usuario VARCHAR2(30) NOT NULL, Data DATE NOT NULL, CPF CHAR(12) NOT NULL, Num_Departamento SMALLINT NOT NULL, Nome VARCHAR(30) NULL, Data_nascimento DATE NULL, Endereco VARCHAR(40) NULL, Sexo CHAR(1) NULL, Salario DECIMAL(10,2) NULL, Supervisor CHAR(12) NULL); CREATE OR REPLACE TRIGGER AUDIT_EMPREGADO AFTER DELETE OR UPDATE ON EMPREGADO FOR EACH ROW DECLARE OPERACAO VARCHAR2(3); BEGIN IF DELETING THEN OPERACAO:='DEL'; ELSE OPERACAO:='UPD'; END IF; INSERT INTO EMPREGADO_JN VALUES(OPERACAO,USER,SYSDATE, :OLD.CPF,:OLD.NUM_DEPARTAMENTO, :OLD.NOME,:OLD.DATA_NASCIMENTO, :OLD.ENDERECO ,:OLD.SEXO ,:OLD.SALARIO ,:OLD.SUPERVISOR); END; / 2) Faça um trigger para manter a faixa salarial em valores mínimo e máximo já estabelecidos anteriormente CREATE OR REPLACE TRIGGER CHECASAL BEFORE INSERT OR UPDATE OF SALARIO ON EMPREGADO FOR EACH ROW DECLARE SALMIN EMPREGADO.SALARIO%TYPE; SALMAX EMPREGADO.SALARIO%TYPE; BEGIN SELECT MIN(SALARIO),MAX(SALARIO) INTO SALMIN,SALMAX FROM EMPREGADO; IF :NEW.SALARIO < SALMIN OR :NEW.SALARIO>SALMAX THEN RAISE_APPLICATION_ERROR(-20010,'SALARIO FORA DA FAIXA DOS SALARIOS MINIMO E MAXIMO PERMITIDOS'); END IF; END; / 3) Faça um trigger para não permitir a diminuição ou o aumento superior a 50% dos salários dos empregados, emitindo uma mensagem de erro. CREATE OR REPLACE TRIGGER CHSAL BEFORE UPDATE OF SALARIO ON EMPREGADO FOR EACH ROW WHEN ((NEW.SALARIO<OLD.SALARIO) OR (NEW.SALARIO>OLD.SALARIO * 1.5)) BEGIN RAISE_APPLICATION_ERROR(-20345,'NAO DIMINUA O SALARIO OU AUMENTE MAIS DE 50%'); END; / 4) Faça um trigger para derivar automaticamente o valor do número de empregados em um determinado departamento. CREATE OR REPLACE TRIGGER COMPTNUM AFTER INSERT OR DELETE ON EMPREGADO FOR EACH ROW BEGIN IF DELETING THEN UPDATE DEPARTAMENTO SET NUMEMP=NUMEMP-1 WHERE Num_Departamento=:OLD.Num_Departamento; END IF; IF INSERTING THEN UPDATE DEPARTAMENTO SET NUMEMP=NUMEMP+1 WHERE Num_Departamento=:NEW.Num_Departamento; END IF; END; / 5) Faça um trigger para manter o mínimo de 10 horas que um funcionário deverá trabalhar em um projeto. CREATE OR REPLACE TRIGGER CKHORA AFTER INSERT OR UPDATE OF HORAS ON TRABALHO FOR EACH ROW BEGIN IF :NEW.HORAS < 10 THEN UPDATE TRABALHO SET HORAS=10 WHERE CPF_EMPR=:NEW.CPF_EMPR AND NUM_PROJETO=:NEW.NUM_PROJETO; END IF; END; / 6) Faça um trigger para exclusão em cascata de empregado, suas alocações em trabalhos de projetos e de seus dependentes. CREATE OR REPLACE TRIGGER DELCASEMP AFTER DELETE ON EMPREGADO FOR EACH ROW WHEN (OLD.SUPERVISOR IS NULL) BEGIN /* DELECAO CASCATA DE TRABALHO */ DELETE FROM TRABALHO WHERE TRABALHO.CPF_EMPR = :OLD.CPF; /* DELECAO CASCATA DE DEPENDENTE */ DELETE FROM DEPENDENTE WHERE DEPENDENTE.CPF_EMPR = :OLD.CPF; END; / 7) Faça um trigger de segurança, para restringir o horário de manipulação da tabela de empregados entre às 08:00 e 18:00 horas dos dias úteis. CREATE OR REPLACE TRIGGER EMPSEG BEFORE DELETE OR INSERT OR UPDATE ON EMPREGADO BEGIN IF(TO_CHAR(SYSDATE,'DY') IN ('SAT','SUN')) OR (TO_NUMBER(SYSDATE,'HH24') NOT BETWEEN 8 AND 18) THEN IF DELETING THEN RAISE_APPLICATION_ERROR(-20503,'EMPREGADO SO PODE SER EXCLUIDO DURANTE HORARIO NORMAL'); ELSIF INSERTING THEN RAISE_APPLICATION_ERROR(-20504,' EMPREGADO SO PODE SER INSERIDO DURANTE HORARIO NORMAL'); ELSIF UPDATING ('SALARIO') THEN RAISE_APPLICATION_ERROR(-20505,'SALARIO DO EMPREGADO SO PODE SER ATUALIZADO DURANTE HORARIO NORMAL'); ELSE /* ATUALIZACOES GERAIS */ RAISE_APPLICATION_ERROR(-20506,'O EMPREGADO SO PODE SER ATUALIZADO DURANTE HORARIO NORMAL'); END IF; END IF; END; / 8) Faça uma procedure para atualizar o salário de um empregado. CREATE OR REPLACE PROCEDURE ATUALIZA_SAL (V_CPF IN EMPREGADO.CPF%TYPE, V_NOVO_SALARIO IN EMPREGADO.SALARIO%TYPE) IS BEGIN UPDATE EMPREGADO SET SALARIO = V_NOVO_SALARIO WHERE CPF = V_CPF; COMMIT; END ATUALIZA _SAL; / 9) Faça uma procedure para excluir registros da tabela empregados, informando a quantidade excluída. CREATE OR REPLACE PROCEDURE EXCLUI_REGISTRO (V_CPF IN EMPREGADO.CPF%TYPE, V_REG_EXC OUT VARCHAR2) IS BEGIN DELETE FROM EMPREGADO WHERE CPF = V_CPF; V_REG_EXC:= TO_CHAR(SQL%ROWCOUNT)||' registros excluídos.'; END EXCLUI_REGISTRO; / Faça uma procedure para atualizar o nome do departamento CREATE OR REPLACE PROCEDURE ATUALIZA_NOMEDEP (V_DEP_ID DEPARTAMENTO.NUM_DEPARTAMENTO%TYPE, V_NOME VARCHAR2) IS BEGIN UPDATE DEPARTAMENTO SET NOME =V_NOME WHERE NUM_DEPARTAMENTO = V_DEP_ID; COMMIT; END ATUALIZA_NOMEDEP;