当前位置:首页 > php > 正文内容

1449-The user specified as a definer ('db_user'@'%') does not exist

phpmianshi1周前 (10-09)php37

背景


最近在做一个项目的数据库迁移,把数据库迁移倒腾讯云mysql,所以需要将原有服务器的mysql数据库做一个迁移。于是在腾讯云后台做了DTS ,导入完成之后还是遇到了一些莫名其妙的问题。


登录的时候,报错:

1449-The user specified as a definer ('db_user'@'%') does not exist


我们项目换了新的数据库用户名字和密码,各个项目中的配置也都改成新的了,但是登录的时候,保存用户信息的地方报错,提示还用的老的数据库用户名,刚开始怀疑没改全,找了半天再三确认还是都改全了,于是仔细分析该错误提示,是提示 definer ,于是想到用户表中有触发器,于是查看触发器的 DEFINER 用户还是老的用户,于是删掉原有触发器,重新创建了一个,功能就正常了


其他存储过程或者函数也可能有类似的问题

存储过程、视图、函数等 设置的安全性为definer


【definer和invoker的解释】

   创建存储过程的时候可以指定 SQL SECURITY属性,设置为 DEFINER 或者INVOKER,用来告诉mysql在执行存储过程的时候,是以DEFINER用户的权限来执行,还是以调用者的权限来执行。

   默认情况下,使用DEFINER方式,此时调用存储过程的用户必须有存储过程的EXECUTE权限,并且DEFINER指定的用户必须是在mysql.user表中存在的用户。

   DEFINER模式下,默认DEFINER=CURRENT_USER,在存储过程执行时,mysql会检查DEFINER定义的用户'user_name'@'host_name'的权限;

   INVOKER模式下,在存储过程执行时,会检查存储过程调用者的权限。

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


解决方案如下

保持definer安全性


1)在navicat上进行修改,高级=>安全性

将定义者从test改为在该服务器存在的用户(一般每个服务器都有root@localhost)

2)通过sql语句修改

update mysql.proc set DEFINER='root@localhost' WHERE NAME='' AND db='mydb';

其中,mysql.proc是固定的,definer即要改为的用户名,name为存储过程名,db为数据库名

将安全性修改为invoker

1)在navicat上进行修改

2)通过sql语句进行修改

 ALTER PROCEDURE proc_name SQL SECURITY INVOKER 

mysql如何查看数据库中哪些表有触发器

假设数据库名为 test

SELECT DISTINCT EVENT_OBJECT_TABLE FROM information_schema.`TRIGGERS` WHERE EVENT_OBJECT_SCHEMA='test'


image.png

查看更详细的触发器明细

SELECT * FROM information_schema.`TRIGGERS`


版权声明:本文由PHP面试资料网发布,如需转载请注明出处。
分享给朋友:
返回列表

上一篇:openresty中的高级限制请求

没有最新的文章了...

相关文章

laravel中嵌套事务是如何实现的

关于mysql的事务嵌套关于mysql 的事务嵌套可以查看这个地址:https://dev.mysql.com/doc/refman/5.5/en/implicit-commit.html里面有这么一...

PHP内核分析之常见变量基本结构(六)

一、类型一览zval中的u1.v.type用来存储变量的类型,而zval.value存储的是不同类型对应的值,所以type决定value取值的地方,以下是PHP7所定义的所有类型。#define&nb...

php项目中从MYSQL更新到MYSQLI

背景因为MYSQL已被弃用,原有一些老的项目大量用到原生mysql_xxx相关的函数,不能预处理和参数绑定,很多拼接的sql有注入风险,如何升级到mysqli或pdo呢因为mysqli是mysql的增...

php闭包的优缺点

闭包函数:临时创建一个没有名称的函数,经常作为回调函数来用。通俗的说就是:子函数可以使用父函数中的局部变量,这种行为叫做闭包。我的理解是: 闭包就是能够读取其他函数内部变量的函数。匿名函数赋...

php5数组与php7数组区别

php5数组与php7数组区别

PHP5数组结构体typedef struct _hashtable {       uint n...

Fiddler抓包设置及常见问题

Fiddler抓包设置及常见问题

Fiddler简介官网:https://www.telerik.com/fiddlerFiddler是比较好用的web代理调试工具之一,它能记录并检查所有客户端与服务端的HTTP/HTTPS请求,能够...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。