Amazon RDSデータベースのテーブルにトリガーを作成しようとしていますが、それを実現できないようです。
使用しているmysqlクライアント(Navicat)のテーブルにトリガーを作成しようとしましたが、そのためにはSUPER権限が必要であるというエラーが発生しました。いくつかの検索の後、私はあなたがSET GLOBAL log_bin_trust_function_creators = 1
これを回避します。 http://getasysadmin.com/2011/06/Amazon-rds-super-privileges/ (そして適切な方法でDBサーバーを再起動します)でも、運はありません。
また、Navicatがsqlコマンドに不要なものを追加していないことを確認するために、トリガーを作成し、mysqlコマンドラインを介して変数を設定しようとしましたが、失敗しました。また、検索の結果、自分自身にSUPER特権を付与する方法はないと思われます。
だから... RDSで可能なトリガーを作成していますか?
いいえ、実際には不可能ではありません。余分な作業が必要です。
まず、デフォルトのパラメーターグループにスーパー特権を適用することは不可能に思われます。そのため、コンソールまたはCLIを使用して新しいDBパラメーターグループを作成する必要がありました。
私が見つけたのは、デフォルトのリージョンが使用しようとしていたリージョンではなかったということです。そのため、-regionパラメーターを使用して、デプロイした正しいリージョンのグループに適用する必要がありましたDBインスタンス
rds-create-db-parameter-group --db-parameter-group-name allow-triggers --description 'parameter group to allow triggers' --region your-region
次に、そのパラメーターグループを使用するDBインスタンスを作成する必要がありました。 (コンソールまたはCLIから再度)
rds-create-db-instance
次に、CLIを介してのみlog_bin_trust_function_creatorsを実行できるようにパラメーターグループを変更する必要がありました
rds-modify-db-parameter-group --db-parameter-group-name yourgroupname --region yourRegion --parameters 'name=log_bin_trust_function_creators,value=true,method=immediate'
最後に、作成されたDBインスタンスを変更して、トリガーを許可する必要がありました。CLIのみです。
rds-modify-db-instance --db-instance-identifier your-db-instance-id --db-parameter-group-name allow-triggers --apply-immediately
それは簡単です!
RDS Webコンソールを開きます。
「パラメータグループ」タブを開きます。
新しいパラメーターグループを作成します。ダイアログで、MySQLデータベースバージョンと互換性のあるMySQLファミリを選択し、名前を付けて確認します。
作成したばかりのパラメーターグループを選択し、「パラメーターの編集」を発行します。
パラメーター「log_bin_trust_function_creators」を探し、その値を「1」に設定します。
変更を保存します。
「インスタンス」タブを開きます。 MySQLインスタンスを展開し、「変更」という名前の「インスタンスアクション」を発行します。
作成したばかりのパラメーターグループを選択し、「すぐに適用」を有効にします。
「続行」をクリックして、変更を確認します。
再度、「インスタンス」タブを開きます。 MySQLインスタンスを展開し、「変更」という名前の「インスタンスアクション」を発行します。
忘れないでください:「インスタンス」タブを開きます。 MySQLインスタンスを展開し、「再起動」という名前の「インスタンスアクション」を発行します。
経由- http://techtavern.wordpress.com/2013/06/17/mysql-triggers-and-Amazon-rds/
他の人がすでに言及しているパラメーターグループの変更に加えて、MySQLデータベースダンプを使用して(mysqldumpを介して)AWS RDSインスタンスでトリガーを作成するときに発生するさらなる課題があります。次のようなメッセージが表示される場合があります。
ERROR 1227 (42000) at line 875: Access denied; you need (at least one of) the SUPER privilege(s) for this operation
これは、ダンプにRDSマスターユーザー名とは異なるユーザー名を持つ「定義」エントリが含まれているために発生します。 1つの解決策は、定義者のユーザー名をRDSマスターのユーザー名に置き換えることです。別の解決策は、mysqldumpを使用してデータベースを作成しないことです。
詳細については、このブログ投稿を参照してください。
http://www.percona.com/blog/2014/07/02/using-mysql-triggers-and-views-in-Amazon-rds/
EDIT:MySQLのMulti-AZは論理複製ではなく「物理複製」を使用するため、これは正しくない可能性があります。少なくともそれは彼らのドキュメントが言っていることです: https://aws.Amazon.com/rds/details/multi-az/ -私は彼らのフォーラムでこれが何を意味するか尋ねましたが、返信がありませんでした。奇妙なのは、RDS Multi-AZインスタンスが、リードレプリカがなくても「レプリケーションセットアップのマスター」であると主張していることです。
質問はすでに対処されているため、これは答え以上のコメントです。
誰も考慮していないことに驚いていますなぜこの機能はデフォルトとして利用できません。アマゾンは、人々の生活をより困難にするためだけにそれを無効にしないだろう。
マスター/スレーブレプリケーションでは、データを変更するストアドプロシージャとトリガーを使用するのは危険です([〜#〜] select [〜#〜]以外のクエリを実行する場合)。
マスター/スレーブ設定でこの制限を無効にする前に、以下を読んでください。これは、マルチAZを使用するときにAmazon RDSで使用されます(少なくとも本番環境で使用する必要があります)。
http://dev.mysql.com/doc/refman/5.6/en/stored-programs-logging.html
私にとっては、@ foxybaggaの answer 提案として機能しましたが、生成されたsqlのダンプを(mysqlworkbenchから)更新して、CURRENT_USERをDEFINERにする必要がありました
すなわち:
DELIMITER ;;
/*!50003 CREATE*/ /*!50017 DEFINER=CURRENT_USER*/ /*!50003 TRIGGER `sod_db`.`date`
BEFORE INSERT ON `sod_db`.`CashOut`
FOR EACH ROW
BEGIN
SET NEW.created = NOW();
END */;;
DELIMITER ;
/*!50003 SET sql_mode = @saved_sql_mode */ ;
/*!50003 SET character_set_client = @saved_cs_client */ ;
/*!50003 SET character_set_results = @saved_cs_results */ ;
/*!50003 SET collation_connection = @saved_col_connection */ ;
これが誰かが同じ問題を抱えているのを助けることを願っています。
上記に従いましたが、うまくいきませんでした。なぜ機能しないのかを理解するためにほぼ1日を費やしましたが、今ではその理由がわかりました。私はそれを機能させるために従ったステップをリストしています。
Aws Webコンソールを使用してmysqlパラメーターグループを作成しました(既定のパラメーターグループと同じファミリーを持つ必要があります。以前、パラメーターグループを作成しましたが、異なるファミリーがあるため機能しませんでした。これは重要なステップです。
AWS Webコンソールを使用して、log_bin_trust_function_creators
の値を1
に変更します
新しいパラメーターグループを適用します。これは別の重要なステップです
rds-modify-db-instance –I $AWS_ACCESS_KEY –S $AWS_SECRET_KEY –region $EC2_REGION \ –db-instance-identifier $DB_INSTANCE \
–db-parameter-group-name $DB_GROUPNAME \
–apply-immediately
RDSCliが必要です- http://s3.amazonaws.com/rds-downloads/RDSCli.Zip
次に、パラメータグループがdbインスタンスに関連付けられているかどうかを確認します
rds-describe-db-instances \
–I $AWS_ACCESS_KEY \
–S $AWS_SECRET_KEY \
–region $EC2_REGION
そして、トリガーを作成する前に再起動します
rds-reboot-db-instance \
–I $AWS_ACCESS_KEY \
–S $AWS_SECRET_KEY \
–region $EC2_REGION \
–db-instance-identifier $DB_INSTANCE
上記のコマンドを試す前に、以下の環境変数を設定することを忘れないでください。
export AWS_ACCESS_KEY=’*****’
export AWS_SECRET_KEY=’*****’
export EC2_REGION=’region’
export AWS_RDS_BIN=”$AWS_RDS_HOME/bin”
export PATH=$PATH:$AWS_RDS_BIN
export Java_HOME=c:/jdk1.6_25 (in most cases this is already set)
詳細については http://blog.iprofs.nl/2013/03/20/rds-database-triggers-for-mysql/ に感謝します。
AWSは、機能を有効にする方法と triggers in this post をレイアウトします
DBパラメーターグループの作成の詳細については、「DBパラメーターグループの操作- DBパラメーターグループの作成 」を参照してください。
log_bin_trust_function_creators = 1
[変更を保存]を選択します。重要DBパラメーターグループを変更した後、そのDBパラメーターグループを使用する最初のDBインスタンスを作成する前に、少なくとも5分間待つ必要があります。DBパラメーターグループの変更の詳細については、「DBパラメーターグループの操作-DBパラメーターグループのパラメーターの変更」を参照してください。