Bogos

setembro 18, 2008

Triggers SQL

Filed under: SQL — Tags:, , , , , , , , , , — Bogos @ 1:42 pm

Bom, pra quem não sabe o que são triggers, vamos falar um pouco sobre elas.
Triggers traduzindo do inglês (Não é alemão? Francês? Putz! É inglês… Se você não diz…) são “gatilhos” que são acionados automagicamente pelo banco. Dentro dessas triggers programamos blocos PL/SQL ou apenas uma query SQL. Um gatilho pode ser acionado depois (AFTER) ou antes (BEFORE) um evento (UPDATE/INSERT/DELETE) em uma tabela.

Um exemplo simples:

Temos em uma tabela um contador de por exemplo posts em um blog. Temos a tabela “posts” onde ficam armazenados os mesmos. Podemos criar uma trigger para cada INSERT realizado na tabela posts. Nessa trigger criamos uma query UPDATE que adiciona +1 no campo da segunda tabela com o contador. Podemos em seguida criar outra trigger para um DELETE na tabela posts, removendo -1 no contador. Simples, prático e extremamente útil. Imagine a porrada de código e tratamentos que você evitaria pro programador (não do banco) numa situação simples dessas. Isso sem contar no desempenho do software que chama apenas 1 query, apesar do banco executar as 2 (a chamada + a trigger).

Outro exemplo:

Temos uma tabela de funcionários e outra dos dependentes desses funcionários. Ao remover (ou desativar) um funcionário, uma trigger pode remover (ou desativar) seus dependentes automagicamente.

Vamos à parte legal agora, a sintaxe!
Temos então:

CREATE OR REPLACE TRIGGER [nome]
[AÇÃO] [EVENTO] ON [tabelaAção]
FOR EACH ROW
BEGIN
/* Bloco PL/SQL ou query SQL */
END;

Legenda:
AÇÃO = AFTER ou BEFORE
EVENTO = INSERT, UPDATE ou DELETE
nome = nome da trigger (dã?!)
tabelaAção = nome da tabela que ao ocorrer o EVENTO aciona a trigger

No bloco de instruções há algumas dicas interessantes, segue:

Vamos montar o problema: Temos duas tabelas, funcionarios e filiais.

FUNCIONARIOS

id
nome
idFilial
FILIAIS

id
descricao
qtdeFunc

Bom nota-se que a tabela filiais tem um campo chamado qtdeFunc que é exatamente a quantia de funcionários que aquela filial tem. Vamos criar uma trigger para controlar essa quantidade. Veja que já de cara temos um probleminha, no momento que o funcionário é cadastrado, no bloco de instruções da trigger temos que recuperar a id da filial cadastrada no registro desse novo funcionário para poder adicionar ao contador dessa filial somente.
Nesse momento você aprende que temos dois comandos simples para recuperar dados da tabela que recebeu o EVENTO (lembra-se deles não?). Se tivesse-mos por exemplo um UPDATE e queremos pegar o valor antigo e o novo pra compararmos em algum momento do bloco de instruções temos o comando :new.CAMPO_DA_TABELA para recuperarmos o valor atual (depois do update) e :old.CAMPO_DA_TABELA para recuperarmos o valor antigo, ou seja, antes do update.
Voltando ao problema e tendo como base essas informações, criamos nossa trigger:

CREATE OR REPLACE TRIGGER tg_qtdeFuncFilial
AFTER INSERT ON funcionarios
FOR EACH ROW
BEGIN
UPDATE filiais SET qtdeFunc = qtdeFunc + 1 WHERE id = :new.filial
END;

Ao adicionar um novo funcionário, acrescente + 1 na quantidade de func. da filial com id igual a :new.filial (campo filial do novo funcionario)

Pra finalizar, mais duas observações muito importantes:

  • O Oracle recomenda que limitamos os nossos códigos no máximo em 60 linhas, caso você tenha que criar algo mais complexo crie stored procedure, será mais utíl
  • ATENÇÃO: Cuidado ao criar as Triggers que dispara sob um instrução UPDATE na sua Tabela, não pode alterar a tabela porque isso iria disparar a Trigger infinitamente causando um loop infinito.

Basicamente é isso aí!
Até a próxima!

Anúncios

1 Comentário »

  1. […] TABLE, INSERT INTO e UPDATE – SQL Bom, já fiz alguns posts sobre triggers, views e packages que são recursos digamos mais avançados que usam da SQL. Neste post vou tratar […]

    Pingback por CREATE/DROP/ALTER TABLE, INSERT INTO e UPDATE - SQL « Bogos — outubro 2, 2008 @ 7:30 pm


RSS feed for comments on this post. TrackBack URI

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

w

Conectando a %s

Blog no WordPress.com.

%d blogueiros gostam disto: