Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Oberve que, como t[saldo] negativo, negamos t[saldo] para obter o valor do
emprstimo um nmero positivo.
Como outro exemplo do uso de triggers, suponha que um depsito queira manter um
estoque mnimo de cada item; quando o nvel de estoque de um item ficar abaixo do
nvel mnimo, um pedido dever ser feito automaticamente. assim que a regra
comercial pode ser implementada por meio de triggers: em uma atualizao do nvel
de estoque de um item, o trigger deve compar-lo ao nvel de estoque mnimo e, se
Prof. Antonio Almeida de Barros Jnior
Pg. 1
Triggers em SQL
Os sistemas de banco de dados baseados em SQL utilizam bastante os triggers,
embora antes da SQL: 1999 eles no fizessem parte do padro SQL. Infelizmente,
cada sistema de banco de dados implementou sua prpria sintaxe para os triggers,
levando a incompatibilidades.
Essa definio de trigger especifica que o trigger iniciado aps qualquer atualizao
da relao conta ser executada. Uma instruo de atualizao SQL poderia atualizar
vrias tuplas da relao, e a clusula for each row no cdigo do trigger percorreria
explicitamente cada linha atualizada. A clusula referencing new row as cria uma
varivel nrow (chamada varivel de transio), que armazena o valor de uma linha
atualizada aps a atualizao.
A instruo when especifica uma condio, a saber, nrow.saldo < 0. O sistema
executa o restante do corpo do trigger somente para tuplas que satisfazem a condio.
A clsula begin atomic ... end serve para coletar vrias instrues SQL em uma nica
instruo composta. As duas instrues insert com a estrutura begin ... end executam
tarefas especficas de criao de novas tuplas nas relaes tomador e emprstimo
para representar o novo emprstimo. A instruo update serve par definir o saldo da
conta de volta a 0 a partir do seu antigo valor negativo.
Pg. 2
A clusula referencing old row as pode ser usada para criar uma varivel
armazenando o valor antigo de uma linha atualizada ou excluda. A clusula
referencing new row as pode ser usada com inseres alm de atualizaes.
Triggers podem ser ativados antes (before) do evento (insert/delete/update), ao
invs de depois (after) do evento.
Esses triggers servem como restries extras que podem impedir atualizaes
invlidas. Por exemplo, se no quisermos permitir saldos devedores, podemos
criar um trigger before que verifica se o novo saldo negativo e, se for, reverte
a transao. Embora um trigger after pudesse ter sido usado para essa
finalidade, seu uso resultaria na atualizao sendo feito primeiro, para depois
na transao ser revertida.
Como outro exemplo, suponha que o valor em um campo de nmero de
telefone de uma tupla inserida esteja em branco, o que indica a ausncia de
um nmero de telefone. Podemos definir um trigger que substitua o valor pelo
valor null. A instruo set pode ser usada para executar tais modificaes.
CREATE TRIGGER trigger_nulo BEFORE UPDADE ON r
REFERENCING NEW ROW AS nrow
FOR EACH ROW
WHEN nrow.numero_telefone =
SET nrow.numero_telefone = null
Pg. 3
Pg. 4
Pg. 5
Pg. 6
Pg. 7
Um trigger pode disparar apenas com um evento. Para definir trigger que iniciem
mltiplos eventos, voc tem que definir vrios triggers, uma para cada evento.
Por padro um trigger deve estar associado a uma tabela especfica. Sem uma
tabela o trigger no existe. Por isso voc tem que especificar o nome da tabela
aps a palavra chave ON.
Exemplo
DELIMITER //
CREATE TRIGGER t_altera_saldo_produto
BEFORE UPDATE ON produtos
FOR EACH ROW
BEGIN
SET @old = OLDquantprod;
SET @new = NEW.quantprod;
END;
DELIMITER; //
Com qualquer editor de texto simples como o bloco de notas voc pode visualizar o
cdigo do trigger.
O MySQL fornece-lhe uma outra maneira de ver o cdigo do seu trigger, executando a
seguinte instruo SQL:
SELECT * FROM Information_Schema.Trigger
WHERE Trigger_schema = 'database_name' AND Trigger_name = 'trigger_name';
Pg. 8
Para encontrar todos os triggers associados a uma tabela da base de dados, basta
executar a seguinte instruo SQL:
SELECT * FROM Information_Schema.Trigger;
WHERE Trigger_Schema = 'database_name' AND Event_object_table = 'table_name';
Pg. 9