Apakah menggunakan pemicu untuk memperbarui tabel lain?

8

Saya memiliki Objecttabel yang diisi dari layanan Terpadu ( yang dapat saya ubah jika perlu ) dari database lain. Pada titik-titik tertentu kita perlu menambahkan posting secara manual di tabel lain ObjectObjectGroup (ObjectId, ObjectGroupId)yang diperlukan jika Object.ObjectTypememiliki nilai integer tertentu. Karena layanan integrasi tidak menangani pembaruan semacam itu, saya berpikir untuk menambahkan pemicu ke tabel Object yang dalam pseudo-code adalah sebagai berikut:

if Object.ObjectType = 10
    begin
        if Object.ObjectNumber like '<string pattern>'
        begin
            insert into ObjectObjectGroup values...
        end
    end

Apakah pengaturan ini bijaksana, atau apakah ada cara yang lebih baik dalam hal kinerja?

Benny Skogberg
sumber

Jawaban:

9

Sebagian besar Salin / Tempel tanggapan saya dari pertanyaan ini di stackoverflow

Pemicu bisa sangat memikat, ketika Anda pertama kali mulai menggunakannya, mereka tampak seperti peluru ajaib untuk semua jenis masalah. Tapi, mereka membuat hal-hal "ajaib" terjadi, jika Anda tidak tahu database luar dalam, itu bisa tampak seperti hal-hal aneh yang terjadi (seperti memasukkan ke dalam tabel lain, memasukkan input data, dll). Sebelum menerapkan hal-hal sebagai pemicu, saya akan mempertimbangkan dengan serius alih-alih menegakkan penggunaan API di sekitar skema (lebih disukai dalam database, tetapi di luar jika Anda tidak bisa).

Beberapa hal yang masih saya gunakan untuk memicu

  • Melacak bidang "date_created" dan "date_last_edited"
  • Memasukkan "ID" (di oracle, di mana tidak ada bidang id otomatis)
  • Menyimpan riwayat perubahan

Hal-hal yang Anda tidak ingin menggunakan pemicu

  • aturan / logika bisnis
  • apa pun yang menghubungkan di luar basis data (mis. panggilan layanan web)
  • Kontrol akses
  • Apa pun yang tidak transaksional (apa pun yang Anda lakukan dalam pelatuk HARUS dapat kembalikan dengan transaksi)
Matthew Watson
sumber
4

Ya itu bijaksana. Itulah tujuan pemicu sebenarnya, untuk melakukan tindakan yang diperlukan setelah operasi sisipkan / perbarui / hapus pada sebuah tabel.

Anda perlu mempertimbangkan fakta bahwa pemicu di MS SQL tidak akan menangani setiap baris secara terpisah, tetapi akan menangani semua baris transaksi saat ini sekaligus. Jadi jika suatu operasi akan memasukkan 10 baris sekaligus, Anda harus memikirkan kode pemicu Anda untuk memperlakukan semua baris sekaligus.

Marian
sumber
1
Selama layanan yang mengisi basis data tidak melakukan semua yang pria butuhkan dan selama ia tidak dapat mengubah layanan (itulah perasaan saya setelah deskripsi), dan pertanyaannya ada di sini di DBA.SE, bukan pada programmer , Saya akan mengatakan bahwa pemicu yang didokumentasikan dengan baik seharusnya tidak menjadi masalah. Dia mengatakan dia melakukan beberapa hal secara manual, jadi perubahan kode tidak bisa dilakukan dari apa yang saya pahami ..
Marian
1
Dalam hal ini mungkin merupakan satu-satunya pilihan, yang tidak membuatnya bijaksana. Hal yang bijaksana untuk dilakukan adalah mendorong kembali pengembang aplikasi dan membuat mereka memasukkan dengan benar ke dalam kedua tabel.
Matthew Watson
batuk . Saya melihat ke mana arahnya. Maaf karena tidak jelas dalam pertanyaan saya di atas. Saya memiliki kemungkinan untuk mengubah layanan integrasi, meskipun itu bukan "milik" saya. Dari apa yang bisa saya baca lebih baik mengubah layanan integrasi dan hanya menggunakan pemicu untuk layanan audit / catatan sejarah.
Benny Skogberg
3

Pemicu adalah alat yang ampuh, dan seperti alat lainnya, Anda harus berhati-hati saat menggunakannya.

  1. Ketika Anda membuat kesalahan dalam sebuah pemicu, hal-hal yang terjadi secara DRASTIS salah dan kecuali Anda menjalankan jejak, Anda tidak akan menyadari ...

  2. Mereka melakukan 'secara ajaib' mengubah / menyisipkan / menghapus data dimana pengguna DB (aplikasi saat ini / aplikasi masa depan / pengembang melakukan pembaruan satu kali) tidak menyadari / bermaksud.

Masalah besar adalah bahwa setelah Anda membuat pelatuk, tidak jelas bagi pengembang / pengguna lain bahwa pelatuk ada di sana dan apa fungsinya.

Yang mengatakan, mereka adalah alat yang hebat untuk menjaga integritas data Anda dan untuk Audit perubahan yang sebenarnya.

Anda perlu bertanya pada diri sendiri apakah logika yang ingin Anda masukkan pada pelatuk paling sesuai dengan aplikasi atau dalam DB, mempertimbangkan risiko di kedua sisi (apa yang terjadi jika aplikasi baru datang dan tidak menegakkan ini aturan?)

Andrew Bickerton
sumber