MySQLトリガーでエラーを投げる
あるテーブルの更新前に trigger
があった場合、そのテーブルの更新を阻止するために、どのようにエラーを投げることができますか?
166
3
あるテーブルの更新前に trigger
があった場合、そのテーブルの更新を阻止するために、どのようにエラーを投げることができますか?
MySQL 5.5 では、
SIGNAL
構文を使用して例外をスローすることができます。ステート 45000 は、"unhandled user-defined exception" を表す一般的なステートです。
以下は、より完全なアプローチの例です。
ここに一つのハックがあります。これはクリーンではありませんが、うまくいくかもしれません。
基本的に、あなたは存在しないカラムを更新しようとしています。
残念ながら、@RuiDC が提供した回答は、ストアドプロシージャに SIGNAL の実装がないため、5.5 より前の MySQL バージョンでは機能しません。
私が見つけた解決策は、
table_name doesn't exist
エラーを投げるシグナルをシミュレートし、カスタマイズされたエラーメッセージをtable_name
にプッシュすることでした。このハックは、トリガーやストアドプロシージャを使用して実装することができます。以下に、@RuiDC が使用した例に従って、両方のオプションについて説明します。
トリガーを使う
ストアドプロシージャを使う
ストアドプロシージャを使うと、動的SQLを使うことができ、エラー生成機能を1つのプロシージャにカプセル化することが可能になります。反面、アプリケーションのinsert/updateメソッドを制御し、ストアドプロシージャのみを使用するようにする(INSERT/UPDATEに直接特権を与えない)必要があります。