Man*_*kal 6 mysql mysql-5.5 amazon-rds
我在亚太(新加坡)地区的亚马逊 rds 上创建了一个中型实例。我已经用主密码创建了我的主用户。它在我本地 PC 上安装的工作台上工作/连接正常。当我要在该实例上创建函数时,它会显示以下错误
错误 1418:此函数的声明中没有 DETERMINISTIC、NO SQL 或 READS SQL DATA,并且启用了二进制日志记录(您可能希望使用不太安全的 log_bin_trust_function_creators 变量)
在我的实例中,我的变量 (log_bin_trust_function_creators) 显示为 OFF。现在,当我使用变量进行更改时
SET GLOBAL log_bin_trust_function_creators = 1;
Run Code Online (Sandbox Code Playgroud)
它给了我另一个错误
错误代码:1227。访问被拒绝;您需要(至少其中之一)此操作的 SUPER 权限
我不知道如何解决这个错误。
有人可以帮忙吗???
你可以尝试改变log_bin_trust_function_creators
;但是,当您考虑该变量的含义时,有一种替代方法似乎更合适:
它控制是否可以信任存储函数创建者不创建会导致不安全事件写入二进制日志的存储函数。
的设定
0
也强制执行的功能必须与被宣布为限制DETERMINISTIC
特性,或与READS SQL DATA
或NO SQL
特性。如果变量设置为1
,MySQL 不会对存储函数的创建实施这些限制。
该选项所做的只是假设您知道自己在做什么,而不是通过使用CREATE
语句中的三个特征之一来断言自己在做什么……但是如果您没有正确声明该函数,您可能会错过潜在的优化。
错误声明例程可能会影响结果或影响性能
总之,这意味着最正确的方法是使用DETERMINISTIC
或READS SQL DATA
或NO SQL
适当地声明您的存储函数,并且,如果这些不能正确描述您的函数的行为,那么您的函数仍然可能导致将不安全的语句写入二进制日志,因为这些选项也是“可信的”:
对例程性质的评估基于创建者的“诚实”:MySQL 不会检查声明的例程
DETERMINISTIC
是否没有产生不确定结果的语句。
除了好奇:精明的观察者会注意到我从文档的描述中省略了一些内容:
如果设置为 0(默认值),则不允许用户创建或更改存储的函数,除非他们拥有
SUPER
除CREATE ROUTINE
orALTER ROUTINE
权限之外的权限。
由于没有人进入SUPER
RDS,并且假设这不是官方文档中的错误,这似乎必须是 MySQL 行为的 AWS 自定义。