2016-05-08 7 views
0

私がしようとしているのは、いくつかのテーブルで動作するストアドファンクションとトリガをいくつか作成することです。私はそれらのいずれかのために、私はMySQLのエラー#1419(You do not have the SUPER privilege and binary logging is enabled (you *might* want to use the less safe log_bin_trust_function_creators variable))を取得します。SUPER権限を持たないストアドファンクションとトリガの作成

Attempt with trigger私はmysqluserテーブルをチェックし、自分のユーザー名がHeadAdminで、私のホスト名が%であることがわかります。 DEFINERを[email protected]%に設定しようとしましたが、動作しません。 userテーブルに戻って、そのように設定してみてください(Super_privカラムが存在します)。それでも動作しません(文字通りエラーです)。

log_bin_trust_function_creators変数の使用方法はわかりません。なぜか安全性が低いです。トリガーとストアドファンクションを作成するにはどうしたらいいですか?それはむしろ、彼らは(また、彼らは、彼らが何をしているか知っていることを意味するものでなければならない)SUPER権限を保持することを要求するよりも、記憶されたプログラムを作成し、ユーザーが何をしているか知っていることを信頼するというだけの理由log_bin_trust_function_creators=1を設定

答えて

1

Michael-sqlbotの答えを熟考した後、私はそのlog_bin_trust_function_creators変数を1に変更することに決めました。これまでは、GoogleとAWSのマニュアルを見た後、私はどのように知りませんでした。

one of their manualsによれば、パラメータグループ(damn、AWSにはたくさんのものがあります)が存在し、RDSインスタンスが使用します。パラメータグループはデフォルトで作成され、私の試行では、その中のパラメータは編集できません(編集に必要なパラメータを含む)。要するに、RDS DashboardメニューからParameter Groupsをクリックしました。次に、[Create Parameter Group]ボタンをクリックして、それを作成しました。完了したら、パラメータの「詳細」ページThe icon to click に行き、「パラメータの編集」をクリックして値として1を選択します。

最後に、私はインスタンスに戻って(RDSダッシュボードから)インスタンスを右クリックし、変更を押してインスタンスの選択したパラメータグループを今作成したものに変更します。私はそれが有効になるのを待って、インスタンスを再起動して、すべてクリアを待っています。

2

は「あまり安全」です。

ここで問題となるのは、レプリカサーバーでいくつかの特権コントロールが緩和されているため、ユーザーがマスターサーバー上で利用できない特権エスカレーションのメカニズムへのストアドプログラムアクセスを定義する可能性があります。今はレプリケーション環境を持っていないかもしれませんが、すべてのMySQLサーバは潜在的なレプリケーションマスターであるため、説明はまだ有効です。

これは動的変数なので、実行時に有効にすることができますが、ログインしたユーザーにはSUPER特権が必要です。 log_bin_trust_function_creators=1をデフォルトファイルの[mysqld]セクションに追加し、サーバデーモンを再起動してこれを有効にします。


便利な、やや関連し、一口:

SELECT @@BINLOG_FORMAT;もし戻っSTATEMENTは、binlog_format=MIXED、configファイルでMIXEDにそれを変更します。 STATEMENTは古いデフォルト値です。これはずっと前に廃止されていたはずであり、ストアド・プログラムを使用しているときにもっと悲しみを引き起こす可能性があります。 MIXEDは、これらの問題を回避します。MIXEDは、確定的でないステートメントを正しくログに記録できるためです。他の代替手段、ROWは、私の経験ではさらに良いですが、MIXEDはデフォルト値であったはずです。

保存機能を定義する場合、それは確かに決定的である場合DETERMINISICとして、それを宣言し、それがテーブルを使用しますが、それらを変更、または関数が内部でのみ計算を行う場合NO SQLを追加したがdoesnのいない場合READS SQL DATAを追加してくださいテーブルを使用しないでください。確定的関数は、同じ入力が与えられた場合、すべての呼び出しに対して、単一の照会の実行中のすべての行にわたって常に同じ出力を戻します。サーバーがこの決定論を知っていれば、パフォーマンス上のメリットが得られる場合があります。

決定的でない関数を書く傾向がある場合は、代わりにプロシージャを使用することを検討してください。

+0

Amazon Linux EC2サーバで 'log_bin_trust_function_creators'を設定する方法について詳しく教えてください。私は、デフォルトのファイル、または[mysqld]、またはそのサーバ上で再起動する方法を見つける場所を知らない... –

+0

私はそれを考え出した。/*私は回答形式で投稿します*/ –

+0

非常に明確な説明。 このエラーの背後に詳細な理由が必要な人は、https://dev.mysql.com/doc/refman/5.7/en/stored-programs-logging.html –

関連する問題