Triggers
- Triggers, ou gatilhos são stored procedures em PL/SQL ou Java executadas (disparadas) implicitamente
- Não possuem nenhum “chamamento” explícito, sempre que uma tabela ou view é modificada ou ainda quando acontece alguma determinada ação do usuário ou até mesmo ações do próprio banco de dados.
- Triggers são uma parte crítica de qualquer aplicação bem modelada e, através deles, é possível garantir as seguintes funcionalidades:
- Executar validações de alterações feitas em tabelas ou views: triggers oferecem uma forte garantia na validação de informações, pois esta validação está ligada diretamente ao objeto do banco de dados (tabela ou view)
- Automatizar manutenções no banco de dados: a partir da versão 8i, é possível associar triggers a eventos do banco de dados, como uma inicialização (startup), permitindo executar tarefas de limpeza na inicialização, por exemplo
- Aplicar regras a respeito de atividades de administração de uma maneira extremamente granular: pode-se usar triggers para controlar qual o tipo de alteração que se pode fazer em determinado objeto, como apagar (drop) ou alterar uma tabela.
- Tipos de eventos que podem “disparar” um trigger:
- DML (Data Manipulation Language): sempre que um evento do tipo insert, update ou delete ocorrer na tabela, o trigger será “disparado”
- DDL (Data Definition Language): o trigger será disparado sempre que um evento DDL ocorrer, como a criação de uma tabela. É muito útil para o caso de auditorias ou para evitar que certas operações sejam executadas
- Eventos do banco de dados: eventos como startup, shutdown, sempre que um usuário conectar-se ou desconectar-se e até mesmo sempre que um erro Oracle ocorrer, o trigger será “disparado”
- INSTEAD OF: Instead of (em vez de) triggers são uma ótima alternativa aos triggers de DML, pois eles são “disparados” quando um evento do tipo insert, update ou delete estão para acontecer. O código do trigger define o que deverá acontecer no lugar dos eventos. Este tipo de trigger controla operações em views, não em tabelas;
- Triggers facilitam o desenvolvimento de aplicações a maioria dos bancos de dados relacionais possui uma técnica chama Trigger que é utilizada para poder colocar uma determinada regra de negócio da aplicação
- Os Triggers padrão são Stored Procedures que são disparadas automaticamente quando uma operação como um
- INSERT
- UPDATE
- DELETE
- é efetuado sobre uma tabela
- Logo após a aplicação cliente enviar algum destes comandos para o banco, o respectivo Trigger é disparado
- Um Trigger padrão ocorre depois de algumas verificações do SQL, mas ainda podemos prevenir a ação que executou o Trigger se utilizarmos a instrução ROLLBACK, pois o SQL Server automaticamente inicia uma transação para instruções do tipo INSERT, UPDATE ou DELETE ( transação implícita )
- Supondo que tenhamos esta tabela criada em um banco do SQL Server:
CREATE TABLE DBO.TESTE ( COD INT )
Um Trigger de INSERT pode ser criado da seguinte maneira:
CREATE TRIGGER T_INCLUI ON TESTE FOR INSERT AS SELECT ‘DADOS A SEREM INSERIDOS:’ SELECT * FROM INSERTED GO
- Dentro de um Trigger de INSERT podemos utilizar a tabela temporária INSERTED (que o SQL Server cria somente durante o Trigger) para visualizarmos os dados que estão sendo inseridos.
- Se utilizarmos esta instrução:
INSERTINTO TESTE VALUES(1)
- O Trigger será disparado e mostrará o valor 1 para o campo COD da tabela INSERTED.
- Um exemplo de um Trigger de DELETE:
CREATE TRIGGER T_APAGA ON TESTE FOR DELETE AS SELECT ‘DADOS A SEREM APAGADOS:’ SELECT * FROM DELETED GO
- Ao invés de utilizarmos a tabela temporário INSERTED utilizamos a tabela temporária chamada DELETED, com os dados que serão apagados.
- Um Trigger de UPDATE:
CREATE TRIGGER T_ALTERA ON TESTE FOR UPDATE AS SELECT ‘DADOS ANTIGOS:’ SELECT * FROM DELETED SELECT ‘DADOS NOVOS:’ SELECT * FROM INSERTED GO
- Temos duas tabelas temporárias: a tabela DELETED, com os valores antigos para o campo, e a tabela INSERTED com os novos valores para os campos da tabela.
- Supondo que para qualquer instrução INSERT, UPDATE ou DELETE efetuada sobre a tabela TESTE seja cancelada:
CREATE TRIGGER T_CANCELA ON TESTE FOR INSERT , UPDATE , DELETE AS
SELECT ‘CANCELANDO AÇÃO.’
ROLLBACK GO
- Dicas para Triggers:
- Pode-se ter mais de um Trigger do mesmo tipo para uma mesma tabela. A ordem de execução vai do que foi criado primeira até o último que foi criado.
- O encadeamente de Trigger (um Trigger chamado outro, ou a si mesmo) pode ocorrer, desde que seja habilitada uma opção do servidor. Por padrão esta opção é habilitada.
- Triggers nas regras de negócio devem ser usados sem abus. Para verificações mais simples, pode-se utilizar outros objetos do Banco de dados, como constraints
- Triggers podem ser utilizados para replicação (cópia dos dados). Por exemplo: a cada vez que o usuário inserir um dados, você insere em outra tabela.
- Triggers não podem ser chamados manualmente como Stored Procedures. Eles são chamados somente pela instrução determinada pelo tipo do Trigger.
- Existem os novos Trigger INSTEAD OF que funcionam um pouco diferente dos Triggers padrão. Eles substituem a instrução que os disparou.