我可以在RDS DB中创buildTRIGGER吗?

我试图在我的Amazon RDS数据库的表上创build一个触发器,我似乎无法做到这一点。

我试图在我使用的MySQL客户端(Navicat)的表中创build一个触发器,并得到了我需要的SUPER特权这样做的错误。 经过一番search,我发现你可以SET GLOBAL log_bin_trust_function_creators = 1来解决这个问题。 我尝试使用这些说明: http : //getasysadmin.com/2011/06/amazon-rds-super-privileges/ (然后重新启动数据库服务器的好措施),但没有运气。

我也尝试创build触发器,并通过mysql命令行设置variables,以确保Navicat没有添加任何不需要的东西到我的SQL命令,但也失败了。 从search中也可以看出,没有办法给予你自己的SUPER特权。

所以…在RDS中创造了一个可能的触发器?

不,这实际上不是不可能的,只是需要太多额外的工作。

首先,将超级权限应用于默认参数组似乎是不可能的。 所以我要做的是通过控制台或CLI创build一个新的数据库参数组。

我发现的是,关键是默认区域不是我正在尝试使用的区域,所以我不得不使用–region参数将其应用到我正在部署我的数据库实例的正确区域中的组

rds-create-db-parameter-group –db-parameter-group-name allow-triggers –description'parameter group to allow triggers'–region your-region

接下来,我不得不创build一个使用该参数组的数据库实例。 (再次通过控制台或CLI)

RDS-创build-DB实例

然后,我不得不修改参数组以允许log_bin_trust_function_creators只能通过CLI完成

rds-modify-db-parameter-group –db-parameter-group-name yourgroupname –region yourRegion –parameters'name = log_bin_trust_function_creators,value = true,method = immediate'

最后,我不得不修改创build的数据库实例来允许触发器,也只是CLI。

rds-modify-db-instance –db-instance-identifier your-db-instance-id –db-parameter-group-name allow-triggers –apply-immediately

这很容易!

打开RDS Web控制台。

打开“参数组”选项卡。

创build一个新的参数组。 在对话框中,select与您的MySQL数据库版本兼容的MySQL系列,给它一个名称并确认。

select刚创build的参数组并发出“编辑参数”。

查找参数“log_bin_trust_function_creators”并将其值设置为“1”。

保存更改。

打开“实例”选项卡。 展开您的MySQL实例并发出名为“修改”的“实例操作”。

select刚创build的参数组并启用“立即应用”。

点击“继续”并确认更改。

再次打开“实例”选项卡。 展开您的MySQL实例并发出名为“修改”的“实例操作”。

不要忘记:打开“实例”选项卡。 展开您的MySQL实例并发出名为“Reboot”的“实例操作”。

Via – http://techtavern.wordpress.com/2013/06/17/mysql-triggers-and-amazon-rds/

除了其他人已经提到的参数组修改之外,当使用MySQL数据库转储(通过mysqldump)在AWS RDS实例中创build触发器时,还有一个更大的挑战。 您可能会收到这样的消息:

 ERROR 1227 (42000) at line 875: Access denied; you need (at least one of) the SUPER privilege(s) for this operation 

发生这种情况是因为转储包含“定义者”条目,其用户名与您的RDS主用户名不同。 一个解决scheme是用您的RDS主用户名replace定义者用户名。 另一个解决scheme是不使用mysqldump来创build你的数据库。

看到这个博客文章了解更多信息:

http://www.percona.com/blog/2014/07/02/using-mysql-triggers-and-views-in-amazon-rds/

编辑:事实certificateMySQL的多可用区使用“物理复制”,而不是逻辑复制,所以这可能是不正确的。 至less这就是他们的文档所说的: https : //aws.amazon.com/rds/details/multi-az/ – 我在他们的论坛上询问这是什么意思,但没有得到答复。 奇怪的是,我的RDS多可用区实例声称它是“复制设置中的主”,尽pipe我没有只读副本。


由于这个问题已经得到解决,这不仅仅是一个答案:

我很惊讶没有人考虑为什么这个function不可用作为默认。 亚马逊不会为了让人们的生活变得更难而禁用它。

在主/从复制中,使用存储过程和修改数据的触发器(如执行SELECT以外的查询)可能会很危险。

请先阅读以下内容,然后在主/从设置中禁用此限制,这是Amazon RDS在使用多可用区时(至less在生产中应使用)。

http://dev.mysql.com/doc/refman/5.6/en/stored-programs-logging.html

我跟着上面,但它不适合我。 我花了将近一天的时间来弄清楚为什么它不工作,现在我知道为什么。 我列出了我遵循的步骤,使其工作。

使用aws web控制台创buildmysql参数组(确保它应该和默认的参数组具有相同的系列)早些时候,我创build了一个参数组,但它有不同的系列,所以它不工作,这是关键的一步。

使用aws web控制台将log_bin_trust_function_creatorslog_bin_trust_function_creators1

应用新的参数组。 这是另一个关键的步骤

 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

然后validation参数组是否与你的数据库实例相关联

 rds-describe-db-instances \ –I $AWS_ACCESS_KEY \ –S $AWS_SECRET_KEY \ –region $EC2_REGION 

然后重新启动,然后再尝试创build触发器

 rds-reboot-db-instance \ –I $AWS_ACCESS_KEY \ –S $AWS_SECRET_KEY \ –region $EC2_REGION \ –db-instance-identifier $DB_INSTANCE 

在尝试使用上述命令之前,请记住设置下面的环境variables

 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展示了如何在这篇文章中启用函数和触发器

  1. 为您的MySQL实例创build数据库参数组:loginAWSpipe理控制台并打开Amazon RDS 控制台 。 在导航窗格中,select“参数组”。 select创build参数组。 出现创build参数组窗口。 对于参数组系列,select参数组系列。 对于组名称,input新的数据库参数组的名称。 对于描述,为新的数据库参数组input描述。 select创build。 重要创build数据库参数组后,至less应等待5分钟,然后再创build使用该数据库参数组的第一个数据库实例。

有关创build数据库参数组的更多信息,请参阅使用数据库参数组 – 创build数据库参数组。

  1. 修改新build的参数组并设置以下参数:在导航栏中select“参数组”。 可用的数据库参数组显示在列表中。 在列表中,select要修改的参数组。 select编辑参数并将以下参数设置为指定值: log_bin_trust_function_creators = 1select保存更改。 重要:修改数据库参数组后,至less应等待5分钟,然后再创build使用该数据库参数组的第一个数据库实例。

有关修改数据库参数组的信息,请参阅使用数据库参数组 – 修改数据库参数组中的参数。

  1. 将您的RDS数据库实例与新的或修改的数据库参数组相关联:在导航窗格中,select“实例”。 select要与数据库参数组关联的数据库实例。 在“实例操作”菜单上,select“修改”。 在“修改数据库实例”对话框的“数据库选项”下,select要与数据库实例关联的参数组。 更改此设置不会导致停机。 参数组名称会立即更改,但实际的参数更改不会应用,直到您重新启动实例而不进行故障转移。 通过重新启动实例来应用更改。

对我来说,它工作@ foxybagga的答案build议,但我需要更新生成的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 */ ; 

我希望这可以帮助一个人有同样的问题。