MySQL创建function报ERROR 1418 (HY000)

MySQL创建function报ERROR 1418 (HY000)This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled

问题产生的原因:
因为CREATE PROCEDURE, CREATE FUNCTION, ALTER PROCEDURE,ALTER FUNCTION,CALL, DROP PROCEDURE, DROP FUNCTION等语句都会被写进二进制日志,然后在从服务器上执行。但是,一个执行更新的不确定子程序(存储过程、函数、触发器)是不可重复的,在从服务器上执行(相对与主服务器是重复执行)可能会造成恢复的数据与原始数据不同,从服务器不同于主服务器的情况。
解决方案:

方案一

参考链接:MySQL 错误1418 的原因分析及解决方法
在function中添加DETERMINISTIC, NO SQL, or READS SQL DATA中的一种,如下图所示:
在这里插入图片描述
结果又报了ERROR 1419 (HY000) : You do not have the SUPER privilege and binary logging is enabled错误
大致意思就是权限不够,但是我是使用的root登录的,崩溃!!!!!!!!!!!!!!!!

方案二

参考链接:This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA…
如果您不想看到这个警告,可以将 log_bin_trust_function_creators 变量设置为 1,这将允许您创建没有 DETERMINISTIC、NO SQL 或 READS SQL DATA 的函数,但这可能会降低 MySQL 的安全性。
在执行创建函数或者触发器之前执行:

set global log_bin_trust_function_creators = 1;

再次执行创建函数或触发器语句没报错!!!!!!!!

总结

方案二这条语句是临时生效的,重启数据库后将不再生效。需要在每次创建函数或触发器的时候执行一次本语句。
也有文章推荐直接在sql的配置文件设置global log_bin_trust_function_creators = 1,博主个人认为是不推荐的。因为这样会导致任何用户均可创建没有 DETERMINISTIC、NO SQL 或 READS SQL DATA 的函数,从而影响数据库的安全。

### 解决 MySQL 8 数据库脚本文件导入时出现的 ERROR 1418 错误 当尝试在 MySQL 8 中创建触发器或存储过程时,可能会遇到 `ERROR 1418 (HY000): This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled` 的错误提示。这是因为 MySQL 默认启用了二进制日志记录功能,并且对于某些操作有严格的安全性和一致性要求。 为了成功导入包含这些对象定义的SQL脚本并避免上述错误,可以采取以下措施: #### 方法一:临时禁用二进制日志 可以在会话级别关闭 binlog 功能来绕过此限制: ```sql SET sql_log_bin = OFF; -- 执行你的DDL语句或其他可能导致该问题的操作 SET sql_log_bin = ON; ``` 这种方法适用于不需要持久化更改的情况,因为它只影响当前客户端连接期间的行为[^1]。 #### 方法二:修改函数/触发器声明属性 如果确实需要保持binlog开启,则应该按照MySQL的要求给相应的程序体添加合适的特性描述符,比如指定其为DETERMINISTIC 或者指明它是否会读取或写入数据等。例如: ```sql CREATE DEFINER=`root`@`localhost` TRIGGER example_trigger BEFORE INSERT ON table_name FOR EACH ROW BEGIN -- 声明为确定性的(即相同的输入总是给出相同的结果) DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET @dummy = 0; END// DELIMITER ; ALTER FUNCTION|PROCEDURE procedure_name CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci COMMENT '...' LANGUAGE SQL NOT DETERMINISTIC MODIFIES SQL DATA SQL SECURITY INVOKER // ``` 通过这种方式可以使代码更符合标准的同时也解决了ERROR 1418的问题[^2]。 #### 防止命令行中显示密码的方法 为了避免直接暴露敏感信息如数据库用户名和密码,在执行命令时可以通过配置文件传递认证参数而不是硬编码于CLI指令之中。具体做法如下: - 创建一个名为`.my.cnf`的文件放置在家目录下; - 编辑其中的内容类似于下面这样: ```ini [client] host=localhost user=root password=your_password_here database=testdb ``` 记得给予适当权限保护这个私密文档(`chmod 600 ~/.my.cnf`)。之后就可以省去每次手动键入凭证的过程了,只需调用mysql工具而无需附加-u,-p选项即可完成登录验证流程[^3]。 另外还可以利用环境变量 MYSQL_PWD 来设定默认使用的口令字符串;不过出于安全性考虑通常建议优先选用前者方案[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值