mysql 1418错误原因及解决

使用mysql创建、调用存储过程,函数以及触发器的时候会有错误符号为1418错误。

ERROR 1418 (HY000): This function has none of DETERMINISTIC, NO SQL,or
READS SQL DATA in its declaration and binary logging is enabled(you
might want to use the less safe log_bin_trust_function_creators variable)

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

为了解决这个问题,MySQL强制要求:
在主服务器上,除非子程序被声明为确定性的或者不更改数据,否则创建或者替换子程序将被拒绝。这意味着当创建一个子程序的时候,必须要么声明它是确定性的,要么它不改变数据。

声明方式有两种:

第一种:声明是否是确定性的

DETERMINISTIC和NOT DETERMINISTIC指出一个子程序是否对给定的输入总是产生同样的结果。
如果没有给定任一特征,默认是NOT DETERMINISTIC,所以必须明确指定DETERMINISTIC来声明一个子程序是确定性的。
这里要说明的是:使用NOW() 函数(或它的同义)或者RAND() 函数不会使一个子程序变成非确定性的。对NOW()而言,二进制日志包括时间戳并会被正确的执行。RAND()只要在一个子程序内被调用一次也可以被正确的复制。所以,可以认为时间戳和随机数种子是子程序的确定性输入,它们在主服务器和从服务器上是一样的。

第二种:声明是否会改变数据

CONTAINS SQL, NO SQL, READS SQL DATA, MODIFIES SQL用来指出子程序是读还是写数据的。
无论NO SQL还是READS SQL DATA都指出,子程序没有改变数据,但是必须明确地指定其中一个,因为如果任何指定,默认的指定是CONTAINS SQL。
默认情况下,如果允许CREATE PROCEDURE 或CREATE FUNCTION 语句被接受,就必须明确地指定DETERMINISTIC 或 NO SQL与READS SQL DATA 中的一个,否则就会产生1418错误。

解决方法:

解决办法也有两种,

第一种

是在创建子程序(存储过程、函数、触发器)时,声明为DETERMINISTIC或NO SQL与READS SQL DATA中的一个,
例如:
CREATE DEFINER = CURRENT_USER PROCEDURE NewProc()
DETERMINISTIC
BEGIN
#Routine body goes here…
END;

第二种

是信任子程序的创建者,禁止创建、修改子程序时对SUPER权限的要求,设置log_bin_trust_routine_creators全局系统变量为1。

设置方法有三种:

1.在客户端上执行SET GLOBAL log_bin_trust_function_creators = 1;
2.MySQL启动时,加上–log-bin-trust-function-creators选贤,参数设置为1
3.在MySQL配置文件my.ini或my.cnf中的[mysqld]段上加log-bin-trust-function-creators=1

mysql 1418 错误原因及解决相关推荐

  1. mysql 1418错误_mysql 1418错误原因及解决

    摘自 http://blog.sina.com.cn/s/blog_6f68845001013k8a.html 具体错误: 使用mysql创建.调用存储过程,函数以及触发器的时候会有错误符号为1418 ...

  2. LunarPages空间500错误原因及解决办法

    我们在使用LunarPages空间时,有时在安装程序时可能经常出现500错误这一般是由于服务器内部出现的错误引起的,那么导致500错误原因有哪些呢?又该如何解决呢?下面来说说500错误常见原因及解决办 ...

  3. 10038 mysql,关于MySql 10038错误的完美解决方法(三种)

    第一种方法: 第一步: 先看报错窗口 2003 can't connect to MySQL server on '127.0.0.1'(10038). 第二步: 原因是:远程3306端口未对外开放操 ...

  4. mysql10038_关于MySql 10038错误的完美解决方法(三种)

    本文给大家带来三种有关mysql报10038错误的解决方法,每种方法都非常不错,需要的朋友参考下 第一种方法: 第一步: 先看报错窗口 2003 can't connect to MySQL serv ...

  5. mysql装不上怎么办_MySQL数据库之mysql安装不上怎么办 mysql安装失败原因和解决方法...

    本文主要向大家介绍MySQL数据库之mysql安装不上怎么办 mysql安装失败原因和解决方法了 ,通过具体的内容向大家展现,希望对大家学习MySQL数据库有所帮助. mysql数据库安装不了了!my ...

  6. “adb不是内部或外部命令,也不是可执行的应用程序”错误原因及解决方法

    用SQLite时,可能会出现这样的错误. 原因可能是环境变量PATH没有配置或配置不正确.应该把adb.exe 所在目录加入到PATH环境变量.例如:C:\Program Files\android- ...

  7. ASP.NET常见错误,原因及解决方法(2003版)_不断更新.....

    [标题]             ASP.NET常见错误,原因及解决方法[错误提示]    异常详细信息: System.Net.WebException: 请求因 HTTP 状态 401 失败:Un ...

  8. hibernate xxx is not mapped 错误原因及解决方法

    hibernate xxx is not mapped 错误原因及解决方法 参考文章: (1)hibernate xxx is not mapped 错误原因及解决方法 (2)https://www. ...

  9. 【翻译自mos文章】使用aum( Automatic Undo Management) 时遇到 ORA-01555错误--- 原因和解决方式。...

    [翻译自mos文章]使用aum( Automatic Undo Management) 时遇到 ORA-01555错误--- 原因和解决方式. 使用aum( Automatic Undo Manage ...

最新文章

  1. 真牛X!这款通用数据库连接工具DBeaver!可以连接和操作市面所有的数据库!...
  2. Makelife的使用
  3. 第14章 结构和其他数据形式 14.12 typedef 简介
  4. Kafka:Kafka核心概念
  5. Android中Spinner的使用
  6. elasticsearch7.9.2 安装配置
  7. ZOJ 3962:Seven Segment Display(思维)
  8. EcmaScript正則表達式( 深入淺出系列之淺出 )
  9. pentaho DI--- Tutorial (spoon)
  10. 2 数据源配置_论多数据源(读写分离)的实现方案
  11. css html 语法,CSS基础语法
  12. Scikit-learn:模型评估Model evaluation 之绘图
  13. 微信支付——微信H5支付实战教程(微信支付v3版本java)
  14. 2021年材料员-岗位技能(材料员)新版试题及材料员-岗位技能(材料员)考试试卷
  15. ThinkPad E430 蓝牙驱动 BCM43142A0
  16. UTM-wgs84投影坐标系
  17. OpenCV 利用高斯模糊实现简单的磨皮美颜效果
  18. JEPF项目初上手,一把辛酸泪
  19. 常见的USB接口种类以及区别
  20. 在RHEL6.0 X64系统中安装oracle 11g数据库及安装后设置

热门文章

  1. 三层交换解决了VLAN之间的通信问题
  2. IntelliJ IDEA 前端调试(Js Debug)
  3. 【AtCoder】ARC088
  4. windows下安装composer方法
  5. php in_array 和 str_replace
  6. 【转载】 了解实时媒体的播放(RTP/RTCP 和 RTSP)
  7. 基于时间片轮转程序分析进程调度
  8. VC++屏幕抓词的技术实现
  9. vs05b2中给dataset添加表间关系
  10. MySQL 怎么给字符串字段加索引?