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

Mik*_*ren 5 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))。

尝试触发我检查了的usermysql,发现我的用户名是HeadAdmin,主机名是%。我尝试将DEFINER设置为HeadAdmin@%,但不起作用。我回到user表,尝试以这种方式设置它(Super_priv存在一个列),但它仍然不起作用(这样做确实是错误的)。

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

Mik*_*ren 9

在思考 Michael-sqlbot 的答案后,我决定将该log_bin_trust_function_creators变量更改为1. 直到现在,在查看了 Google 和 AWS 手册之后,我还不知道如何操作。

根据他们的一本手册,存在可以创建和 RDS 实例使用的称为参数组的东西(该死,AWS 有很多东西)。默认创建了一个参数组,根据我的尝试,其中的参数是不可编辑的(包括我需要编辑的参数)。长话短说,我从 RDS 仪表板菜单中单击了参数组。然后,我单击“创建参数组”按钮,然后继续创建它。完成后,我进入了详细信息页面要单击的图标 输入参数,单击“编辑参数”,然后选择值 1。

最后,当一切都说完并完成后,我返回“实例”(从 RDS 仪表板),右键单击该实例,点击“修改”,然后将实例的选定参数组更改为我刚刚创建的参数组。我等待其生效,重新启动实例,然后等待一切清除。


Mic*_*bot 5

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

这里的问题在于,在复制环境中,某些特权控制在副本服务器中更为宽松,从而可能使定义存储程序的用户可以访问主服务器上不可用的特权升级机制。您现在可能没有复制环境,但是每个MySQL Server都是潜在的复制主服务器,因此说明仍然有效。

它是一个动态变量,因此可以在运行时启用,但是要求已登录的用户具有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在函数仅进行内部计算但不使用表的情况下进行添加。如果给定相同的输入,对于单个查询执行中的所有调用以及所有行,确定性函数将始终返回相同的输出。在某些情况下,如果服务器知道这种确定性,则可以提高性能。

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