モノノフ日記

普通の日記です

MySQL5でストアドファンクション

勉強がてらMySQL5をいじっていたのですがマニュアル通りに書かれているSQLを入力してもエラーが出てファンクションが作成されませんでした><

入力したSQL


mysql> CREATE FUNCTION hello (s CHAR(20)) RETURNS CHAR(50)
-> RETURN CONCAT('Hello, ',s,'!');

エラー出力



ERROR 1418 (HY000): This function has none of DETERMINISTIC, NO SQL,
or READS SQL DATA in its declaration and binary logging is enabled
(you *might* want to use the less safe log_bin_trust_function_creators variable)

MySQL5.0.16から導入されたオプションであるlog_bin_trust_function_creatorsが問題のようです。

このオプションはバイナリログが有効なときに適用され、ストアドファンクションを作成時に宣言を必要とするか
しないかを制御するものみたいです。

参考:MySQL AB :: MySQL 5.1 リファレンスマニュアル :: 12.4 ストアドルーチンとトリガのバイナリログ

log_bin_trust_function_creators = 0のときはストアドファンクションに対して下記3つのいずれかの特性を持つよう明示してやる必要があるみたい。



  • DETERMINISTIC

  • READS SQL DATA

  • NO SQL

最初に書いたSQLを設定を変えずに動かそうと思うならこんな感じ。


mysql> CREATE FUNCTION hello (s CHAR(20)) RETURNS CHAR(50)
-> DETERMINISTIC RETURN CONCAT('Hello, ',s,'!');

俺はメンドクサイからオプション変えました。。なんかセキュリティ的に問題あるんだろうか。