我要做的就是创建一些存储的函数和触发器,它们可以作用于某些表。我发现,对于其中任何一个,我得到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)
)。
我查看了user
的{{1}}表,发现我的用户名为mysql
,主机名为HeadAdmin
。我尝试将DEFINER设置为%
,但它不起作用。我回到HeadAdmin@%
表,尝试以这种方式设置(存在user
列),但它仍然无法正常工作(这实际上是一个错误)。
我不知道如何使用Super_priv
变量,更不用说为什么它不太安全了。如何创建触发器和存储函数?
答案 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=MIXED
。 STATEMENT
是一个旧的默认值,应该在很久以前就已经弃用,并且在使用存储的程序时可能会让您更加悲痛。 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按钮,然后继续创建它。完成后,我转到详细信息页面 在参数中键入,单击“编辑参数”,然后为值选择1。
最后,当完成所有操作后,我将返回Instances(来自RDS仪表板),右键单击实例,单击“修改”,然后将实例选定的参数组更改为刚刚创建的参数组。我等待它生效,重启实例,等待全部清除。