`

mysql 1418错误原因及解决

阅读更多
SET GLOBAL log_bin_trust_function_creators = 1;
DELIMITER //
CREATE DEFINER=`dbusr`@`%` FUNCTION `calculateMoney`(id VARCHAR(255), companyType VARCHAR(255)) RETURNS DOUBLE
BEGIN   
	DECLARE result DOUBLE DEFAULT 0; 	
	DECLARE c_borrow_money DOUBLE DEFAULT 0; 
	DECLARE c_back_money DOUBLE DEFAULT 0;
	
END

创建函数时,一直报错mysql 1418,结果是由于DEFINER参数值错误造成,当前用户非dbuser,
删除 DEFINER=`dbusr`@`%`后执行成功

参阅mysql如何修改所有的definer
引用

mysql中的definer是什么,有什么作用?

我们在mysql创建view、trigger、function、procedure、event时都会定义一个Definer=‘xxx’,类似如下:
复制代码

CREATE
    ALGORITHM = UNDEFINED
    DEFINER = `root`@`%`
    SQL SECURITY DEFINER
VIEW `v_ questions` AS
    SELECT
        `q`.`id` AS `id`,
        `q`.`title` AS `title`
    FROM
         Test q;
或者像这样的:

CREATE DEFINER=`root`@`%` PROCEDURE `user_count`()
  LANGUAGE SQL
  NOT DETERMINISTIC
  CONTAINS SQL
  SQL SECURITY DEFINER
  COMMENT ''
BEGIN
    select count(*) from mysql.user;
END

复制代码



加红的部分SQL SECURITY 其实后面有两个选项,一个为DEFINER,一个为INVOKER

SQL SECURITY { DEFINER | INVOKER } :指明谁有权限来执行。DEFINER 表示按定义者拥有的权限来执行

INVOKER 表示用调用者的权限来执行。默认情况下,系统指定为DEFINER



以存储过程为例:

(1)MySQL存储过程是通过指定SQL SECURITY子句指定执行存储过程的实际用户;

(2)如果SQL SECURITY子句指定为DEFINER,存储过程将使用存储过程的DEFINER执行存储过程,验证调用存储过程的用户是否具有存储过程的execute权限和DEFINER用户是否具有存储过程引用的相关对象的权限;

(3)如果SQL SECURITY子句指定为INVOKER,那么MySQL将使用当前调用存储过程的用户执行此过程,并验证用户是否具有存储过程的execute权限和存储过程引用的相关对象的权限;

(4)如果不显示的指定SQL SECURITY子句,MySQL默认将以DEFINER执行存储过程。





我们来看下面几个小例子。
复制代码

先授权一个:
grant all on testdb.* to 'user1'@'%' identified by '000000' with grant option;   
然后我们创建一个存储过程如下:
USE `testdb`;
DROP procedure IF EXISTS `user_count`;
DELIMITER $$
USE `testdb`$$
CREATE DEFINER=`root`@`%` PROCEDURE `user_count`()
  LANGUAGE SQL
  NOT DETERMINISTIC
  CONTAINS SQL
  SQL SECURITY INVOKER
  COMMENT ''
BEGIN
    select count(*) from mysql.user;
END$$
DELIMITER ;

复制代码





用root帐号登陆:
复制代码

mysql> use testdb;
Database changed
mysql> call user_count();

+----------+
| count(*) |
+----------+
|        3 |
+----------+
1 row in set (0.00 sec)

Query OK, 0 rows affected (0.00 sec)
可以正常查询出来。

我们再用user1进行登陆:

mysql> use testdb;
Database changed
mysql> call user_count();
ERROR 1142 (42000): SELECT command denied to user 'user1'@'localhost' for table 'user'

复制代码



发现系统报错查询不到了,这是因为我们在上述定义的SQL SECURITY值为INVOKER,存储过程执行过程中会以user1具有的权限来执行,其中调用到了mysql的库,而我们的user1帐户只有testdb库的使用权限,所以会返回失败。



我们把上面的invoker改为definer再来试一下:
复制代码

update mysql.proc set security_type='DEFINER' where db='testdb' and name='user_count';

再次用user1进行登陆:
mysql> use testdb;
Database changed
mysql> call user_count();
+----------+
| count(*) |
+----------+
|        3 |
+----------+
1 row in set (0.00 sec)
Query OK, 0 rows affected (0.00 sec)

复制代码





发现可以查询出来了,因为user1对存储过程user_count有执行的权限,虽然它依旧没有权限直接操作mysql库,由于我们定义的SQL SECURITY为DEFINER,所以在执行时是以root的身份执行的,所以可以正常查询出来。



如果方便修改mysql中所有已经定义到的definer?

由于前期在测试库上开发的缘故,我们经常定义到的definer为`root`@`%`,后来搬移到生产库上又得改回来,存在着大量的更新,上百个的视图,函数等一个个改不免太麻烦并且也可能遗漏。如下为总结出的方便修改所有definer的方法,可以直到查漏补缺的作用。

现在在mysql涉及的definer有view、trigger、function、procedure、event。我们一个个作介绍。

1.修改function、procedure的definer

select definer from mysql.proc;  -- 函数、存储过程

update mysql.proc set definer='user@localhost'; -- 如果有限定库或其它可以加上where条件



2.修改event的definer

select DEFINER from mysql.EVENT; -- 定时事件

update mysql.EVENT set definer=' user@localhost ';



3.修改view的definer

相比function的修改麻烦点:

select DEFINER from information_schema.VIEWS;

select concat("alter DEFINER=`user`@`localhost` SQL SECURITY DEFINER VIEW ",TABLE_SCHEMA,".",TABLE_NAME," as ",VIEW_DEFINITION,";") from information_schema.VIEWS where DEFINER<>'user@localhost';

查询出来的语句再执行一遍就好了。



4.修改trigger的definer

目前还没有具体方便的方法,可以借助工具端如HeidiSQL、sqlyog等来一个个修改。注意改前有必要锁表,因为如果改的过程中有其它表改变而触发,会造成数据不一致。

Flush tables with readlock

Unlock tables
分享到:
评论

相关推荐

    MySQL常见错误提示及解决方法

    MySQL 常见错误提示及解决方法 MySQL 是一个流行的开源关系数据库管理系统,但是在使用过程中,我们可能会遇到各种各样的错误提示。这些错误提示可能是由于数据库文件格式不正确、文件无法打开、创建表失败、数据库...

    Mysql常见错误提示及解决方法.pdf

    Mysql 常见错误提示及解决方法 本文档总结了 Mysql 中常见的错误提示及解决方法,涵盖了文件格式不正确、文件无法打开、创建表失败、数据库已存在、数据库不存在、删除数据库文件失败、读取系统表中的记录失败、...

    mysql的常见错误解决

    MySQL 的常见错误解决 MySQL 是一个广泛使用的关系数据库管理系统,但是在使用过程中经常会遇到各种错误,本文将介绍 MySQL 的常见错误解决方案。 一、在进入 MySQL 数据库时出错 在使用 MySQL 客户端连接数据库...

    MySQL 出现错误1418 的原因分析及解决方法

    MySQL错误1418是一个常见的问题,特别是在使用存储过程、函数、触发器等数据库对象时。这个错误的主要原因是由于MySQL的二进制日志功能,它用于实现主从复制,确保主服务器和从服务器的数据一致性。当二进制日志开启...

    MySQL常见错误及解决方案

    ### MySQL常见错误及解决方案 #### 问题1:使用MySQL CommandLine Client,出现闪一下然后窗口就消失的情况,如何解决? 在初次使用MySQL CommandLine Client时,可能会遇到一个常见的问题:客户端窗口短暂显示后...

    Mysql服务无法启动的1067错误解决

    ### MySQL服务无法启动的1067错误解决 在日常使用MySQL的过程中,用户可能会遇到一个常见问题:在尝试启动MySQL服务时出现“错误1067:进程意外中止”的提示。这一问题不仅困扰着初学者,对于有一定经验的开发者来...

    MySQL常见错误及解决方案.pdf

    MySQL 常见错误及解决方案 MySQL 是一个功能强大且广泛使用的关系型数据库管理系统,但是在使用 MySQL 时,用户经常会遇到一些错误和问题。以下是 MySQL 常见错误及解决方案: 1. 使用 MySQL Command Line Client...

    mysql常见错误提示及解决方法

    ### MySQL常见错误提示及其解决方法 #### 1....以上列举了MySQL中常见的错误代码及其可能的原因与解决办法。针对不同的错误代码,开发者需要采取适当的措施来解决问题,确保数据库系统的稳定运行。

    mysql常见错误提示及解决方法.pdf

    以下是一些常见的MySQL错误及其可能的解决方法: 1. 错误130:这通常意味着文件格式不正确。可能是因为尝试导入的数据文件与MySQL的期望格式不符。解决方案包括检查文件的格式,确保它是MySQL兼容的,例如CSV或SQL...

    MySql 1067错误解决方法

    ### MySql 1067错误解决方法 在日常使用MySQL数据库的过程中,我们经常会遇到各种各样的问题,其中“1067错误”是较为常见的一种系统级别的错误提示。本篇文章将详细阐述MySQL 1067错误的具体含义、常见的触发场景...

    MySQL常见错误分析与解决方法总结 .pdf

    MySQL 常见错误分析与解决方法总结 MySQL 是一个广泛使用的关系型数据库管理系统,它提供了强大的数据...这些错误都是 MySQL 使用中常见的问题,了解这些错误的原因和解决方法可以帮助我们更好地使用 MySQL 数据库。

    mysql连接错误解决

    ### MySQL连接错误解决 在安装MySQL之后,可能会遇到无法连接的问题,其中一种常见的错误提示是“Error 1045 Access denied for user 'root'@'localhost' (using password: YES)”。这个问题通常出现在尝试使用root...

    Mysql安装错误 解决方法

    此错误通常意味着你的本地机器无法与MySQL服务器建立连接,原因可能是个人防火墙阻止了必要的TCP端口3306,或者服务尚未启动。 #### 解决方案: 1. **检查防火墙设置**:确保你的个人防火墙已开放TCP端口3306。...

    查询mysql错误信息、及js错误信息

    本文将详细讲解如何查询MySQL错误信息以及JavaScript错误信息,并提供相关知识点。 首先,我们来了解一下如何查询MySQL错误信息。MySQL在执行SQL语句时,如果遇到语法错误、权限问题或逻辑错误等,会返回一个错误...

    Navicat连接Mysql报2059错误的原因以及解决方法.docx

    ### Navicat连接Mysql报2059错误的原因及解决方法 #### 一、问题背景 在使用Navicat工具连接MySQL数据库时,部分用户可能会遇到错误代码2059的问题,具体表现为:“authentication plugin 'caching_sha2_password'...

    Mysql安装错误代码对照

    ### MySQL安装错误代码详解 #### 1016 错误:文件无法打开 当遇到“文件无法打开”...以上是MySQL安装过程中可能遇到的一些常见错误及解决方法。通过合理地诊断和解决问题,可以有效地提高MySQL数据库的稳定性和性能。

Global site tag (gtag.js) - Google Analytics