É possível modificar uma definição de gatilho existente no MySQL?

14

Gostaria de saber se é possível atualizar uma definição de gatilho no MySQL. Por exemplo, eu tenho um gatilho T e quero adicionar algumas novas funcionalidades a ele.

Minha suposição é que eu preciso soltar e recriá-lo.

Quais são as melhores práticas na administração de banco de dados para esses cenários?

Alex
fonte
Alex, você procurou na documentação do MySQL a definição de trigger? O que ele disse; de quais partes você não tem certeza ou está causando problemas ao tentar implementá-las?
Michael Green
Não encontrei nenhuma informação na documentação do MySQL se é possível atualizar um gatilho ou não. Presumo que seja impossível e quero verificar novamente.
6284 Alex

Respostas:

19

Parece que você está perguntando se é possível alterar um gatilho em uma operação atômica, onde, se a nova definição falhar, você não perde a antiga ... semelhante a CREATE OR REPLACE VIEW, que substitui a definição de exibição se a nova definição é válido, mas deixa o antigo no lugar, se você não puder substituí-lo.

Infelizmente, não existe ALTER TRIGGERou CREATE OR REPLACE TRIGGERno MySQL.

Eu sugeriria que a melhor prática é bloquear a tabela onde o gatilho mora, para que nenhuma linha seja impactada com o gatilho ausente. É permitido soltar e adicionar gatilhos enquanto uma tabela está bloqueada.

mysql> LOCK TABLES t1 WRITE; -- the next prompt appears once you've obtained the lock
mysql> DROP TRIGGER t1_bi; 
mysql> DELIMITER $$
mysql> CREATE TRIGGER ti_bi BEFORE INSERT ON t1 FOR EACH ROW 
       BEGIN
       ...
       END $$
mysql> DELIMITER ;
mysql> UNLOCK TABLES;

Atualização: O MariaDB, na versão 10.1.4, adicionou suporte CREATE OR REPLACE TRIGGERao seu substituto para o MySQL.

https://mariadb.com/kb/en/mariadb/create-trigger/

O MySQL da Oracle a partir da versão 5.7 ainda conta com a solução acima.

Michael - sqlbot
fonte
2
"MySQL da Oracle como de 5,7 ainda depende da solução acima" - ainda o caso na versão 8.0
Paul Campbell