Apakah basis data memicu ide yang buruk?
Dalam pengalaman saya mereka jahat, karena mereka dapat menghasilkan efek samping yang mengejutkan, dan sulit untuk di-debug (terutama ketika satu pemicu memicu yang lain). Seringkali pengembang bahkan tidak berpikir untuk mencari jika ada pemicu.
Di sisi lain, sepertinya jika Anda memiliki logika yang harus terjadi waktu tambahan yang baru FOO
dibuat dalam database maka tempat paling mudah untuk meletakkannya adalah pemicu memasukkan pada tabel FOO.
Satu-satunya waktu kami menggunakan pemicu adalah untuk hal-hal yang sangat sederhana seperti mengatur ModifiedDate
.
Jawaban:
Masalah utama dengan pemicu adalah
Ini hanya berarti mereka harus digunakan dengan hati-hati untuk keadaan yang tepat; yang dalam pengalaman saya terbatas pada masalah integritas relasional (kadang-kadang dengan granularity lebih baik daripada yang bisa Anda dapatkan secara deklaratif); dan biasanya tidak untuk keperluan bisnis atau transaksional. YMMV.
sumber
Tidak, itu sebenarnya ide yang bagus. Jika ada masalah dengan pemicu spesifik Anda, maka Anda tidak melakukannya dengan benar, tetapi itu biasanya berarti ada masalah dengan implementasi Anda, bukan konsep pemicu itu sendiri :-).
Kami menggunakan pemicu banyak karena itu menempatkan aktivitas spesifik DBMS di bawah kendali database di mana ia berada. Pengguna DBMS tidak perlu khawatir tentang hal-hal semacam itu. Integritas data terletak pada database itu sendiri, bukan aplikasi atau pengguna yang menggunakannya. Tanpa kendala dan pemicu serta fitur lain dalam basis data, diserahkan kepada aplikasi untuk menegakkan aturan dan hanya dibutuhkan satu aplikasi / pengguna yang nakal atau buggy untuk menghancurkan data.
Misalnya, tanpa pemicu, hal-hal menakjubkan seperti kolom yang dibuat secara otomatis tidak akan ada dan Anda harus memproses fungsi pada setiap baris saat memilihnya. Itu mungkin akan mematikan kinerja DBMS, jauh lebih baik untuk membuat kolom yang dibuat secara otomatis pada waktu memasukkan / memperbarui karena hanya itulah waktu perubahannya.
Juga, kurangnya pemicu akan mencegah aturan data ditegakkan di DBMS seperti pra-pemicu untuk memastikan kolom memiliki format tertentu. Perhatikan bahwa ini berbeda dari aturan integritas data yang umumnya hanya mencari kunci asing.
sumber
Alat tidak pernah jahat. Aplikasi alat-alat itu bisa jahat.
sumber
Saya setuju. Masalah dengan pemicu adalah orang, bukan pemicu. Meskipun lebih untuk dilihat, lebih untuk mempertimbangkan dan meningkatkan tanggung jawab pada coders memeriksa hal-hal dengan benar, kami tidak membuang indeks untuk membuat hidup kita lebih sederhana. (Indeks buruk bisa sama buruknya dengan pemicu buruk)
Pentingnya pemicu (dalam pikiran saya) adalah bahwa ...
- Setiap sistem harus selalu dalam keadaan valid
- Kode untuk menegakkan status yang valid ini harus dipusatkan (tidak ditulis dalam setiap SP)
Dari sudut pandang pemeliharaan, pemicu sangat berguna untuk coders yang kompeten dan masalah untuk yang lebih junior / amatir. Namun, orang-orang ini perlu belajar dan tumbuh.
Saya kira itu turun ke lingkungan kerja Anda. Apakah Anda memiliki orang yang dapat diandalkan yang belajar dengan baik dan dapat dipercaya untuk menjadi metodis? Jika tidak, Anda tampaknya memiliki dua pilihan:
- Terima bahwa Anda harus kehilangan fungsionalitas untuk memberi kompensasi
- Terima bahwa Anda memerlukan orang yang berbeda atau pelatihan dan manajemen yang lebih baik
Kedengarannya kasar, dan kurasa memang begitu. Tapi itu kebenaran dasar, dalam pikiranku ...
sumber
Saya pikir pemicu tidak hanya tidak jahat, tetapi juga diperlukan untuk desain database yang baik. Pemrogram aplikasi berpikir bahwa basis data hanya dipengaruhi oleh aplikasi mereka. Mereka sering salah. Jika integritas data harus dipertahankan tidak peduli dari mana perubahan data berasal, pemicu adalah persyaratan dan bodoh untuk menghindarinya karena beberapa programmer terlalu etnosentris untuk mempertimbangkan bahwa sesuatu selain aplikasi berharga mereka mungkin mempengaruhi hal-hal. Tidak sulit untuk merancang atau menguji atau memecahkan masalah pemicu jika Anda adalah pengembang basis data yang kompeten. Juga tidak sulit untuk menentukan bahwa pemicu menyebabkan hasil yang tidak terduga jika terjadi pada Anda (seperti yang terjadi pada saya) untuk melihat di sana. Jika saya mendapatkan kesalahan mengatakan tabel yang saya tidak referensi di sp saya memiliki kesalahan FK, Saya tahu bahkan tanpa memikirkannya bahwa pemicu yang menyebabkan masalah dan juga pengembang database yang kompeten. Menempatkan aturan bisnis hanya dalam aplikasi adalah penyebab utama saya menemukan data buruk karena orang lain tidak tahu bahwa aturan itu ada dan melanggarnya dalam proses mereka. Aturan data-sentris termasuk dalam database dan pemicu adalah kunci untuk menegakkan yang lebih kompleks.
sumber
some programmers are too ethnocentric to consider that something other than their prized application may be affecting things
Sebagian besar ya.
Kesulitan dengan pemicu adalah ia melakukan hal-hal "di belakang Anda"; pengembang yang mempertahankan aplikasi bisa dengan mudah tidak menyadari bahwa aplikasi itu ada dan membuat perubahan yang mengacaukan segalanya tanpa menyadarinya.
Ini menciptakan lapisan kompleksitas yang hanya menambah pekerjaan pemeliharaan.
Daripada menggunakan pemicu, prosedur / rutin tersimpan, umumnya dapat dibuat untuk melakukan hal yang sama, tetapi dengan cara yang jelas dan dapat dipertahankan - memanggil rutin yang tersimpan berarti pengembang dapat melihat kode sumbernya dan melihat dengan tepat apa yang terjadi.
sumber
Pemicu sangat kuat dan berguna, ada sejumlah skenario di mana pemicu adalah solusi terbaik untuk masalah.
Mereka juga merupakan alat "retas" yang sangat bagus. Sering ada situasi di mana Anda tidak dapat mengendalikan langsung kode dan basis data. Jika Anda harus menunggu 2 bulan untuk rilis besar kode Anda berikutnya, namun Anda dapat menerapkan tambalan ke basis data Anda segera maka Anda dapat menempatkan pemicu pada sebuah tabel untuk melakukan beberapa fungsi tambahan. Kemudian ketika rilis kode dimungkinkan, Anda dapat mengganti pemicu ini dengan versi kode Anda dari fungsi yang sama jika diinginkan.
Pada akhirnya, semuanya "jahat" jika Anda tidak tahu apa yang dilakukannya. Memutuskan bahwa pemicu adalah karena ada pengembang yang tidak memahaminya sama dengan berpendapat bahwa mobil itu jahat karena beberapa orang tidak dapat mengemudi ...
sumber
Pemicu memiliki kegunaannya - logging / audit dan mempertahankan tanggal "modifikasi terakhir" adalah dua kegunaan yang sangat baik yang telah disebutkan dalam balasan sebelumnya.
Namun, salah satu prinsip inti dari desain yang baik adalah bahwa aturan bisnis / logika bisnis / apa pun yang Anda ingin menyebutnya harus dipusatkan di satu tempat. Menempatkan beberapa logika dalam database (melalui pemicu atau procs yang disimpan) dan beberapa di aplikasi melanggar prinsip itu. Menggandakan logika di kedua tempat bahkan lebih buruk, karena mereka akan selalu tidak sinkron satu sama lain.
Ada juga masalah "prinsip paling tidak mengejutkan" yang telah disebutkan.
sumber
Pemicu adalah alat yang baik bila digunakan dengan benar. Terutama untuk hal-hal seperti perubahan audit, mengisi tabel ringkasan, dll.
Sekarang mereka bisa menjadi "jahat" jika Anda berakhir di "pemicu neraka" dengan satu pemicu yang memulai pemicu lainnya. Saya pernah bekerja pada produk COTS di mana mereka memiliki apa yang mereka sebut "pemicu flex." Pemicu-pemicu ini disimpan dalam sebuah tabel karena sengatan sql dinamis dikompilasi setiap kali dieksekusi. Pemicu yang dikompilasi akan melakukan pencarian dan melihat apakah tabel itu memiliki pemicu flex untuk dijalankan dan kemudian mengkompilasi dan menjalankan pemicu "flex". Secara teori ini terdengar seperti ide yang sangat keren karena produknya mudah dikustomisasi tetapi kenyataannya adalah basis data yang cukup banyak meledak karena semua kompilasi yang harus dilakukan ...
Jadi ya, mereka bagus jika Anda menjaga apa yang Anda lakukan dalam perspektif. Jika itu sesuatu yang sangat sederhana seperti audit, meringkas, auto-sequencing, dll, tidak ada masalah. Hanya perlu diingat tingkat pertumbuhan tabel dan bagaimana pemicunya akan berdampak pada kinerja.
sumber
Pada level tinggi ada dua use case untuk trigger1
1) Untuk membuat hal-hal "otomatis" terjadi. Dalam hal ini pemicu menyebabkan efek samping, mereka mengubah data dengan cara yang tidak diharapkan karena operator (primitif) memasukkan, memperbarui, atau menghapus yang dieksekusi dan menyebabkan pemicu menyala.
Konsensus umum di sini adalah bahwa pemicu memang berbahaya. Karena mereka mengubah semantik terkenal dari pernyataan INSERT, UPDATE atau DELETE. Mengubah semantik tiga operator SQL primitif ini akan menggigit pengembang lain yang di kemudian hari perlu bekerja pada tabel database Anda yang tidak berperilaku dengan cara yang diharapkan lagi ketika dioperasikan dengan mereka dengan SQL primitif.
2) Untuk menegakkan aturan integritas data, selain yang dapat kita uraikan secara deklaratif (menggunakan PERIKSA, KUNCI UTAMA, KUNCI UNIK dan KUNCI ASING). Dalam kasus penggunaan ini semua pemicu lakukan adalah data QUERY (SELECT) untuk memverifikasi apakah perubahan yang dilakukan oleh INSERT / UPDATE / DELETE diizinkan atau tidak. Seperti halnya batasan deklaratif bagi kita. Hanya dalam hal ini kami (pengembang) telah memprogram penegakan hukum.
Menggunakan pemicu untuk kasus penggunaan terakhir tidak berbahaya.
Saya menulis blog tentang itu di: http://harmfultriggers.blogspot.com
sumber
Saya tahu pengembang yang berpikir pemicu harus selalu digunakan di mana itu adalah cara paling langsung untuk mencapai fungsi yang mereka inginkan, dan pengembang yang tidak akan pernah melakukannya. Hampir seperti dogma di antara kedua kubu.
Namun saya pribadi sepenuhnya setuju dengan MarkR - Anda dapat (hampir) selalu menulis kode yang secara fungsional setara dengan pemicu yang akan lebih jelas dan karenanya lebih mudah untuk dipertahankan.
sumber
Bukan jahat. Mereka sebenarnya menyederhanakan hal-hal seperti
1.Logging / audit perubahan pada catatan atau bahkan skema basis data
Anda dapat memiliki pemicu pada ALTER TABLE yang mengembalikan perubahan dalam lingkungan produksi Anda. Ini harus mencegah modifikasi tabel yang tidak disengaja.
2.Memperkuat integritas referensial (hubungan kunci utama / asing, dll) di banyak basis data
sumber
ALTER TABLE
.Nah, mereka tidak jahat - mereka hanya disalahpahami :-D
Pemicu memiliki penggunaan yang valid, tetapi terlalu sering sebagai retas retro yang akhirnya memperburuk keadaan.
Jika Anda mengembangkan DB sebagai bagian dari aplikasi, logikanya harus selalu dalam kode atau sprocs yang melakukan panggilan. Pemicu hanya akan menyebabkan rasa sakit saat debug.
Jika Anda memahami bagaimana mengunci, menemui jalan buntu dan bagaimana DB mengakses file pada disk kemudian menggunakan pemicu dengan cara yang benar (misalnya mengaudit atau mengarsipkan akses DB langsung) bisa sangat berharga.
sumber
Mengatakan bahwa mereka jahat adalah sesuatu yang berlebihan tetapi mereka dapat menyebabkan perselisihan. Ketika penembakan satu pemicu menyebabkan pemicu lain untuk menembak itu menjadi sangat rumit. Katakanlah mereka merepotkan: http://www.oracle.com/technology/oramag/oracle/08-sep/o58asktom.html
Melakukan logika bisnis di Oracle dengan pemicu lebih sulit daripada yang tampaknya karena masalah multi konkurensi. Anda tidak melihat perubahan di sesi lain hingga sesi lainnya dilakukan.
sumber
Mereka jelas tidak jahat. Saya menemukan pemicu berharga selama refactoring skema database, saat mengganti nama kolom, atau memecah kolom menjadi dua kolom atau sebaliknya (contoh: nama / nama keluarga) dan membantu transisi.
Mereka juga sangat berguna untuk audit.
sumber
Jawaban ini berlaku khusus untuk SQL Server. (Meskipun mungkin juga berlaku untuk RDBMS lain saya tidak tahu. Saya lebih suka memberikannya sebagai jawaban di sini tapi itu ditutup sebagai penipu dari ini.)
Satu aspek yang tidak disebutkan dalam jawaban sejauh ini adalah keamanan. Karena, secara default, pemicu mengeksekusi di bawah konteks pengguna yang mengeksekusi pernyataan yang menyebabkan pemicu ini dapat menyebabkan ancaman keamanan kecuali semua pemicu ditinjau.
Contoh yang diberikan dalam BOL di bawah tajuk " Mengelola Keamanan Pemicu " adalah dari pengguna yang membuat pemicu yang berisi kode
GRANT CONTROL SERVER TO JohnDoe ;
untuk meningkatkan izin mereka sendiri.sumber
Jika ada efek samping, itu masalah desain. Dalam beberapa sistem basis data, tidak ada kemungkinan lain untuk menetapkan bidang peningkatan otomatis yaitu untuk bidang ID kunci utama.
sumber
Saya pikir mereka bisa jahat, tetapi hanya sama jahatnya dengan yang lain dalam perkembangan.
Meskipun saya tidak benar-benar memiliki banyak pengalaman dengan mereka, saya memiliki mereka pada proyek terbaru yang saya kerjakan yang telah membawa saya pada kesimpulan ini. Masalah yang saya miliki dengan mereka adalah mereka dapat menyebabkan logika bisnis berakhir di dua lokasi, perpustakaan kode dan database.
Saya melihatnya sebagai argumen yang mirip dengan menggunakan sprocs. Anda akan sering memiliki pengembang yang benar-benar pandai menulis logika bisnis SQL ke dalam database, sementara orang yang tidak akan memiliki logika bisnis mereka di tempat lain.
Jadi aturan saya adalah melihat apa struktur proyek Anda. Jika tampaknya layak untuk memiliki logika bisnis yang disimpan dalam database maka mungkin bermanfaat untuk memiliki pemicu.
sumber
Memang, cukup sering pemicu disalahgunakan. Sebenarnya dalam kebanyakan kasus Anda bahkan tidak membutuhkannya. Tetapi itu tidak membuat mereka selalu buruk.
Skenario yang muncul di benak saya di mana pemicu berguna adalah ketika Anda memiliki aplikasi lawas yang tidak memiliki kode sumbernya dan tidak ada cara untuk mengubahnya.
sumber
Gagasan pemicu bukanlah kejahatan, membatasi bersarangnya pemicu adalah kejahatan.
sumber