Triggers 我可以在rds DB中创建触发器吗?
我试图在我的AmazonRDS数据库中的一个表上创建一个触发器,但我似乎无法实现它 我试图在我使用的mysql客户机(Navicat)中的表上创建触发器,但得到的错误是,我需要超级权限才能这样做。经过一些搜索,我发现您可以Triggers 我可以在rds DB中创建触发器吗?,triggers,amazon-rds,Triggers,Amazon Rds,我试图在我的AmazonRDS数据库中的一个表上创建一个触发器,但我似乎无法实现它 我试图在我使用的mysql客户机(Navicat)中的表上创建触发器,但得到的错误是,我需要超级权限才能这样做。经过一些搜索,我发现您可以设置全局日志\u bin\u trust\u function\u creators=1来解决这个问题。我试着使用以下说明:(然后重新启动DB服务器,以获得良好的效果),但没有成功 我还尝试通过mysql命令行创建触发器并设置变量,以确保Navicat没有向我的sql命令中添加
设置全局日志\u bin\u trust\u function\u creators=1
来解决这个问题。我试着使用以下说明:(然后重新启动DB服务器,以获得良好的效果),但没有成功
我还尝试通过mysql命令行创建触发器并设置变量,以确保Navicat没有向我的sql命令中添加任何不需要的内容,但也失败了。从搜索结果来看,似乎没有办法给自己超级特权
所以。。。在RDS中创建触发器可能吗?不,实际上并非不可能,只是需要太多额外的工作 首先,似乎不可能对默认参数组应用超级权限。 所以我要做的就是通过控制台或CLI创建一个新的DB参数组 我发现,关键是默认区域不是我试图使用的区域,因此我必须使用--region参数将其应用于部署DB实例的正确区域中的组 接下来,我必须创建一个使用该参数组的DB实例。(再次通过控制台或CLI) 然后我不得不修改参数组,以允许log_bin_trust_函数_创建者只能通过CLI完成
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
我遵循了上面的方法,但它对我不起作用。我花了将近一天的时间来弄清楚为什么它不起作用,现在我知道了原因。我列出了使它工作的步骤 使用aws web控制台创建了mysql参数组(确保它应该与默认参数组具有相同的族。之前,我创建了一个参数组,但它具有不同的族,因此无法工作。这是关键步骤 使用aws web控制台将
log\u bin\u trust\u function\u 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-
然后验证参数组是否与数据库实例关联
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)
感谢您提供完整的详细信息。很简单
打开RDS web控制台
打开“参数组”选项卡
创建一个新的参数组。在对话框中,选择与您的MySQL数据库版本兼容的MySQL系列,为其命名并确认
选择刚刚创建的参数组并发出“编辑参数”
查找参数“log\u bin\u trust\u function\u creators”,并将其值设置为“1”
保存更改
打开“实例”选项卡。展开MySQL实例并发出名为“修改”的“实例操作”
选择刚刚创建的参数组并启用“立即应用”
单击“继续”并确认更改
再次打开“实例”选项卡。展开MySQL实例并发出名为“修改”的“实例操作”
别忘了:打开“实例”选项卡。展开MySQL实例并发出名为“重新启动”的“实例操作”
Via-除了其他人已经提到的参数组修改之外,当使用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主用户名不同。一种解决方案是将定义者用户名替换为您的RDS主用户名。另一种解决方案是不使用mysqldump创建数据库
有关更多信息,请参阅此博客帖子:
编辑:事实证明,Multi-AZ for MySQL使用“物理复制”而不是逻辑复制,因此这可能不正确。至少他们的文档是这样说的:-我在他们的论坛上问过这意味着什么,但没有得到答复。奇怪的是,我的RDS Multi-AZ实例声称这是一个“复制设置中的主机”,即使我没有读取副本
由于问题已经解决,这不仅仅是一个答案,而是一个评论: 我很惊讶没有人考虑到为什么这个功能默认不可用。亚马逊不会为了让人们的生活更艰难而禁用它 在主/从复制中,使用修改数据的存储过程和触发器(如在“执行查询”而不是“选择”)可能很危险 在主/从设置中禁用此限制之前,请先阅读下面的内容,当您使用Multi-AZ时,Amazon RDS就是这样的设置(您至少应该在生产中使用)
AWS列出了如何在
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)
ERROR 1227 (42000) at line 875: Access denied; you need (at least one of) the SUPER privilege(s) for this operation
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 */ ;