002 - Triggers Exercicios
002 - Triggers Exercicios
002 - Triggers Exercicios
A trigger, que na tradução literal significa gatilho, são execuções armazenadas que disparam conforme algum
evento específico e/ou pré-definido no banco de dados. Os triggers são executados conforme alguns dos eventos
abaixo:
As triggers geralmente são criadas para logs de auditoria, controle de dados sensíveis, replicações de dados e
outras finalidades. A utilização desse objeto requer cuidado e muito controle, para não invalidar operações ou
onerar o ambiente de banco de dados.
Estrutura:
CREATE [OR REPLACE] TRIGGER trigger_name: Criação ou replace de uma trigger existente.
[REFERENCING OLD AS o NEW AS n]: Permiti referenciar novos e antigos valores, com INSERT,
UPDATE e DELETE.
[FOR EACH ROW]: Trigger para criação da trigger a nível de linha, caso contrário, será após a execução
de um comando SQL.
WHEN (condition): Condição para FOR EACH ROW disparar. Essa cláusula só é válida para triggers a
nível de linhas.
Após a criação das tabelas, vamos criar a trigger responsável por guardar o histórico de registros inseridos:
E agora vamos inserir valores nessa tabela para depois verificarmos na tabela de auditoria:
:NEW e :OLD
Nas triggers de linha, é possível acessar os valores que estão sendo executados no momento ou os valores que
já estavam armazenados.
:NEW Valores que estão sendo armazenados no momento, ou seja, são os novos valores que estão sendo
manipulados de acordo com o evento da trigger. São sempre acompanhados da coluna do objeto alvo do evento
da trigger.
:OLD Armazena os valores anteriores que são os alvos da alteração no momento da execução da trigger.
Utilizado para eventos de UPDATE, assim identificando e armazenando os campos alterados.
Exceções
O raise_application_error é uma procedure da Oracle que permite o desenvolvedor enviar ou manipular erros
identificados pela aplicação. Essas exceções permitem tratar erros e documenta-los; todos os erros são
definidos entre -20,000 e -20,999.
create table funcionários (nome varchar2(30) primary key, sobrenome varchar2(30), salario
number(30));
------------------------------------------------------------------------------------
create or replace trigger sysadm.trg_func
before update or delete or insert on sysadm.funcionarios
FOR EACH ROW
declare
-- local variables here
begin
if :NEW.salario <> :OLD.salario
and :NEW.salario > :OLD.salario *1.10
then
RAISE_APPLICATION_ERROR(-20512, 'Não podem ser alterados dados dessa tabela');
end if;
if deleting then
RAISE_APPLICATION_ERROR(-20512, 'Não podem ser excluídos dados dessa tabela');
Exercícios
1) Criar uma trigger (trg_cad_clientes) para auditar todos os inserts realizados em uma tabela de cadastro
de clientes. Organizar a tabela de logs para armazenar todos os campos da tabela com a data do
respectivo insert; e devem ser inseridos no mínimo 5 cadastros para testar o log de auditoria.
2) Com a mesma tabela do exercício anterior (cadastro_cliente), criar um trigger para armazenar os valores
antes de serem deletados da tabela. Devem ser inseridos 5 pessoas com diferentes nomes e o delete
deve ser feito caso a caso com o respectivo nome.
delete cadastro_cliente
where nm_cliente='Marcelo'
3) O departamento de Recursos Humanos deseja que os aumentos de salários maiores de R$ 1500,00 sejam
armazenados em uma tabela de auditoria para posterior averiguação. Criar uma tabela de funcionário e
uma trigger (trg_func) que audite somente esses aumentos com o novo valor do salário e o anterior.
4) Criar um trigger para auditar a troca de departamento dos funcionários de uma determinada empresa,
constando o novo e antigo departamento. Para criação dessa trigger, somente será dada a tabela de
departamento e o novo e antigo departamento devem ser auditados. As estruturas como tabela de log e
outras que julgarem necessárias, deverão ser criadas de acordo com a necessidade.
5) Aproveitando a estrutura de criação de tabela do exercício 3, criar uma trigger para gerar um erro no momento
que um aumento de salário for maior que 10%
6) Criar uma trigger para bloquear qualquer alteração na tabela dept_emp (exercício 4) e gerar um erro de
permissão negada.