Jika saya memiliki trigger
before the update
tabel, bagaimana saya bisa melempar kesalahan yang mencegah pembaruan di meja itu?
174
Inilah satu retas yang mungkin berfungsi. Itu tidak bersih, tetapi sepertinya itu mungkin bekerja:
Pada dasarnya, Anda hanya mencoba memperbarui kolom yang tidak ada.
Pada MySQL 5.5, Anda dapat menggunakan
SIGNAL
sintaks untuk melemparkan pengecualian :Status 45000 adalah keadaan umum yang mewakili "pengecualian yang ditentukan pengguna yang tidak ditangani".
Ini adalah contoh pendekatan yang lebih lengkap:
sumber
Sayangnya, jawaban yang diberikan oleh @RuiDC tidak berfungsi di versi MySQL sebelum 5.5 karena tidak ada implementasi SIGNAL untuk prosedur tersimpan.
Solusi yang saya temukan adalah untuk mensimulasikan sinyal melempar
table_name doesn't exist
kesalahan, mendorong pesan kesalahan yang disesuaikan ke dalamtable_name
.Peretasan dapat diimplementasikan menggunakan pemicu atau menggunakan prosedur tersimpan. Saya menjelaskan kedua opsi di bawah ini dengan contoh yang digunakan oleh @RuiDC.
Menggunakan pemicu
Menggunakan prosedur tersimpan
Prosedur tersimpan memungkinkan Anda untuk menggunakan sql dinamis, yang memungkinkan enkapsulasi fungsi pembuatan kesalahan dalam satu prosedur. Tandingannya adalah bahwa kita harus mengontrol metode penyisipan / pembaruan aplikasi, sehingga mereka hanya menggunakan prosedur tersimpan kami (tidak memberikan hak akses langsung ke INSERT / UPDATE).
sumber
Prosedur berikut adalah (pada mysql5) cara untuk melempar kesalahan khusus, dan mencatatnya secara bersamaan:
sumber
sumber
Metode (peretasan) lain (jika Anda tidak menggunakan 5.5+ untuk beberapa alasan) yang dapat Anda gunakan:
Jika Anda memiliki bidang yang wajib diisi, maka di dalam pemicu setel bidang yang diperlukan ke nilai yang tidak valid seperti NULL. Ini akan berfungsi untuk INSERT dan UPDATE. Perhatikan bahwa jika NULL adalah nilai yang valid untuk bidang yang diperlukan (karena alasan gila) maka pendekatan ini tidak akan berfungsi.
Jika Anda menggunakan 5.5+ maka Anda dapat menggunakan status sinyal seperti yang dijelaskan dalam jawaban lain:
sumber
sumber