Chad Birch memiliki ide bagus dengan menggunakan Pemicu MySQL dan fungsi yang ditentukan pengguna . Anda dapat mengetahui lebih lanjut di Sintaks CREATE TRIGGER MySQL referensi.
Tetapi apakah Anda yakin bahwa Anda perlu memanggil executable segera ketika baris dimasukkan? Sepertinya metode itu akan rentan terhadap kegagalan, karena MySQL mungkin menelurkan beberapa contoh yang dapat dieksekusi secara bersamaan. Jika eksekusi Anda gagal, maka tidak akan ada catatan baris mana yang telah diproses dan mana yang belum. Jika MySQL menunggu eksekusi Anda selesai, maka memasukkan baris mungkin sangat lambat. Juga, jika Chad Birch benar, maka harus mengkompilasi ulang MySQL, jadi kedengarannya sulit.
Alih-alih memanggil yang dapat dieksekusi langsung dari MySQL, saya akan menggunakan pemicu untuk merekam fakta bahwa sebuah baris telah DIMASUKKAN atau DIPERBARUI:catat informasi itu dalam database, baik dengan kolom baru di tabel Anda yang ada atau dengan tabel baru bernama say database_changes
. Kemudian buat program eksternal yang secara teratur membaca informasi dari database, memprosesnya, dan menandainya sebagai selesai.
Solusi spesifik Anda akan bergantung pada parameter apa yang sebenarnya dibutuhkan oleh program eksternal.
Jika program eksternal Anda perlu mengetahui baris mana yang dimasukkan, maka solusi Anda bisa seperti ini:Buat tabel baru bernama database_changes
dengan bidang date
, table_name
, dan row_id
, dan untuk semua tabel lainnya, buat pemicu seperti ini:
CREATE TRIGGER `my_trigger`
AFTER INSERT ON `table_name`
FOR EACH ROW BEGIN
INSERT INTO `database_changes` (`date`, `table_name`, `row_id`)
VALUES (NOW(), "table_name", NEW.id)
END;
Kemudian skrip batch Anda dapat melakukan sesuatu seperti ini:
- Pilih baris pertama dalam tabel database_changes.
- Proses.
- Hapus.
- Ulangi 1-3 sampai
database_changes
kosong.
Dengan pendekatan ini, Anda dapat memiliki kontrol lebih besar atas kapan dan bagaimana data diproses, dan Anda dapat dengan mudah memeriksa untuk melihat apakah data benar-benar diproses (cukup periksa untuk melihat apakah database_changes
tabel kosong).