创建没有SUPER权限的存储函数和触发器

时间:2016-05-08 13:50:26

标签: mysql phpmyadmin

我要做的就是创建一些存储的函数和触发器,它们可以作用于某些表。我发现,对于其中任何一个,我得到MySQL错误#1419(You do not have the SUPER privilege and binary logging is enabled (you *might* want to use the less safe log_bin_trust_function_creators variable))。

Attempt with trigger我查看了user的{​​{1}}表,发现我的用户名为mysql,主机名为HeadAdmin。我尝试将DEFINER设置为%,但它不起作用。我回到HeadAdmin@%表,尝试以这种方式设置(存在user列),但它仍然无法正常工作(这实际上是一个错误)。

我不知道如何使用Super_priv变量,更不用说为什么它不太安全了。如何创建触发器和存储函数?

2 个答案:

答案 0 :(得分:4)

设置log_bin_trust_function_creators=1“不太安全”只是因为它相信创建存储程序的用户知道他们在做什么,而不是要求他们拥有SUPER权限(这也应该意味着他们知道他们在做什么。

这里的问题是,在复制环境中,复制服务器中的某些权限控制更加宽松,可能会让用户定义存储程序访问主服务器上不可用的权限提升机制。您现在可能没有复制环境,但每个MySQL服务器都是潜在的复制主机,因此解释仍然有效。

它是一个动态变量,因此可以在运行时启用它,但这需要登录用户具有SUPER权限。将log_bin_trust_function_creators=1添加到默认文件的[mysqld]部分,然后重新启动服务器守护程序以启用此功能。

有用的,有些相关的花絮:

如果SELECT @@BINLOG_FORMAT;返回STATEMENT,请将其更改为配置文件MIXED中的binlog_format=MIXEDSTATEMENT是一个旧的默认值,应该在很久以前就已经弃用,并且在使用存储的程序时可能会让您更加悲痛。 MIXED可以避免这些问题,因为MIXED可以正确记录不确定的语句。根据我的经验,另一种选择ROW甚至更好,但MIXED是默认值应该是什么。

定义存储的函数时,如果它确实是确定性的,请务必将其声明为DETERMINISIC,如果它使用表但不修改它们,请添加READS SQL DATA,如果函数仅执行内部计算但不使用表,则添加NO SQL。如果给定相同的输入,对于所有调用以及在单个查询的执行中的所有行,确定性函数将始终返回相同的输出。在某些情况下,如果服务器知道此确定性,您将获得性能优势。

如果您倾向于编写不确定的函数,请考虑使用过程。

答案 1 :(得分:1)

在思考了Michael-sqlbot的回答之后,我决定将1变量更改为{{1}}。直到现在,在查看谷歌,然后是AWS手册之后,我不知道如何。

根据one of their manuals,存在可以创建的参数组(该死的,AWS有很多东西)和RDS实例使用的东西。默认情况下会创建一个参数组,根据我的尝试,其中的参数不可编辑(包括我需要编辑的参数)。简而言之,我点击了RDS仪表板菜单中的参数组。然后,我单击Create Parameter Group按钮,然后继续创建它。完成后,我转到详细信息页面The icon to click 在参数中键入,单击“编辑参数”,然后为值选择1。

最后,当完成所有操作后,我将返回Instances(来自RDS仪表板),右键单击实例,单击“修改”,然后将实例选定的参数组更改为刚刚创建的参数组。我等待它生效,重启实例,等待全部清除。