转载:
最近在做一个项目,由于服务器切换,所以需要将原有服务器的mysql数据表以及存储过程导入到另一个服务器的mysql数据库中。导入完成之后以为一切是那么的简单,却没有想到总还是出现了一些莫名其妙的问题。
我在用程序调用存储过程时,总是提示错误:
1 The user specified as a definer ('test'@'%') does not exist 1449
查看了自己mysql的用户表后,发现确实没有test这个用户,但是我程序用的是root登录的,所以感觉有些莫名其妙。
后来通过查资料发现,是由于自己存储过程设置的安全性为definer,而当时的那个数据库存在test这个用户且用的test用户创建的存储过程。
所以解决方法主要有以下两种:
保持definer安全性
1)在navicat上进行修改
将定义者从test改为在该服务器存在的用户(一般每个服务器都有root@localhost)
2)通过sql语句修改
1 mysql>update mysql.proc set DEFINER='root@localhost' WHERE NAME='' AND db='mydb';
其中,mysql.proc是固定的,definer即要改为的用户名,name为存储过程名,db为数据库名
将安全性修改为invoker
1)在navicat上进行修改
2)通过sql语句进行修改
1 ALTER PROCEDURE proc_name SQL SECURITY INVOKER
2 ALTER PROCEDURE proc_name SQL SECURITY DEFINE
补充:对于Linux,mysql等工具,操作都需要用户权限,之所以在大多数操作时,没有出现问题是因为默认是root用户,root用户具有最高权限可以操作。
但当操作某些专有的东西功能时,需要登录对应的用户信息才可以操作。