在没有 SUPER 权限的情况下创建存储函数和触发器
Creating stored functions and triggers without SUPER privilege
我想要做的就是创建一些存储函数和触发器来作用于某些 tables。我发现,对于其中任何一个,我都会收到 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)
)。
我检查了 mysql
的 user
table,发现我的用户名是 HeadAdmin
,我的主机名是 %
.我尝试将 DEFINER 设置为 HeadAdmin@%
,但它不起作用。我回到 user
table,尝试这样设置(存在 Super_priv
列),但它仍然不起作用(这样做实际上是错误的)。
我不知道如何使用那个 log_bin_trust_function_creators
变量,更不用说 为什么 它不太安全。如何创建触发器和存储函数?
设置 log_bin_trust_function_creators=1
是 "less safe" 只是因为它相信创建存储程序的用户知道他们在做什么,而不是要求他们持有 SUPER
特权(这也应该暗示他们知道自己在做什么)。
这里的问题是,在复制环境中,一些权限控制在副本服务器中更加宽松,可能使定义存储程序的用户能够访问主服务器上不可用的权限升级机制服务器。您现在可能没有复制环境,但是每个 MySQL 服务器都是潜在的复制主服务器,因此解释仍然有效。
它是一个动态变量,因此可以在运行时启用,但这需要登录用户具有 SUPER
权限。将 log_bin_trust_function_creators=1
添加到默认文件的 [mysqld] 部分并重新启动服务器守护程序以启用它。
有用的,有点相关的花絮:
如果 SELECT @@BINLOG_FORMAT;
returns STATEMENT
,请在配置文件 binlog_format=MIXED
中将其更改为 MIXED
。 STATEMENT
是一个早该弃用的旧默认值,在使用存储程序时可能会给您带来更多麻烦。 MIXED
避免了这些问题,因为 MIXED
可以正确记录不确定的语句。根据我的经验,另一种选择 ROW
甚至更好,但 MIXED
应该是默认值。
定义存储的函数时,如果它确实是确定性的,请务必将其声明为DETERMINISIC
,如果它使用表但不使用表,请添加READS SQL DATA
' 修改它们,或者如果该函数仅进行内部计算而不使用表格,则添加 NO SQL
。如果给定相同的输入,确定性函数将始终 return 相同的输出,对于所有调用和单个查询执行中的所有行。在某些情况下,如果服务器知道这种确定性,您将获得性能优势。
如果您倾向于编写不确定的函数,请考虑改用过程。
思考 Michael-sqlbot 的回答后,我决定将 log_bin_trust_function_creators
变量更改为 1
。直到现在,在看了Google,然后是AWS手册之后,我不知道如何。
根据one of their manuals, there exists things called parameter groups (damn, AWS has a lot of stuff) which can be created, and RDS instances use. A parameter group is created by default, and from my attempt, the parameters in it are not editable (including the parameter I needed to edit). Long story short, I clicked on Parameter Groups from the RDS Dashboard menu. Then, I clicked the Create Parameter Group button, and then went through to creating it. Once that was finished, I went to Details page
键入参数,单击“编辑参数”,然后将 select 1 作为值。
最后,当一切都说完之后,我回到实例(从 RDS 仪表板),右键单击实例,点击修改,然后将实例的 selected 参数组更改为我刚刚创建。我等待它生效,重新启动实例,然后等待全部清除。
我想要做的就是创建一些存储函数和触发器来作用于某些 tables。我发现,对于其中任何一个,我都会收到 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)
)。
mysql
的 user
table,发现我的用户名是 HeadAdmin
,我的主机名是 %
.我尝试将 DEFINER 设置为 HeadAdmin@%
,但它不起作用。我回到 user
table,尝试这样设置(存在 Super_priv
列),但它仍然不起作用(这样做实际上是错误的)。
我不知道如何使用那个 log_bin_trust_function_creators
变量,更不用说 为什么 它不太安全。如何创建触发器和存储函数?
设置 log_bin_trust_function_creators=1
是 "less safe" 只是因为它相信创建存储程序的用户知道他们在做什么,而不是要求他们持有 SUPER
特权(这也应该暗示他们知道自己在做什么)。
这里的问题是,在复制环境中,一些权限控制在副本服务器中更加宽松,可能使定义存储程序的用户能够访问主服务器上不可用的权限升级机制服务器。您现在可能没有复制环境,但是每个 MySQL 服务器都是潜在的复制主服务器,因此解释仍然有效。
它是一个动态变量,因此可以在运行时启用,但这需要登录用户具有 SUPER
权限。将 log_bin_trust_function_creators=1
添加到默认文件的 [mysqld] 部分并重新启动服务器守护程序以启用它。
有用的,有点相关的花絮:
如果 SELECT @@BINLOG_FORMAT;
returns STATEMENT
,请在配置文件 binlog_format=MIXED
中将其更改为 MIXED
。 STATEMENT
是一个早该弃用的旧默认值,在使用存储程序时可能会给您带来更多麻烦。 MIXED
避免了这些问题,因为 MIXED
可以正确记录不确定的语句。根据我的经验,另一种选择 ROW
甚至更好,但 MIXED
应该是默认值。
定义存储的函数时,如果它确实是确定性的,请务必将其声明为DETERMINISIC
,如果它使用表但不使用表,请添加READS SQL DATA
' 修改它们,或者如果该函数仅进行内部计算而不使用表格,则添加 NO SQL
。如果给定相同的输入,确定性函数将始终 return 相同的输出,对于所有调用和单个查询执行中的所有行。在某些情况下,如果服务器知道这种确定性,您将获得性能优势。
如果您倾向于编写不确定的函数,请考虑改用过程。
思考 Michael-sqlbot 的回答后,我决定将 log_bin_trust_function_creators
变量更改为 1
。直到现在,在看了Google,然后是AWS手册之后,我不知道如何。
根据one of their manuals, there exists things called parameter groups (damn, AWS has a lot of stuff) which can be created, and RDS instances use. A parameter group is created by default, and from my attempt, the parameters in it are not editable (including the parameter I needed to edit). Long story short, I clicked on Parameter Groups from the RDS Dashboard menu. Then, I clicked the Create Parameter Group button, and then went through to creating it. Once that was finished, I went to Details page
最后,当一切都说完之后,我回到实例(从 RDS 仪表板),右键单击实例,点击修改,然后将实例的 selected 参数组更改为我刚刚创建。我等待它生效,重新启动实例,然后等待全部清除。