Obrigado por visitar a devmedia.com.br!

Precisamos de você para divulgar nossos vídeos e cursos gratuitos para a comunidade.

Se você gosta da devmedia.com.br por favor dê-nos o seu clique para o Google+ e ajude outros desenvolvedores ao redor do mundo.



Obrigado por seu apoio!
Equipe DevMedia

sair sem compartilhar (x)
DevMedia - asp.net, Java, Delphi, SQL e web Design, tudo em um só lugar!
Bem vindo a DevMedia!
LOGIN:     SENHA:

MySQL – TRIGGERS

Neste artigo, serão apresentados os principais conceitos sobre os TRIGGERS e sua aplicabilidade.

 

Neste artigo, serão apresentados os principais conceitos sobre os TRIGGERS e sua aplicabilidade. Após a conceituação, trabalharemos um estudo de caso de um estoque de produtos, com baixa nas quantidades através destes procedimentos armazenados.

 

Após ler este artigo, você estará apto à:


   - Definir o que é um TRIGGER;
   - Definir dados de antes (OLD) e depois (NEW);
   - Criar um TRIGGER;
   - Excluir um TRIGGER;
   - Restrições em relação à TRIGGERS.

 

O que é um TRIGGER?

 

Um TRIGGER ou gatilho é um objeto de banco de dados, associado a uma tabela, definido para ser disparado, respondendo a um evento em particular. Tais eventos são os comandos da DML (Data Manipulation Language): INSERT, REPLACE, DELETE ou UPDATE. Podemos definir inúmeros TRIGGERS em uma base de dados baseados diretamente em qual dos comandos acima irá dispará-lo, sendo que, para cada um, podemos definir apenas um TRIGGER. Os TRIGGERS poderão ser disparados para trabalharem antes ou depois do evento. Veremos como definir o momento de atuação do TRIGGER mais à frente.

 

Utilizaremos a seguinte tabela da Figura 01 para nossos testes:

 

sql-05-03-2008pic01.JPG 

Figura 01. Criando a tabela de testes – tbl_cliente.

        

Baseado na tabela tbl_cliente, podemos definir os TRIGGERS para serem disparados, por exemplo, antes (BEFORE) ou depois (AFTER) de um INSERT. Agora sabemos então que para cada momento BEFORE ou AFTER, podemos ter um TRIGGER a ser disparado para defender alguma lógica.

 

A sintaxe geral de definição de um TRIGGER é a seguinte:

sql-05-03-2008pic11.JPG

   - DEFINER: Quando o TRIGGER for disparado, esta opção será checada para checar com quais privilégios este será disparado. Utilizará os privilégios do usuário informado em user (‘wagner’@’localhost’) ou os privilégios do usuário atual (CURRENT_USER). Caso essa sentença seja omitida da criação do TRIGGER, o valor padrão desta opção é CURRENT_USER();


   -
trigger_name: define o nome do procedimento, por exemplo, trg_test;
   - trigger_time: define se o TRIGGER será ativado antes (BEFORE) ou depois (AFTER) do comando que o disparou;
   -
trigger_event: aqui se define qual será o evento, INSERT, REPLACE, DELETE ou UPDATE;
   - tbl_name: nome da tabela onde o TRIGGER ficará “pendurado” aguardando o trigger_event;
   -
trigger_stmt: as definições do que o o TRIGGER deverá fazer quando for disparado.

 

Definir dados de antes (OLD) e depois (NEW)

 

Em meio aos TRIGGERS temos dois operadores importantíssimos que nos possibilitam acessar as colunas da tabela alvo do comando DML, ou seja, podemos acessar os valores que serão enviados para a tabela tbl_cliente antes (BEFORE) ou depois (AFTER) de um UPDATE, por exemplo. Tais operadores nos permitirão então, ter dois momentos, o antes e o depois e também examinar os valores para que sejam ou não inseridos, atualizados ou excluídos da tabela.

 

Antes mesmo de analisarmos os operadores, temos que analisar vejamos as seguintes diretrizes:


   - INSERT: o operador NEW.nome_coluna, nos permite verificar o valor enviado para ser inserido em uma coluna de uma tabela. OLD.nome_coluna não está disponível.
   -
DELETE: o operador OLD.nome_coluna nos permite verificar o valor excluído ou a ser excluído. NEW.nome_coluna não está disponível.
   -
UPDATE: tanto OLD.nome_coluna quanto NEW.nome_coluna estão disponíveis, antes (BEFORE) ou depois (AFTER) da atualização de uma linha.

 

Percebemos então que, ao inserir uma nova linha em uma tabela, temos os valores das colunas disponível através do operador NEW.nome_coluna, quando excluímos uma linha, temos ainda os valores das colunas da linha excluída através do operador OLD.nome_coluna e temos os dois operadores disponíveis no UPDATE e no REPLACE pois as duas declarações consistem em um DELETE seguido por um INSERT.  (REPLACE, este comando apresenta outros detalhes a serem analisados numa próxima oportunidade).

 

Criemos então um primeiro TRIGGER, bem básico que não fará nada mais que validar se os dados foram passados em uma declaração INSERT antes (BEFORE) que sejam  cadastrados na tabela de exemplo. Validaremos o nome com quantidade de caracteres maior ou igual a 4 (quatro). (Figura 02)

 

sql-05-03-2008pic02.JPG 

Figura 02 – TRIGGER para conferir se o CHAR_LENTH() de nome é maior que 4 (quatro).

 

Ao tentarmos inserir um valor cujo número de caracteres é menor ou igual a 0 ou nada, o TRIGGER será disparado e setará o valor enviado para NULL através do operador NEW.nome_coluna. Como na tabela de exemplo a coluna cliente_nome foi configurada com a restrição NOT NULL, ou seja, não aceitará valores nulos, uma mensagem de erro será enviada e o INSERT falhará, como mostra a Figura 03.

 

sql-05-03-2008pic03.JPG 

Figura 03 – O INSERT falhará após uma tentativa de inserir um valor não permitido.

 

Podemos criar uma restrição de integridade referencial com TRIGGERS. Por exemplo, usaremos tabelas MyISAM (que não dão suporte a criação de relacionamento com chaves estrangeiras) e, aproveitando nosso exemplo, como clientes compram produtos, podemos criar uma tabela de produtos e restringir que somente os produtos cadastrados podem ser comprados, inseridos na tabela de compra e que somente clientes cadastrados podem efetuar compras. Criemos então a tabela de produtos e compras, acompanhe o seguinte modelo:

 

sql-05-03-2008pic04.JPG 

 

Perceba que o modelo não conta com relacionamentos, os quais defenderemos com TRIGGERS. Um INSERT que seja endereçado à tabela tbl_compra (que tem as colunas cliente_id e produto_id definidas como NOT NULL), disparará um TRIGGER, tendo a responsabilidade de conferir se o produto a ser inserido existe na tabela de produtos e se o cliente que efetua a compra está na tabela tbl_cliente. Vamos ao TRIGGER (Figura 04):

 

sql-05-03-2008pic05.JPG 

Figura 04 – TRIGGER para impor integridade referencial ao campos que se relacionam com outras tabelas.

 

Como somente criamos a tabela e não inserimos nenhum cliente e nem produto algum, qualquer tentativa de inserção na tabela tbl_compra falhará, como mostra a figura seguinte (Figura 05):

 

sql-05-03-2008pic06.JPG 

Figura 05 – Implementando restrição de integridade referencial com TRIGGERS.

 

Uma outra aplicação para se trabalhar com TRIGGERS é ter uma tabela para e-mail para ser utilizada por algum sistema de newsletter da empresa. Podemos facilmente nesse caso, implementar um TRIGGER para colher os e-mail do cadastro de clientes e estes serem inseridos em uma outra tabela, por exemplo, uma tabela com a seguinte estrutura (Figura 06):

 

sql-05-03-2008pic07.JPG 

Figura 06 – Tabela para cadastrar e-mail automaticamente com o auxílio de TRIGGERS.

 

Definindo o TRIGGER para pegar os valores inseridos na coluna cliente_email da tabela tbl_cliente e inserir também na tabela tbl_newsletter. Segue definido na Figura 07.

 

sql-05-03-2008pic08.JPG 

Figura 07 – Inserção automática de e-mail em outra tabela.

 

Testando o TRIGGER na Figura 08:

 

sql-05-03-2008pic09.JPG
Figura 08
– Os endereços de e-mails de clientes sendo inseridos automaticamente por meio de TRIGGERS.

        

Excluir um TRIGGER

 

Para excluir um TRIGGER, utilize a sintaxe DROP TRIGGER trigger_name, como mostra o exemplo da Figura 09.

 

sql-05-03-2008pic10.JPG 

Figura 09 – Excluindo um TRIGGER.

 

Restrições em relação à TRIGGERS

 

A implementação deste recurso atualmente no MySQL tem várias limitações, a conferir as principais:

   - Não se pode chamar diretamente um TRIGGER com
CALL, como se faz com um Stored Procedures;
   - Não é permitido iniciar ou finalizar transações em meio à TRIGGERS;
   - Não se pode criar um TRIGGERS para uma tabela temporária –
TEMPORARY TABLE;
   - TRIGGERS ainda não podem ser implementadas com a intenção de devolver para o usuário ou para uma aplicação mensagens de erros.

 

Conclusão

 

Apresentamos neste artigo, os principais conceitos de implementações de TRIGGERS, com os operadores OLD e NEW. No próximo artigo mostrarei como impedir uma exclusão de um dado baseado em outras tabelas relacionadas e como construir um log no banco de dados com um TRIGGER disparado com a instrução UPDATE, onde temos acesso ao antes e o depois das alterações.

 

Happy MySQL’ing





    1 COMENTÁRIO

[Fechar]

Este post é fechado - você precisa ter acesso ao post para incluir um comentário.



Marcelo Jose Guerra Pereira
Olá Wagner,

Sou o que pode-se chamar de dinossauro nos dias de hoje, programei com muito prazer dos meus 15 aos 22 anos, parei para me dedicar a outras atividades, e hoje, por necessidade, decidi voltar para a área, tenho que reconhecer que nada hoje é igual ao que era a 22 anos atras, mas estou gostando de aprender linguagens atuais como Java, C#, Delph, ainda estou engatinhando, mas como sou brasileiro, eu nao desisto nunca!..

bom, tirando o papo furado, tenho pesquisado muito na internet, vejo exemplos e mais exemplos dos mais diversos possíveis, e tenho que lhe dar os parabéns, vc é um homem focado e muito objetivo, diferente de outros exemplos que ja vi, o seu é o menos abstrato.

Continue assim..

Os iniciantes agradecem..

Eu pelo menos agradeço!

um grande abraço!

Marcelo Guerra


em 8/3/2011 21:06 - Responder

 



Autor
Wagner Bianchi

Wagner Bianchi é Tecnólogo em Gerenciamento de Bancos de Dados pela Faculdade Infórium de Tecnologia, Pós-Graduando em Administração Estratégica de Empresas (Executivo Jr.) pela Fundação Getúlio Vargas no Minas Business Institute, Consultor em Desenvolvimento de Sistemas pela INFODBA C&T, empresa on...


Space do autor
Estatísticas
Favorito:
Comentários:
Feedback:
Utilidade:
6   0
[Fechar]

Você precisa estar logado para dar um feedback.

Clique aqui para efetuar o login
[Fechar]
Este post está disponível para assinantes da SQL Magazine ou para quem possui Créditos DevMedia.

  Conheça os planos de créditos DevMedia e visualize esse post agora mesmo!

Plano conveniência – Neste plano este post custa R$ 0,00 (Compre agora)
Esse plano permite que você compre somente um post, pagando por ele seu preço sem desconto.

Plano ocasional: Aqui este post custa: R$ -1,00 (assinante) ou R$ -1,00 (não-assinante)
Este plano é ideal para quem tem interesse em mais de um post. Você compra um mínimo de R$ 50,00 em créditos e ganha, em média, 50% de desconto no preço do post. Compre Créditos agora!

Assinatura de Créditos (Plano econômico) – Aqui este post custa R$ -1,00
Este plano é ideal para quem tem interesse em muitos posts. Com esse plano você compra R$ 180,00 em créditos e ganha, em média, 80% de desconto no preço do post. Assine este plano agora!

> Saiba mais sobre o Sistema de Créditos DevMedia
web-03
DevMedia  |  Anuncie  |  Fale conosco
Hospedagem web por Porta 80 Web Hosting
2012 - Todos os Direitos Reservados a web-03