Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Mysql The user specified as a definer ('test'@'%') does not exist

Mysql The user specified as a definer ('test'@'%') does not exist

作者头像
二十三年蝉
发布于 2020-04-10 07:17:58
发布于 2020-04-10 07:17:58
2.2K00
代码可运行
举报
文章被收录于专栏:闻道于事闻道于事
运行总次数:0
代码可运行

某开源项目建表语句报错:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
The user specified as a definer ('dlwy'@'%') does not exist

mysql中的definer问题

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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执行存储过程。

我们来看下面几个小例子。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
先授权一个:
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帐号登陆:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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再来试一下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-04-09 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
记录一下今天的MySQL故障
今天遇到一个问题,早上对MySQL进行限制IP访问的操作,限制其只能通过 192.168.137.% 这个网段进行访问。没想到马上就出问题了,加拿大网站购卡提交不了订单了。后来查证下来发现日志里,有数据库的报错。
Li_XiaoJin
2022/06/10
7380
记录一下今天的MySQL故障
故障分析 | 更新用户信息导致 MySQL 从库复制异常
作者:官永强,爱可生 DBA 团队成员,擅长 MySQL 运维方面的技能。热爱学习新知识,亦是个爱打游戏的宅男。
爱可生开源社区
2024/12/24
1490
故障分析 | 更新用户信息导致 MySQL 从库复制异常
更改用户host留下的坑
我们在创建数据库用户的时候都会指定host,即一个完整的用户可描述为 'username'@'host' 。创建用户时不显式指定host则默认为%,%代表所有ip段都可以使用这个用户,我们也可以指定host为某个ip或ip段,这样会仅允许在指定的ip主机使用该数据库用户。不过你也应该明白 'username'@'%' 和 'username'@'192.168.6.%' 是两个毫无关联的用户,这两个用户可以有不同的密码和权限,这里不建议创建多个同名不同host的用户,还有不要轻易更改用户的host,笔者曾经遇到过因为更改用户host引发的故障,下面将其分享出来,为你讲述前因后果。
MySQL技术
2019/11/28
1.1K0
创建视图与函数,你注意过 DEFINER 是啥意思吗
在 MySQL 数据库中,在创建视图及函数的时候,你有注意过 definer 选项吗?在迁移视图或函数后是否有过报错情况,这些其实都可能和 definer 有关系。本篇文章主要介绍下 MySQL 中 definer 的含义及作用。
MySQL技术
2021/08/24
2.7K0
mysql迁移存储过程函数视图存在的问题
SQL SECURITY DEFINER : 调用阶段根据调用者的权限进行判断是否可以调用,执行阶段根据DEFINER的账户权限判断操作是否可以继续执行。
wangwei-dba
2021/08/04
1.7K0
Server层表级别对象字典表 | 全方位认识 information_schema
在上一篇《Server层统计信息字典表 | 全方位认识 information_schema》中,我们详细介绍了information_schema系统库的列、约束等统计信息字典表,本期我们将为大家带来系列第三篇《Server层表级别对象字典表 | 全方位认识information_schema》。
老叶茶馆
2020/11/26
1.2K0
故障分析 | MySQL5.7 使用 mysqldump 重要闭坑事项
爱可生 DBA 团队成员,负责公司 DMP 产品的运维和客户 MySQL 问题的处理。擅长数据库故障处理。对数据库技术和 python 有着浓厚的兴趣。
jeanron100
2020/11/17
1.1K0
MySQL存储过程的权限问题
MySQL的存储过程,没错,看起来好生僻的使用场景。问题源于一个开发同学提交了权限申请的工单,需要开通一些权限。
jeanron100
2018/07/26
1.7K0
MySQL存储过程的权限问题
用于修改配置的存储过程 | 全方位认识 sys 系统库
在本系列中前面用了大量篇幅介绍完了 sys 系统库的视图,利用这些视图我们可以方便快捷地查询到performance_schema、information_schema下的内容,但对于performance_schema下的instrument和consumer配置信息属于需要修改的内容,除了直接使用update语句修改配置表之外,是不是也有类似查询视图一样的快捷方式呢?有的,本期的内容开始给大家介绍一些修改、确认配置相关的存储过程。
沃趣科技
2018/10/11
1.8K0
用于修改配置的存储过程 | 全方位认识 sys 系统库
Mysql概念--视图
视图(view)是一种虚拟存在的表,是一个逻辑表,本身并不包含数据。作为一个select语句保存在数据字典中的。通过视图,可以展现基表的部分数据;视图数据来自定义视图的查询中使用的表,使用视图动态生成。
用户1348170
2021/07/14
4.4K0
mysql权限控制
mysql权限控制 作为一名DBA,想必大家对MySQL中的权限都不陌生,MySQL中对于权限的控制分为三个层面:
AsiaYe
2019/11/06
3K0
【详解】mysql1449:Theuserspecifiedasadefiner('root'@'%')doesnotexist解决
在使用 MySQL 数据库时,有时会遇到错误 ​​1449: The user specified as a definer ('root'@'%') does not exist​​。这个错误通常出现在尝试访问视图、存储过程或触发器等数据库对象时,这些对象的定义者(definer)是一个不存在的用户。本文将详细介绍这个错误的原因以及如何解决它。
大盘鸡拌面
2025/05/18
1410
听说Mysql你很豪横?-------------分分钟带你玩转SQL高级查询语句(库函数,存储过程)
MySQL 数据库函数提供了能够实现各种功能的方法,使我们在查询记录时能够更高效的输出。MySQL 内建了很多函数,常用的包括数学函数、聚合函数、字符串函数和日期时间函数。
不吃小白菜
2020/09/03
2.6K0
听说Mysql你很豪横?-------------分分钟带你玩转SQL高级查询语句(库函数,存储过程)
MySQL数据库,详解存储过程使用(二)
CREATE PROCEDURE proc2(id int,age int,in name varchar(16))
用户1289394
2021/11/16
1.3K0
MySQL 存储过程
存储过程(Stored Procedure)是一种存储在数据库中的程序,可供外部程序调用的一种数据库对象。
恋喵大鲤鱼
2023/10/12
9500
MySQL 存储过程
mysql安全权限的讲解
MySQL 默认有个root用户,但是这个用户权限太大,一般只在管理数据库时候才用。如果在项目中要连接 MySQL 数据库,则建议新建一个权限较小的用户来连接。
张哥编程
2024/12/19
1370
MySQL 存储函数
MySQL 存储函数(Stored Function)和存储过程类似,也是存储在数据库中的程序,但它会返回一个计算结果。
恋喵大鲤鱼
2023/10/12
6470
MySQL存储过程与函数精讲
MySQL从5.0版本开始支持存储过程和函数。存储过程和函数能够将复杂的SQL逻辑封装在一起,应用程序无须关注存储过程和函数内部复杂的SQL逻辑,而只需要简单地调用存储过程和函数即可。
小熊学Java
2023/07/16
6510
MySQL存储过程与函数精讲
Mysql中的自定义函数和自定义过程
转载自 http://www.cnblogs.com/lyhabc/p/3793524.html
allsmallpig
2021/02/25
4.7K0
MySQL数据库,从入门到精通:第十五篇——MySQL存储过程和函数详解
存储过程和函数是MySQL数据库中常用的数据处理工具,它们可以帮助用户完成一些复杂的数据操作或业务逻辑处理,提高数据库系统的效率和性能。本文将深入剖析MySQL中存储过程和函数的使用方法,包括创建、调用、修改、删除等操作,并探讨存储过程和函数的优缺点和使用场景,帮助读者更好地掌握MySQL中存储过程和函数的使用方法和技巧。
默 语
2024/11/20
5500
相关推荐
记录一下今天的MySQL故障
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验