Os exemplos utilizados ao longo do texto, salvo menção em contrário, foram adaptados de GROFF, J. R., WEINBERG, P. N. e OPPEL, A. J. SQL: The Complete Reference, relacionado nas referências bibliográficas. ****Os scripts para criação e população das tabelas encontram-se no material de apoio.

O QUE SÃO Triggers (Gatilhos)

Triggers são programas armazenados que são disparados (daí o nome) quando determinados eventos ocorrem. Cinco tipos de eventos podem disparar um trigger:

●        Execução de comandos DML (INSERT, UPDATE e DELETE) em tabelas. São chamados de gatilhos DML;

●        Execução de comandos DDL (CREATE, ALTER, DROP). São chamados de gatilhos DML;

●        Certos estados do SGBDR: inicialização (start up), desligamento (shut down), estabelecimento de conexão (log in), encerramento de conexão (log out) e ocorrência de erros;

●        Execução de comandos DML (INSERT, UPDATE e DELETE) em views;

●        Suspensão de execução de comandos, devido a esgotamento dos recursos autorizados para o usuário (espaço em disco, por exemplo).

No contexto de aplicações, triggers são muito úteis para garantir que regras de negócio estejam sendo obedecidas pelas aplicações.

TRIGGERS DML

Triggers DML são, de longe, os mais usados por desenvolvedores. Eles estão associados a tabelas e são disparados sempre que um comando DML é executado na respectiva tabela. Triggers podem ser disparados antes ou depois da execução do comando. Também podem ser disparados uma vez para cada comando (triggers no nível de comando ou statement-level triggers) **ou a cada registro inserido/alterado/excluído (triggers no nível de registro ou row-level triggers). A definição de um trigger tem a seguinte forma geral:

CREATE [OR REPLACE] TRIGGER nome_trigger
{BEFORE | AFTER} {INSERT | DELETE | UPDATE | UPTADE OF lista_colunas} on tabela
[FOR EACH ROW]
[FOLLOWS | PRECEDES nome_outro_trigger]
[ENABLE | DISABLE]
[WHEN (condição)]
[DECLARE
	declarações;]
BEGIN
	bloco_de_comandos;
[EXCEPTION
	bloco_de_tratamento_de_exceções;]
END [nome_trigger];

●        O comando CREATE TRIGGER cria um novo trigger com nome nome_trigger. A cláusula opcional OR REPLACE substitui o trigger, caso ele exista;

●        As cláusulas BEFORE e AFTER definem se o trigger é disparado antes ou depois o comando DML;

●        As cláusulas INSERT, DELETE e UPDATE definem que comando DML causará o disparo. UPDATE ON deve ser utilizado no lugar de UPDATE caso se deseje que o disparo ocorra quando determinadas colunas forem alteradas (separadas por vírgulas). É possível definir mais de uma cláusula utilizando o operador OR;

●        A cláusula FOR EACH ROW define um trigger no nível de registro, disparando-o para cada linha alterada. Deve-se omitir esta cláusula para triggers no nível de comando.

●        Vários triggers podem ser definidos para um mesmo comando DML. FOLLOWS e PRECEDES definem a ordem de disparo;

●        A cláusulas ENABLE e DISABLE determinam se o trigger estará inicialmente habilitado (ativo) ou desabilitado. Apenas triggers habilitados são disparados. Se não informado, o estado inicial é habilitado (ENABLE);

●        WHEN define em que condições o trigger deve ser disparado, evitando que o bloco de comandos seja executado desnecessariamente. A condição deve vir entre parênteses;

●        As cláusulas DECLARE, BEGIN e EXCEPTION têm a mesma função que em procedures e funções. Opcionalmente, pode-se incluir o nome do trigger após o END.