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

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

phpmianshi2个月前 (10-09)php93

背景


最近在做一个项目的数据库迁移,把数据库迁移倒腾讯云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面试资料网发布,如需转载请注明出处。
分享给朋友:

相关文章

lumen项目集成laravelS后sentry无法上报的问题

背景公司项目严重依赖lumen系列,代码众多,重构困难,虽然访问量变大,性能问题越来越严重,急需要提升性能,于是找到了这个项目laravelS github : https://github.com/...

PHP中 array_walk array_map array_filter区别

array_walk:array_walk — 使用用户自定义函数对数组中的每个元素做回调处理1. 用户自定义的函数处理每一个元素2. 直接修改原数组,不会创建新的数组3. 可以传递额外的参数更多信息...

PHP中命名空间概述

(PHP 5 >= 5.3.0, PHP 7)什么是命名空间?从广义上来说,命名空间是一种封装事物的方法。在很多地方都可以见到这种抽象概念。例如,在操作系统中目录用来将相关文件分组,对于目录中的...

PHP红包分配算法

<?php /**  * User: phpmianshi.com   * Date: 2020/3/31 &nbs...

结构体对齐

书里给了一段代码,假如有个结构体如下:struct test {    char a;    int b;    long c; ...

phpfpm中status状态说明详解

背景phpfpm跟nginx一样有个status状态监控页。可能通过status状态监控页了解phpfpm的运行状态,如并发数,总进程数等。启用php-fpm状态功能# vim /...

发表评论

访客

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