MySQL'de mevcut bir tetikleyici tanımını değiştirmek mümkün müdür?


14

MySQL'de bir tetikleyici tanımının güncellenmesinin mümkün olup olmadığını merak ediyorum. Örneğin, bir T tetikleyicim var ve ona bazı yeni işlevler eklemek istiyorum.

Benim varsayım, onu bırakıp yeniden yaratmam gerektiğidir.

Bu tür senaryolar için veritabanı yönetimindeki en iyi uygulamalar nelerdir?


Alex, tetik tanımı için MySQL belgelerine baktın mı? O ne dedi; hangi kısımlardan emin değilsiniz veya bunları uygulamaya çalıştığınızda size sorun çıkarıyorsunuz?
Michael Green

Bir tetikleyiciyi güncellemek mümkün olup olmadığını MySQL belgelerinde herhangi bir bilgi bulamadım. İmkansız olduğunu ve tekrar kontrol etmek istediğimi varsayıyorum.
Alex

Yanıtlar:


19

Atomik bir işlemde bir tetikleyiciyi değiştirmenin mümkün olup olmadığını soruyorsunuz gibi görünüyor, burada, yeni tanım başarısız olursa, eskisini kaybetmezsiniz ... benzer CREATE OR REPLACE VIEW, yeni tanım varsa görünüm tanımının yerini alır geçerli, ancak değiştiremiyorsanız eski olanı yerinde bırakır.

Ne yazık ki, MySQL'de yok ALTER TRIGGERveya var CREATE OR REPLACE TRIGGER.

En iyi uygulamanın tetiğin yaşadığı masayı kilitlemektir, bu nedenle tetikleyici yokken hiçbir satır etkilenmez. Bir tablo kilitliyken bırakma ve tetikleme ekleme işlemine izin verilir.

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;

Güncelleme: MariaDB, 10.1.4 sürümünde, CREATE OR REPLACE TRIGGERMySQL'in yerine geçmelerine destek verdi.

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

Oracle'ın 5.7 itibariyle MySQL'i hala yukarıdaki çözüme güveniyor.


2
"Oracle'ın MySQL 5.7 sürümünden itibaren hala yukarıdaki çözüme güveniyor" - hala 8.0 sürümünde olduğu gibi
Paul Campbell
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.