Оказывается, длина имени таблицы была причиной проблемы. Две версии сервера были из разных выпусков, при этом сервер был предыдущим выпуском (5.0 против 5.1).
Что касается появления ошибок в триггерах, я выбрал другой подход, однако он может быть ошибочным в зависимости от того, как MySQL обрабатывает оператор создания триггера. Если операторы триггера проверяются при создании, то это не удастся.
Как только возникает ошибка (ожидаемая ошибка), я устанавливаю переменную сеанса (имя переменной с префиксом @) с отображением сообщения об ошибке. Как только сообщение об ошибке установлено, я делаю вставку в несуществующую таблицу Die, чтобы вызвать ошибку в MySQL.
Затем приложение ловит ошибку базы данных и выполняет запрос к переменной сеанса ошибки. Основываясь на результате, я либо выбрасываю исключение с сообщением об ошибке, сообщением об ошибке базы данных, либо тихо сбою запроса, оставляя вызывающий код для обработки неудавшегося запроса.
MySQL Trigger:
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);
}
}