Escolar Documentos
Profissional Documentos
Cultura Documentos
Triggers em PL/SQL
Escrevendo triggers de banco de dados
Os exemplos daquilo que você pode fazer com os triggers incluem a replicação de
dados, o armazenamento dos dados de forma redundante para evitar associações
freqüentes de tabela e a implantação de regras de negócios complexas.
O que é um trigger?
Triggers DML
Os triggers DML são os triggers tradicionais que podem ser definidos em uma tabela e
são executados, ou disparados, em resposta aos seguintes eventos:
Uma linha de uma tabela é atualizada. Uma linha de uma tabela é excluída. Não é
possível definir um trigger para ser disparado quando uma linha é selecionada.
Quando você define um trigger, ele se torna parte do banco de dados e é sempre
executado quando o evento para o qual ele é definido ocorre.
Não importa se o evento é disparado por alguma digitação em uma declaração SQL
usando o SQL Plus, executando um programa de cliente-servidor que atualiza o banco
de dados, ou executam um utilitário como o SQL"-Loader do Oracle para fazer o bulk-
load dos dados.
Por causa disso, um trigger permite que você execute validação crítica ou cálculos em
resposta às alterações fitas no banco de dados, seja qual for a fonte.
Suponhamos que você queira ter certeza de que todos os nomes de departamentos foram
armazenados usando letras maiúsculas. Talvez você esteja fazendo isso para facilitar a
pesquisa naquele campo.
A linha 1 diz à Oracle para criar esse trigger com o nome department_insert update para
substituir, se preciso, todo trigger existente de mesmo nome. A linha 2 diz que ele será
disparado sempre que uma linha nova for inserida na tabela de departamentos ou
sempre que um registro de departamento mudar. Na linha 8 há uma linha de código que
usa a função incorporada UPPER para forçar o nome do departamento a ser colocado
em maiúsculas. Observe a referência a : NEW. Esse é o alias padrão para o novo valor
do registro.
O alias :OLD pode ser usado para se referir ao valor antigo de um campo antes que-
aconteça unia atualização. A linha 3 diz à Oracle para disparar esse trigger uma vez
para cada linha modificada. Se você precisasse emitir uma declaração UPDATE para
alterar os nomes de todos os departamentos da tabela, esse trigger seria disparado para
cada um daqueles registros.
OBS: Observe que o trigger forçou todos os nomes de departamento a serem colocados
em maiúsculas, independentemente do nome ter sido o resultado de um registro novo
inserido ou de um registro existente que foi atualizado.
Os triggers DML podem ser classificados de duas maneiras diferentes: quando eles são
disparados com relação à declaração SQL de trigger, ou se eles disparam ou não para
cada linha afetada pela declaração SQL de disparo.
Existem duas opções quando um trigger é disparado com relação a uma declaração
SQL: antes ou depois. Os before triggers são executados antes do disparo da declaração
SQL. Os after triggers são executados depois do disparo da declaração SQL.
Os triggers no nível de declaração não. Isso acontece porque a SQL é uma linguagem
orientada para o conjunto-as declarações SQL podem afetar muitas ou mesmo todas as
linhas de uma tabela.
Os triggers no nível de declaração são disparados apenas uma vez; portanto, não seria
possível determinar uma referência de coluna em tal trigger.
Os triggers são executados como resposta a uma declaração SQL e podem ser definidos
para as declarações INSERT, UPDATE e DE LETE. Estas são chamadas de insert
triggers, update tringgers e delete triggers, respectivamente.
Na próxima matéria vou falar de como usar os triggers para modificar os dados que
estão sendo inseridos em uma tabela.
Usos dos triggers em PL/SQL
A sintaxe para definir um trigger de banco de dados
A sintaxe usada para definir um trigger DML tradicional em uma tabela de banco de
dados. Partes da sintaxe são meio complexas, mas não se deixe intimidar.
verb_list - identifica os verbos SQL que são disparados por aquele trigger. A sintaxe de
verb_list é a seguinte:
column_list - Faz com que uni update, trigger seja disparado apenas quando uma das
colunas listadas é alterada. Caso contrário, o trigger dispara sempre que alguma coluna
da tabela é alterada.
new_alias - Esse é o nome que você quer usar quando se referir ao valor de uni campo
depois que o verbo SQL for executado
condition - é uma condição opcional colocada na execução do trigger. Ela só pode ser
usada nos triggers no nível de linha. Se condition estiver presente, o trigger só será
disparado quando a condição for verdadeira.
A condição pode ser qualquer expressão boolean, não pode conter nenhuma consulta e
deve usar os nomes de correlação, em outras palavras, NEW e OLD para se referir aos
valores de coluna da linha que está sendo alterada.
A declaração CALL é usada para fazer com que o trigger consista em apenas uma
chamada de procedimento armazenado.
Os nomes de correlação: OLD e: NEW são fornecidos para esse fim. Isso funciona
como uni registro da PL/SQL: OLD contém os valores de campo antes deles serem
atualizados e: NEW contém os valores de campo depois da atualização. Use i notação
de ponto padrão, em outras palavras: OLD.field_name para se referir ao valor de
determinado campo. Você verá exemplos disso em diversas listagens deste capítulo.
Os usos possíveis para os triggers de banco de dados variam e são limitados apenas pela
sua imaginação. Alguns usos comuns são:
Os triggers são usados para ajudar na manutenção da integridade dos dados que estão
armazenados no banco de dados. Suponhamos que você queira armazenar urna
contagem do número de empregados de cada departamento e que você queira armazenar
essa contagem na tabela de departamentos. Primeiro você adicionaria um campo de
contagem de empregados à tabela de departamentos usando uma declaração como esta:
Uma solução possível seria fazer com que todo programa que adicionasse, excluísse ou
alterasse a atribuição de departamento de um empregado também atualizasse esse valor
apropriadamente. Isso funcionaria se os programas funcionassem corretamente, e se
você não se esquecesse de que o valor precisaria ser atualizado.
Como você tem de lidar com inserts, updates e deletes, três triggers são necessários para
atualizar a conta de empregado de departamento
Tipo do trigger
O exemplo abaixo mostra o código para criar os três triggers necessários para atualizar
as contas de empregado de cada departamento.
Agora que você criou os triggers necessários e inicializou os contadores pode fazer
algumas consultas para testar o seu código. Um exemplo de registros de empregados
sendo inseridos: