Melempar kesalahan dalam MySQL trigger
Jika saya memiliki satu pemicu
sebelum update
di atas meja, bagaimana saya bisa melempar kesalahan yang mencegah pembaruan pada meja itu?
166
6
Jika saya memiliki satu pemicu
sebelum update
di atas meja, bagaimana saya bisa melempar kesalahan yang mencegah pembaruan pada meja itu?
Seperti MySQL 5.5, anda dapat menggunakan
SINYAL
sintaks untuk melemparkan pengecualian:Negara 45000 generik negara yang mewakili "tidak tertangani user-defined exception".
Di sini adalah yang lebih lengkap contoh dari pendekatan ini:
Di sini adalah salah satu hack yang dapat bekerja. Ini isn't bersih, tapi sepertinya hal itu mungkin bekerja:
Pada dasarnya, anda hanya mencoba untuk meng-update kolom yang doesn't ada.
Sayangnya, jawaban yang diberikan oleh @RuiDC tidak bekerja di versi MySQL sebelum 5.5 karena tidak ada pelaksanaan SINYAL untuk disimpan prosedur.
Solusi saya've ditemukan adalah untuk mensimulasikan sinyal melemparkan
table_name doesn't ada
kesalahan, mendorong disesuaikan pesan kesalahan ketable_name
.Hack dapat diimplementasikan dengan menggunakan pemicu atau menggunakan prosedur yang tersimpan. Saya menjelaskan kedua pilihan di bawah ini berikut contoh yang digunakan oleh @RuiDC.
Menggunakan# memicu
Menggunakan prosedur yang disimpan
Disimpan prosedur yang memungkinkan anda untuk menggunakan sql dinamis, yang memungkinkan enkapsulasi dari kesalahan generasi fungsi dalam satu prosedur. Tandingan adalah bahwa kita harus mengendalikan aplikasi insert/update metode, sehingga mereka menggunakan hanya disimpan prosedur (bukan pemberian langsung hak untuk INSERT/UPDATE).
Prosedur berikut (pada mysql5) cara untuk melemparkan kesalahan kustom , dan log mereka pada waktu yang sama:
Lain (hack) metode (jika anda tidak berada di 5.5+ untuk beberapa alasan) yang dapat anda gunakan:
Jika anda memiliki bidang yang diperlukan, maka hanya memicu mengatur bidang yang diperlukan untuk nilai yang tidak valid tersebut sebagai NULL. Ini akan bekerja baik untuk INSERT dan UPDATE. Perhatikan bahwa jika NULL adalah nilai yang valid untuk bidang yang diperlukan (untuk beberapa alasan gila) maka pendekatan ini tidak akan bekerja.
Jika anda berada di 5.5+ maka anda dapat menggunakan sinyal negara seperti yang dijelaskan dalam jawaban yang lain: