私は、Amazon psific(singapore)リージョンのAmazon rdsに1つのメディアインスタンスを作成しました。マスターパスワードを使用してマスターユーザーを作成しました。そしてそれは私のローカルPCにインストールされたワークベンチで正常に動作/接続しています。そのインスタンスに関数を作成しようとすると、次のエラーが表示されます
エラー1418:この関数の宣言にはDETERMINISTIC、NO SQL、READS SQL DATAのいずれも含まれておらず、バイナリログが有効になっています(安全性の低いlog_bin_trust_function_creators変数を使用することをお勧めします)
私のインスタンスでは、変数(log_bin_trust_function_creators)がOFFを示しています。今私が変数を使用して変更に行くとき
SET GLOBAL log_bin_trust_function_creators = 1;
それは私に別のエラーを与えます
エラーコード:1227。アクセスが拒否されました。この操作には、(少なくとも1つの)SUPER特権が必要です。
このエラーを解決する方法がわかりません。
誰かが助けることはできますか?
log_bin_trust_function_creators
を変更してみてください。ただし、 その変数の意味 を検討すると、より適切と思われる代替アプローチがあります。
安全でないイベントがバイナリログに書き込まれる原因となるストアド関数を作成しないように、ストアド関数の作成者を信頼できるかどうかを制御します。
0
を設定すると、DETERMINISTIC
特性、またはREADS SQL DATA
またはNO SQL
特性を使用して関数を宣言する必要があるという制限も適用されます。変数が1
に設定されている場合、MySQLはストアドファンクションの作成にこれらの制限を適用しません。
そのオプションのすべては、CREATE
ステートメントで3つの特性の1つを使用して行うことを断言せずに、何をしているのかを理解していることを前提としています...しかし、関数を適切に宣言していない場合、潜在的な最適化を見逃す可能性があります。
ルーチンを誤って宣言すると、結果に影響したり、パフォーマンスに影響したりする可能性があります
まとめると、これは最も適切なアプローチは、必要に応じてDETERMINISTIC
またはREADS SQL DATA
またはNO SQL
を使用してストアド関数を宣言することであり、これらが関数の動作を正しく記述していない場合、 これらのオプション も「信頼されている」ため、関数は依然として安全でないステートメントをバイナリログに書き込む可能性があります。
ルーチンの性質の評価は、作成者の「誠実さ」に基づいています。MySQLは、
DETERMINISTIC
と宣言されたルーチンに非決定的な結果を生成するステートメントがないことを確認しません。
気になることはさておき:賢明な観察者は、私がドキュメントの説明から何かを省略したことに気付くでしょう:
0(デフォルト)に設定すると、ユーザーは
CREATE ROUTINE
またはALTER ROUTINE
特権に加えてSUPER
特権を持たない限り、ストアドファンクションの作成または変更が許可されません。
誰もRDSでSUPER
を取得せず、これが公式ドキュメントのエラーではないと想定しているため、これはMySQLの動作のAWSカスタマイズである必要があるようです。