我正在尝试在我的Amazon RDS数据库中的表上创建触发器,而我似乎无法实现它。
我试图在我使用的mysql客户端(Navicat)中的表上创建一个触发器,并得到了我需要SUPER权限的错误。经过一番搜索,我发现你可以SET GLOBAL log_bin_trust_function_creators = 1
来解决这个问题。我尝试使用这些说明:http://getasysadmin.com/2011/06/amazon-rds-super-privileges/(然后重新启动数据库服务器以获得良好的衡量标准),但没有运气。
我还尝试通过mysql命令行创建触发器并设置变量,以确保Navicat没有向我的sql命令添加任何不需要的内容,但也失败了。从搜索中看,似乎没有办法给自己超级特权。
那么......是否可以在RDS中创建触发器?
答案 0 :(得分:106)
很容易!
打开RDS Web控制台。
打开“参数组”选项卡。
创建一个新的参数组。在对话框中,选择与MySQL数据库版本兼容的MySQL系列,为其命名并确认。
选择刚刚创建的参数组并发出“编辑参数”。
查找参数'log_bin_trust_function_creators'并将其值设置为'1'。
保存更改。
打开“实例”标签。展开您的MySQL实例并发出名为“Modify”的“Instance Action”。
选择刚刚创建的参数组并启用“立即应用”。
点击“继续”并确认更改。
再次打开“Instances”选项卡。展开您的MySQL实例并发出名为“Modify”的“Instance Action”。
别忘了:打开“Instances”标签。展开您的MySQL实例并发出名为“Reboot”的“Instance Action”。
通过 - http://techtavern.wordpress.com/2013/06/17/mysql-triggers-and-amazon-rds/
答案 1 :(得分:36)
不,它实际上并非不可能,只需要花费太多额外的工作。
首先,似乎无法将Super Privileges应用于默认参数组。 所以我要做的是通过控制台或CLI创建一个新的数据库参数组。
我发现的是,关键是默认区域不是我试图使用的区域所以我不得不使用--region参数将它应用到我所在的正确区域中的组部署我的数据库实例
rds-create-db-parameter-group --db-parameter-group-name allow-triggers --description'参数组允许触发' - 区域你的区域
接下来,我必须创建一个使用该参数组的数据库实例。 (再次通过控制台或CLI)
RDS-创建-DB-实例
然后我不得不修改参数组以允许只能通过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'
最后,我必须修改创建的数据库实例以允许触发器,也仅限CLI。
rds-modify-db-instance --db-instance-identifier your-db-instance-id --db-parameter-group-name allow-triggers --apply-immediately
答案 2 :(得分:15)
除了其他人已经提到的参数组修改之外,当使用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
这是因为转储包含“definer”条目,其用户名与您的RDS主用户名不同。一种解决方案是使用您的RDS主用户名替换定义者用户名。另一种解决方案是不使用mysqldump来创建数据库。
有关更多信息,请参阅此博客文章:
http://www.percona.com/blog/2014/07/02/using-mysql-triggers-and-views-in-amazon-rds/
答案 3 :(得分:6)
编辑:事实证明,MySQL的多可用区使用“物理复制”而非逻辑复制,因此这可能不正确。至少这是他们的文档所说的:https://aws.amazon.com/rds/details/multi-az/ - 我已经在他们的论坛上询问这意味着什么,但没有得到答复。奇怪的是,我的RDS多可用区实例声称它是“复制设置中的主人”,即使我没有只读副本。
由于问题已经解决,这不仅是一个答案:
我很惊讶没有人考虑为什么此功能默认不可用。亚马逊不会为了让人们的生活更加艰难而禁用它。
在主/从复制中,使用修改数据的存储过程和触发器会很危险(如执行 SELECT 以外的查询)。
在主/从设置中禁用此限制之前,请先阅读下面的内容,当您使用多可用区时,Amazon RDS就是这种限制(您至少应该为生产设置)。
http://dev.mysql.com/doc/refman/5.6/en/stored-programs-logging.html
答案 4 :(得分: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
您需要来自 - http://s3.amazonaws.com/rds-downloads/RDSCli.zip
的RDSCli然后验证参数组是否与您的数据库实例相关联
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/了解详情。
答案 5 :(得分:1)
AWS阐述了如何在triggers
中启用功能和this post有关创建数据库参数组的详细信息,请参阅使用数据库参数组 - Creating a DB Parameter Group.
log_bin_trust_function_creators = 1
选择保存更改。
重要
修改数据库参数组后,应至少等待5分钟,然后再创建使用该数据库参数组的第一个数据库实例。有关修改数据库参数组的信息,请参阅使用数据库参数组 - 修改数据库参数组中的参数。
答案 6 :(得分:1)
对我来说,它起了@ 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 */ ;
我希望这有助于某人遇到同样的问题。