我可以在rds DB中创建TRIGGER吗?

时间:2012-01-19 01:19:42

标签: triggers amazon-rds

我正在尝试在我的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中创建触发器?

7 个答案:

答案 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
  1. 为您的MySQL实例创建一个数据库参数组: 登录AWS管理控制台并打开Amazon RDS console。 在导航窗格中,选择“参数组”。 选择“创建参数组”。将出现“创建参数组”窗口。 对于“参数组族”,选择参数组族。 对于“组名”,键入新数据库参数组的名称。 对于Description,键入新数据库参数组的说明。 选择创建。 重要 创建数据库参数组后,应至少等待5分钟,然后再创建使用该数据库参数组的第一个数据库实例。
  2. 有关创建数据库参数组的详细信息,请参阅使用数据库参数组 - Creating a DB Parameter Group.

    1. 修改新创建的参数组并设置以下参数: 在导航窗格中,选择“参数组”。可用的数据库参数组显示在列表中。 在列表中,选择要修改的参数组。 选择“编辑参数”并将以下参数设置为指定值: log_bin_trust_function_creators = 1 选择保存更改。 重要 修改数据库参数组后,应至少等待5分钟,然后再创建使用该数据库参数组的第一个数据库实例。
    2. 有关修改数据库参数组的信息,请参阅使用数据库参数组 - 修改数据库参数组中的参数。

      1. 将您的RDS数据库实例与新的或修改的数据库参数组相关联: 在导航窗格中,选择Instances。 选择要与数据库参数组关联的数据库实例。 在“实例操作”菜单上,选择“修改”。 在“修改数据库实例”对话框的“数据库选项”下,选择要与数据库实例关联的参数组。更改此设置不会导致中断。参数组名称会立即更改,但在没有故障转移的情况下重新引导实例之前,不会应用实际参数更改。 通过重新启动实例来应用更改。

答案 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 */ ;

我希望这有助于某人遇到同样的问题。