Pergunta

Tenho ouvido falar sobre gatilhos e tenho algumas perguntas.
O que são gatilhos?
Como faço para configurá-los?
Há alguma precaução, além das coisas típicas do SQL, que deve ser tomada?

Foi útil?

Solução

Os gatilhos permitem que você execute uma função no banco de dados à medida que determinados eventos acontecem (por exemplo, uma inserção em uma tabela).

Não posso comentar especificamente sobre o mysql.

Precaução:Os gatilhos podem ser muito atraentes; quando você começa a usá-los, eles parecem uma solução mágica para todos os tipos de problemas.Mas, eles fazem coisas "mágicas" acontecerem, se você não conhece o banco de dados de dentro para fora, pode parecer que coisas realmente estranhas acontecem (como inserções em outras tabelas, alteração de dados de entrada, etc).Antes de implementar coisas como um gatilho, eu consideraria seriamente impor o uso de uma API em torno do esquema (de preferência no banco de dados, mas fora, se não puder).

Algumas coisas para as quais eu ainda usaria gatilhos

  • Acompanhando os campos "date_created" e "date_last_edited"
  • Inserindo "ID" (no Oracle, onde não há campo de identificação automática)
  • Mantendo o histórico de alterações

Coisas para as quais você não gostaria de usar gatilhos

  • regras/lógica de negócios
  • qualquer coisa que se conecte fora do banco de dados (por exemplo, uma chamada de serviço web)
  • Controle de acesso
  • Qualquer coisa que não seja transacional (tudo o que você fizer no gatilho DEVE ser capaz de reverter com a transação)

Outras dicas

De dev.mysql.com, um gatilho é

... um objeto de banco de dados nomeado associado a uma tabela e ativado quando um evento específico ocorre para a tabela.

A sintaxe para criá-los também está documentado naquele site.

Brevemente,

CREATE
    [DEFINER = { user | CURRENT_USER }]
    TRIGGER trigger_name trigger_time trigger_event
    ON tbl_name FOR EACH ROW trigger_stmt

E eles fornecem um exemplo:

CREATE TABLE account (acct_num INT, amount DECIMAL(10,2));
CREATE TRIGGER ins_sum BEFORE INSERT ON account FOR EACH ROW SET @sum = @sum + NEW.amount;

Você pelo menos precisa respeitar todas as restrições nas funções armazenadas.Você não poderá bloquear tabelas, alterar visualizações ou modificar a tabela que acionou o gatilho.Também aciona pode causar problemas de replicação.

Um gatilho é um objeto de banco de dados nomeado associado a uma tabela e ativado quando ocorre um evento específico na tabela.

Para criar um gatilho:

CREATE TRIGGER triggerName [BEFORE|AFTER] [INSERT|UPDATE|DELETE|REPLACE] ON tableName FOR EACH ROW SET stuffToDoHERE;


Embora eu tenha respondido esta parte, a outra pergunta ainda permanece.

Esta pergunta é antiga e outras respostas são muito boas, mas como o usuário perguntou sobre os cuidados que devem ser tomados, quero acrescentar algo:

  • Se você usa replicação em um ambiente complexo, não faça uso massivo de gatilhos e não chame procedimentos armazenados de gatilhos.
  • Os gatilhos são lentos no MySQL.
  • Você não pode usar algumas instruções SQL nos gatilhos.E algumas declarações são permitidas mas devem ser evitadas, como LOCK.A regra geral é:se você não entende completamente as implicações do que está fazendo, não deveria fazê-lo.
  • Os gatilhos podem causar loops infinitos, então tome cuidado.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top