Escolar Documentos
Profissional Documentos
Cultura Documentos
Oracle ± Trigger
Triggers são procedimentos que podem ser gravados em Java, PL/SQL ou C.
São executados (ou disparados) implicitamente quando uma tabela é
modificada, um objeto é criado ou ocorrem algumas ações de usuário ou de
sistema de banco de dados.
- Momento
- Evento
- Tipo
- Corpo
O Ô Ô define quando uma trigger irá ser acionada. Pode ser:
- BEFORE (tabela)
- AFTER (tabela)
- INSTEAD OF (view)
INSTEAD OF indica que a trigger irá ser executada no lugar da instrução que
disparou a trigger. Literalmente, a instrução é substituída pela trigger. Essa
técnica permite que façamos, por exemplo, alterações em uma tabela através
de uma view. É usado nos casos em que a view não pode alterar uma tabela
por não referenciar uma coluna com a constraintnotnull. Nesse caso a trigger
pode atualizar a coluna que a view não tem acesso.
Exemplo:
O evento define qual é a instrução DML que aciona a trigger. Inf orma qual
instrução SQL irá disparar a trigger. Pode ser:
- INSERT
- UPDATE
- DELETE
O tipo define quantas vezes uma trigger será executa. A trigger pode ser
executada uma vez para a instrução que a disparou ou ser disparada para
cada linha afetada pela instrução que disparou a trigger. Pode ser:
- Instrução (STATEMENT)
- Linha (ROW)
Quando a trigger for do tipo instrução ela será disparada uma vez para cada
evento de trigger, mesmo que nenhuma linha tenha sido afetada. São úteis
para aquelas trigger que eventualmente não alteram dados ou para situações
onde o que queremos é uma resposta da trigger, por exemplo, em uma
restrição complexa de negócio. Por DEFAULT toda trigger é deste tipo.
Exemplo:
Quando a trigger for do tipo linha, a trigger será executada toda vez que a
tabela for afetada pelo evento da trigger. Se nenhuma linha for afetada a trigger
não será executada. São muito úteis quando a ação da trigger depende dos
dados afetados pelo event o da trigger. Exemplo:
CREATE OR REPLACE TRIGGER novo_func
BEFORE INSERT OR UPDATE OR DELETE ON emp
FOR EACH ROW
.
.
.
END;
/
O corpo define a ação que uma trigger irá executar quando acionada. O corpo
de uma trigger é composto por um bloco PL/SQL, a ch amada de uma
PROCEDURE ou por um procedimento JAVA. Por definição, o tamanho de
uma trigger não pode ultrapassar 32K.
O nome de uma trigger deve ser único dentro de um mesmo esquema, e sua
sintaxe básica é:
Onde:
Agora que sabemos como criar uma trigger veremos um exemplo completo:
Primeiro vamos criar uma tabela para gravar um registro de todos os usuários
que se conectaram ao banco:
- AFTER SERVERERROR
- AFTER LOGON
- BEFORE LOGOFF
- AFTER STARTUP
- BEFORE SHUTDOWN
Eventualmente podemos ter algum tipo de erro em nossa trigger. Para verificar
quais são os erros de compilação que temos na trigger basta usar o comando
SHOW ERRORS TRIGGER nome_da_trigger. Caso você queira ver os erros
de compilação da última trigger que você compilou pode escrever apenas
SHOW ERRORS ou SHO ERR. Ao executarmos esse comando ele mostrará a
linha onde está o erro. Atenção: caso a linha onde está o erro se estenda por
mais de uma linha, este comando indicará o início da linha. Vamos criar uma
trigger com erro para servir como exemplo:
Qual é o erro desse gatilho? É um erro bem banal, no caso deixamos de fechar
a apóstrofe (ou aspas simples ou quote) no final da instrução TO_CHAR. Ao
executarmos o SHOW ERROR ele irá mostrar que houve um erro na linha 4.
Isso porque ele aponta onde a linha que contem o erro começou a ser escrita e
não a linha onde efetivamente ocorreu o erro está.
SELECT trigger_name
FROM user_triggers;
Caso descubra que não precisa mais da trigger existe duas formas de tratar a
situação. Eliminar a trigger ou desabilitá -la.
Eliminando a trigger:
DROP TRIGGER nome_da_trigger;
Mas vamos continuar criando nossas triggers. O próximo caso vai nos ajudar a
impedir que alguém cadastre um funcionário fora do horário de expediente:
Primeiro vamos criar uma tabela para conter os dados do nosso histórico.
No caso acima, se o aumento de salário for inferior a 2,5% o sistema avisa que
houve um erro na alteração salarial. Em um outro exemplo, mas agora com
WHEN
UPDATE emp
SET sal = 3400
WHERE ename = 'BLAKE';
Neste caso estamos garantido que ninguém que for contratado com o cargo
diferente de PRESIDENT irá receber um sal ário menor que o menor salário de
seu cargo ou um salário maior que o maior salário de seu cargo.
Uma trigger pode ser bem mais simples do que os exemplos acima. Por
exemplo, se quisermos implementar uma restrição onde o salário do
funcionário nunca possa ser reduzido, basta aplicarmos a trigger:
Para que um usuário crie suas próprias triggers ele precisa ter o privilégio de
sistema CREATE TRIGGER e ser o proprietário da tabela onde irá criar a
trigger. Caso não seja proprietário ele deve ter o privilégio de sistema ALTER
ou ALTER ANY TABLE. Caso precise criar triggers para eventos do banco de
dados deve ter o privilégio de ADMINISTER DATABASE TRIGGER. Caso a
trigger faça chamada de alguma procedure, quem estiver criando a trigger deve
ter o privilégio de EXECUTE na procedure.
Como podemos notar as trigger podem ser usadas de forma bem flexível. Com
elas podemos gerar mecanismos de segurança mais flexíveis, auditar dados de
tabelas e implementar regras de negócios com mais facilidade.