Triggers 我可以在rds DB中创建触发器吗?

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命令中添加

我试图在我的AmazonRDS数据库中的一个表上创建一个触发器,但我似乎无法实现它

我试图在我使用的mysql客户机(Navicat)中的表上创建触发器,但得到的错误是,我需要超级权限才能这样做。经过一些搜索,我发现您可以
设置全局日志\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列出了如何在

  • 为MySQL实例创建DB参数组: 登录AWS管理控制台并打开Amazon RDS。 在导航窗格中,选择“参数组”。 选择“创建参数组”。此时会显示“创建参数组”窗口。 对于参数组族,选择参数组族。 在“组名”中,键入新DB参数组的名称。 在“说明”中,键入新DB参数组的说明。 选择创建。 重要的 创建DB参数组后,应至少等待5分钟,然后再创建使用该DB参数组的第一个DB实例
  • 有关创建DB参数组的详细信息,请参见使用DB参数组-

  • 修改新创建的参数组并设置以下参数: 在航行中
    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 */ ;