设置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表.如果给定相同的输入,对于所有调用以及在单个查询的执行中的所有行,确定性函数将始终返回相同的输出.在某些情况下,如果服务器知道此确定性,您将获得性能优势.
如果您倾向于编写不确定的函数,请考虑使用过程.