web-dev-qa-db-ja.com

rds DBでTRIGGERを作成できますか?

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で可能なトリガーを作成していますか?

50
tedders

いいえ、実際には不可能ではありません。余分な作業が必要です。

まず、デフォルトのパラメーターグループにスーパー特権を適用することは不可能に思われます。そのため、コンソールまたは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
38
Garvice

それは簡単です!

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/

108
foxybagga

他の人がすでに言及しているパラメーターグループの変更に加えて、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/

16
Willie Wheeler

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

6
nickdnk

私にとっては、@ 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
cesaregb

上記に従いましたが、うまくいきませんでした。なぜ機能しないのかを理解するためにほぼ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/ に感謝します。

1
Deepti Kohli

AWSは、機能を有効にする方法と triggers in this post をレイアウトします

  1. MySQLインスタンスのDBパラメーターグループを作成します。AWSマネジメントコンソールにサインインし、Amazon RDS console を開きます。ナビゲーションペインで、[パラメータグループ]を選択します。 [パラメータグループの作成]を選択します。 [パラメータグループの作成]ウィンドウが表示されます。 [パラメータグループファミリ]で、パラメータグループファミリを選択します。 [グループ名]に、新しいDBパラメーターグループの名前を入力します。 [説明]に、新しいDBパラメーターグループの説明を入力します。作成を選択します。重要DBパラメーターグループを作成したら、少なくとも5分待ってから、そのDBパラメーターグループを使用する最初のDBインスタンスを作成する必要があります。

DBパラメーターグループの作成の詳細については、「DBパラメーターグループの操作- DBパラメーターグループの作成 」を参照してください。

  1. 新しく作成したパラメーターグループを変更し、次のパラメーターを設定します。ナビゲーションペインで、[パラメーターグループ]を選択します。使用可能なDBパラメーターグループがリストに表示されます。リストで、変更するパラメーターグループを選択します。 [パラメータの編集]を選択し、次のパラメータを指定された値に設定します:log_bin_trust_function_creators = 1 [変更を保存]を選択します。重要DBパラメーターグループを変更した後、そのDBパラメーターグループを使用する最初のDBインスタンスを作成する前に、少なくとも5分間待つ必要があります。

DBパラメーターグループの変更の詳細については、「DBパラメーターグループの操作-DBパラメーターグループのパラメーターの変更」を参照してください。

  1. RDS DBインスタンスを新規または変更されたDBパラメーターグループに関連付けます:ナビゲーションペインで、[インスタンス]を選択します。 DBパラメーターグループに関連付けるDBインスタンスを選択します。 [インスタンスアクション]メニューで、[変更]を選択します。 [DBインスタンスの変更]ダイアログボックスの[データベースオプション]で、DBインスタンスに関連付けるパラメーターグループを選択します。この設定を変更しても、停止することはありません。パラメータグループ名はすぐに変更されますが、実際のパラメータの変更は、フェールオーバーなしでインスタンスを再起動するまで適用されません。インスタンスを再起動して変更を適用します。
1
Loourr