The user specified as a definer does not exist

2024-03-07 00:32
文章标签 specified user exist definer

本文主要是介绍The user specified as a definer does not exist,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

描述

mysql管理员给调用方创建了一个名为test的用户,并授权了指定host,效果如下:

mysql> select user,host from mysql.user where user = 'test';
+------+------------+
| user | host       |
+------+------------+
| test | 172.17.0.2 |
| test | 172.17.0.3 |
+------+------------+
2 rows in set (0.01 sec)

随后管理员创建了名为test_proc的存储过程,但调用方使用test用户调用存储过程时报如下错误:

mysql> call test_proc;
ERROR 1449 (HY000): The user specified as a definer ('test'@'%') does not exist

复现

先创建名为test的用户,并授权指定host(不要授权%的host权限),再给予限定的SQL执行权限。

-- drop user test@'%';
CREATE USER 'test'@'172.17.0.2' IDENTIFIED BY '123456';
CREATE USER 'test'@'172.17.0.3' IDENTIFIED BY '123456';
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, EXECUTE ON *.* TO 'test'@'172.17.0.2';
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, EXECUTE ON *.* TO 'test'@'172.17.0.3';

创建名为test_proc的存储过程,并通过definer指明该存储过程的调用者权限为test用户。

delimiter ;;
CREATE definer='test' PROCEDURE test_proc() 
BEGIN select 1;
END ;;
delimiter ;

查看名为test_proc的存储过程,发现当definerhost值缺省时默认使用的%host值。

mysql> select routine_name,definer from information_schema.routines where routine_name='test_proc';
+--------------+---------+
| ROUTINE_NAME | DEFINER |
+--------------+---------+
| test_proc    | test@%  |
+--------------+---------+
1 row in set (0.00 sec)

definer='test'等效于'test'@'%'

delimiter ;;
CREATE definer='test'@'%' PROCEDURE test_proc() 
BEGIN select 1;
END ;;
delimiter ;
mysql> select routine_name,definer from information_schema.routines where routine_name='test_proc';
+--------------+---------+
| ROUTINE_NAME | DEFINER |
+--------------+---------+
| test_proc    | test@%  |
+--------------+---------+
1 row in set (0.00 sec)

最后调用名为test_proc的存储过程,mysql返回异常The user specified as a definer ('test'@'%') does not exist

mysql> call test_proc;
ERROR 1449 (HY000): The user specified as a definer ('test'@'%') does not exist

解决

create-procedure.html

CREATE DEFINER = 'admin'@'localhost' PROCEDURE account_count()
BEGINSELECT 'Number of accounts:', COUNT(*) FROM mysql.user;
END;

The procedure is assigned a DEFINER account of ‘admin’@‘localhost’ no matter which user defines it. It executes with the privileges of that account no matter which user invokes it (because the default security characteristic is DEFINER). The procedure succeeds or fails depending on whether invoker has the EXECUTE privilege for it and ‘admin’@‘localhost’ has the SELECT privilege for the mysql.user table.

无论哪个用户执行存储过程,都将以该存储过程的definer定义的用户来执行。由于存储过程创建时definer错误,导致该存储过程指定了一个不存在的用户,因此只需要将该不存在的用户创建出来或者修改存储过程,使其重新指定到一个已存在且有权限的用户即可。

创建缺失用户

mysql> select routine_name,definer from information_schema.routines where routine_name='test_proc';
+--------------+---------+
| ROUTINE_NAME | DEFINER |
+--------------+---------+
| test_proc    | test@%  |
+--------------+---------+
1 row in set (0.00 sec)
CREATE USER 'test'@'%' IDENTIFIED BY '123456';
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, EXECUTE ON *.* TO 'test'@'%';
mysql> call test_proc;
+---+
| 1 |
+---+
| 1 |
+---+
1 row in set (0.00 sec)

修改DEFINER

为了修改definer,删除原先错误的存储过程,重新创建,并指定definer为当前用户。

mysql> select current_user();
+-----------------+
| current_user()  |
+-----------------+
| test@172.17.0.2 |
+-----------------+
1 row in set (0.00 sec)
drop procedure test_proc;
delimiter ;;
CREATE definer='test'@'172.17.0.2' PROCEDURE test_proc() 
BEGIN select 1;
END ;;
delimiter ;
mysql> select routine_name,definer from information_schema.routines where routine_name='test_proc';
+--------------+-----------------+
| ROUTINE_NAME | DEFINER         |
+--------------+-----------------+
| test_proc    | test@172.17.0.2 |
+--------------+-----------------+
1 row in set (0.01 sec)
mysql> call test_proc;
+---+
| 1 |
+---+
| 1 |
+---+
1 row in set (0.00 sec)

这篇关于The user specified as a definer does not exist的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/781871

相关文章

某城user_dun,js逆向分析

声明: 该文章为学习使用,严禁用于商业用途和非法用途,违者后果自负,由此产生的一切后果均与作者无关。 本文章未经许可禁止转载,禁止任何修改后二次传播,擅自使用本文讲解的技术而导致的任何意外,作者均不负责,若有侵权,请联系作者立即删除! 前言 这次会简单的讲解某城ly headers中参数userdun的逆向分析流程以及简单的补环境,如果有疑问可以在评论区交流讨论,我看到会及时回复的,另外,有

user is not in the sudoers file

出现这种情况是因为用户user没有sudo权限。解决办法自然是将当前用户添加到sudo成员中。  1.以root身份登录。 2.更改文件权限:  # chmod u+w /etc/sudoers  3.在/etc/sudoers文件中,root ALL=(ALL)ALL下方添加: user ALL=(ALL)ALL 保存退出。 4.还原文件权限:  # chmod u-w /etc

【深度分析】报错:com.sun.org.apache.regexp.internal does not exist

文章目录 问题分析思路这个类在哪里?本地能跑,Jenkins 上不能跑?JDK 把这个 package 删掉了?JDK 啥时候把 package 删掉了?翻阅 JDK8 Release Notes查阅 Jakarta-regexp查阅 bug 说明 解决参考 问题 项目本地 mvn clean install 打包都正常,但是到 jenkins 中打包就会报错。 报错信息

SIM(Search-based user interest modeling)

导读 我们对电商场景兴趣建模的理解愈发清晰:1. 通过预估目标item的信息对用户过去的行为做search提取和item相关的信息是一个很核心有效的技术。2. 更长的用户行为序列信息对CTR建模是非常有效且珍贵的。从用户的角度思考,我们也希望能关注用户长期的兴趣。但是当前的search方法无论是DIN和DIEN都不允许我们在线对一个超长的行为序列比如1000以上做有效搜索。所以我们的目标就比较明

Django学习(二)(重写User类)

一、重写User类: 1、首先导入User类: from django.contrib.auth.models import User 2、然后点在User上,按住ctrl 点进去,发现 User类继承AbstractUser Ctrl点进去AbstractUser,然后将此方法全部复制到自己APP的models.py里: 可以修改名字,导入 from django.cont

替代 Django 默认 User 模型并使用 `django-mysql` 添加数据库备注20240904

替代 Django 默认 User 模型并使用 django-mysql 添加数据库备注 前言 在 Django 项目开发中,默认的 User 模型虽然能够满足许多基础需求,但在实际项目中我们常常需要对用户模型进行定制化。通过覆盖默认的 User 模型,我们可以根据具体的业务需求添加额外的字段、修改字段属性等。同时,使用 django-mysql,我们还可以在数据库迁移时为字段添加备注,提高数

How to user “Discrete“ object in openai-gym environments?

题意:怎样在 OpenAI Gym 环境中使用 “Discrete” 对象 问题背景: I am trying to create a Q-Learning agent for a openai-gym "Blackjack-v0" environment. I am trying to get the size of the observation space but its in

user版本如何打开root权限之android8.1

1.修改ro.adb.secure和ro.secure属性 /code/1-android8.1/build/core$ git diffdiff --git a/core/main.mk b/core/main.mkindex 44ad271..947d7a3 100644--- a/core/main.mk+++ b/core/main.mk@@ -239,11 +239,11 @

一招解决 MySQL Access denied for user root@localhost

打开mysql.ini配置文件 找到[mysqld],在下面添加skip-grant-tables,如下图 然后重启MySQL服务 cmd 进入MySQL 的bin 目录下 输入命令:mysql -u root -p 出现Enter password 按下回车键 然后输入use mysql 然后输入:update user set authentication_string=

大数据-Hadoop-户管理界面:HUE(Hadoop User Experience)【将Hadoop中各种相关的软件(HDFS、Hive...)的操作界面融合在一起,形成一个统一的操作界面】

什么是HUE? hadoop的用户体验 HUE主要的作用将Hadoop中各种相关的软件的操作界面. 给融合在一起, 形成一个统一的操作界面HUE是一个大集成者 Hue 是一个Web应用,用来简化用户和Hadoop集群的交互。Hue技术架构,如下图所示,从总体上来讲,Hue应用采用的是B/S架构,该web应用的后台采用python编程语言别写的。大体上可以分为三层,分别是前端view层、Web服