MySQL The user specified as a definer…does not exist问题

本人是在做hibernate开发时,执行某一条语句出现这个异常:

查了很多相似的问题,大部分都说是存储过程(Stored Procedure)或者视图(View)的权限问题,没有指定的definer用户。但本人的数据库中没有存储过程也没有视图,肯定不是这个问题了。

有人提到触发器(trigger)的definer问题,我这就只有触发器的问题了,要正常使用,就必须有definer指定的用户和权限,但是没有触发器权限的表,没法直接修改。

解决方法有几个:

一、用不会改变的用户创建触发器

触发器是在创建的时候与创建的用户绑定的。我们在远程管理数据库时用的用户可能会改ip或者更改用户名。如:你远程用remote@1.1.1.1这个用户创建触发器,创建好的触发器绑定了这个用户和地址,如果因为没有这个用户(修改了),调用时会出现错误。所以我们用应用使用的用户和对应的服务器ip来创建触发器就不会有此问题(只要不更改此用户数据)。

二、修改定义者(definer)

刚才不是说没有表保存definer吗?怎么修改?我在这篇博客里看到,其实触发器的定义是写在TRG文件里的。怎么找到这个文件?

在你的mysql的数据目录中(data,Window版本在安装时你填的那个数据路径,Linux版本应该在安装目录,本人暂时不知道能不能改)文件夹,在data文件夹里有你数据库的文件夹,打开它,里面就有TRG文件了,查看里面的内容,可以看到触发器的definer,修改即可。

后来发现MySQL Workbench工具中,可以编辑触发器的definer(在Alter Table窗口的triggers标签里可以修改),navicat没法修改。

三、创建触发器时指定用户

如:

 

发表评论