Friday, October 8, 2010

Membandingkan 2 store prosedur pada my sql

Gw lagi Searching dan browsing eh nemu yang bagus nih.. gw pikir smakin banyak nyang naro pasti nyang butuh juga cepet nemu nya dah.. simak aje crite di bawah nih..

Pernah coding secara massive di pemrograman internal DBMS makae stored procedures/functions?
Bekerja dalam tim?
Punya beberapa database yang dipakae dalam setiap fase development? misal :

* db_ini_dev : dikonsumsi oleh para coder-coder cakep kita
* db_ini_test : dikonsumsi oleh para tester-tester cantik kita
* db_ini : dikonsumsi ama client-client baik kita

Atau pernah bekerja dalam tim yang tersebar di beberapa tempat yang terpisah, dimana masing-masing punya local database untuk kegiatan coding masing-masing?

* db_ini_dev_bandung : dikonsumsi oleh para coder-coder cakep kita di Buah Batu Regency
* db_ini_dev_solok : dikonsumsi oleh para coder-coder tampan kita di Perumnas Koto Baru Solok
* db_ini_test : di-host di sebuah server public dengan spesifikasi medium di sebuah gedung di Kuningan, Jakarta
* db_ini : di host di server public yang sama dengan db_ini_test

Ketika small-release udah digulirkan, mau-ngga-mau setiap perubahan struktur database (tabel/routines/trigger/view) harus di-broadcast ke database-database kita tersebut.

Puyeng meng-analisis diferensial?

Silakan coba trik gw untuk membandingkan stored procedures antara dua database di bawah ini. (Owya, gw pakae MySQL 5 -- dan trik ini hanya bisa jalan di MySQL 5 ke atas)

Ini script gw untuk "mendeteksi" apakah ada SP yang beda definisi (atau SP baru) dari dua database yang identik. Silakan donlot di sini :

http://qvezst.googlepages.com/xp_routines_compare.zip

Pertama-tama yang harus dilakukan adalah dengan meng-execute ntu script ke database mysql. Yupe! Database mysql (ini merupakan database yang 'pasti ada' di setiap engine MySQL Server -- yang isinya adalah informasi user, informasi schema, de-el-el). Klo sukses ke-attach, ntar di database mysql loe bakal nambah 2 stored procedure yang namanya xp_execute dan xp_routines_compare.

xp_execute adalah routine yg gw bikin untuk memudahkan pemanggilan PREPARED STATEMENTS di dalam stored routines, daripada tiap kali harus nulis PREPARE ... EXECUTE ... DEALLOCATE -- mending tinggal panggil call xp_execute("select blablabla");

dan xp_routines_compare, adalah inti dari artikel ini -- memiliki dua parameter input yaitu SOURCE DATABASE NAME dan TARGET DATABASE NAME. Untuk meng-compare dua database, loe masukin aja nama-nama database yg mo loe bandingin tersebut dalam format string (alias loe kasi kutip satu ato kutip dua). Kalo bingung, coba loe liat sampel pemanggilan ntu procedure di bawah ini :

mysql>call mysql.xp_routines_compare('ekomit_dbrisma','ekomit_dbrisma_test');
+------------------------------------+--------------------------------------+
| routine_yg_berbeda | letak_perbedaan |
+------------------------------------+--------------------------------------+
| sf_psb_get_nama_sekolah | routines baru di db : ekomit_dbrisma |
| sf_report_get_count | routines baru di db : ekomit_dbrisma |
| sf_statistik_getcount | routines baru di db : ekomit_dbrisma |
| sp_disdik_kategori_laporan | routines baru di db : ekomit_dbrisma |
| sp_disdik_lihat_laporan | routines baru di db : ekomit_dbrisma |
| sp_psb_cluster_daftar_sekolah_save | PARAMETER BODY |
| sp_psb_sekolah_luar_cluster_combo | BODY |
| sp_psb_sekolah_prs_view | PARAMETER BODY |
| sp_psb_sekolah_prs_view1record | routines baru di db : ekomit_dbrisma |
| sp_stats_agama | routines baru di db : ekomit_dbrisma |
| sp_thnajaran_kini_dan_sebelumnya | routines baru di db : ekomit_dbrisma |
| xf_properdate | BODY |
+------------------------------------+--------------------------------------+
12 rows in set


Yak! akan terlihat di mana letak perbedaan routines di dalam dua database tersebut yang akan terdeteksi beda dari ntu routines ada di PARAMETER, di BODY, atau beda di RETURN (khusus stored functions). Dan klo ada routine baru, akan langsung di-kasih-tau ntu routines baru ada di database mana..

Gimana-gimana? Keren kan?

Oh iya, -- mencoba obyektif -- gw juga pengen beritaukan LIMITASI dalam pengimplementasian xp_routines_compare() gw ini, yaitu :

* xp ini hanya bisa di call ama user yang punya GRANT PRIVILEGES sekelas root -- atau minim punya privileges SELECT ke database mysql.
* ngga bs nge-compare dari 2 databases yang BERBEDA ENGINE -- karena database yang beda engine artinya beda database mysql nya.. Ntar lah kapan-kapan gw coba bikin versi cross-engine-nya (manfaatin fitur mysql replikasi, tentunya)

No comments:

Post a Comment