テーブル名の長さが問題の原因であることがわかりました。2つのサーバーバージョンは異なるリリースのものであり、サーバーは以前のリリース(5.0と5.1)でした。
トリガーでエラーを発生させることに関しては、私は別のアプローチを取りましたが、MySQLがcreatetriggerステートメントを処理する方法によっては欠陥がある可能性があります。トリガーステートメントが作成時に検証された場合、これは失敗します。
エラーが発生したら(予期されるエラー)、表示するエラーメッセージを含むセッション変数(変数名の前に@を付ける)を設定しました。エラーメッセージが設定されたら、存在しないテーブルDieに挿入して、MySQLでエラーを発生させます。
次に、アプリケーションはデータベースエラーをキャッチし、エラーセッション変数に対してクエリを実行します。結果に基づいて、エラーメッセージ、データベースエラーメッセージを含む例外をスローするか、クエリを静かに失敗させ、失敗したクエリを処理するための呼び出し元のコードを残します。
MySQLトリガー:
CREATE TRIGGER Error_Trigger
BEFORE INSERT ON Fubar
FOR EACH ROW
BEGIN
if DataIsBad then
set @Err = 'The data is fubared.';
insert into Die values (1);
end if;
END$$
アプリケーション側のコード:
public function getDatabaseErrorMessage($AdminMessage = false){
if ($this->db->_error_number() != 0){
$AdminError = $this->db->_error_message();
$Query = $this->db->query("select @Err");
if ($Query){
$Error = $Query->row_array();
}
if (isset($Error["@Err"]) && $Error["@Err"] != ""){
$Error = $Error["@Err"];
$this->db->query("set @Err = ''");
} else {
if ($AdminMessage){
$Error = $AdminError;
} else {
return false;
}
}
throw new Exception($Error);
}
}