Apakah mungkin untuk memodifikasi definisi pemicu yang ada di MySQL?

14

Saya bertanya-tanya apakah mungkin untuk memperbarui definisi pemicu di MySQL. Sebagai contoh, saya memiliki pemicu T dan saya ingin menambahkan beberapa fungsi baru ke dalamnya.

Asumsi saya adalah bahwa saya harus menjatuhkan dan membuatnya kembali.

Apa praktik terbaik dalam administrasi basis data untuk skenario seperti itu?

Alex
sumber
Alex, sudahkah Anda melihat dokumentasi MySQL untuk definisi pemicu? Apa yang dikatakannya; bagian mana yang Anda tidak yakin, atau menyebabkan Anda bermasalah ketika Anda mencoba mengimplementasikannya?
Michael Green
Saya tidak menemukan informasi dalam dokumentasi MySQL jika dimungkinkan untuk memperbarui pemicu atau tidak. Saya berasumsi bahwa itu tidak mungkin dan saya ingin memeriksa ulang.
Alex

Jawaban:

19

Kedengarannya seperti Anda bertanya apakah mungkin untuk mengubah pemicu dalam operasi atom, di mana, jika definisi baru gagal, Anda tidak kehilangan yang lama ... mirip dengan CREATE OR REPLACE VIEW, yang menggantikan definisi tampilan jika definisi baru valid, tetapi biarkan yang lama ada di tempatnya, jika Anda tidak bisa menggantinya.

Sayangnya, tidak ada ALTER TRIGGERatau CREATE OR REPLACE TRIGGERdi MySQL.

Saya menyarankan bahwa praktik terbaik adalah mengunci meja tempat pemicunya tinggal, jadi tidak ada baris yang terpengaruh dengan pemicu yang tidak ada. Menjatuhkan dan menambahkan pemicu saat meja dikunci diizinkan.

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;

Pembaruan: MariaDB, dalam versi 10.1.4, menambahkan dukungan CREATE OR REPLACE TRIGGERpada pengganti drop-in untuk MySQL.

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

Oracle Oracle hingga 5.7 masih mengandalkan solusi di atas.

Michael - sqlbot
sumber
2
"Oracle MySQL sampai 5.7 masih bergantung pada solusi di atas" - masih terjadi di versi 8.0
Paul Campbell