一次mysql 用户不存在的报错

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一次mysql 用户不存在的报错相关的知识,希望对你有一定的参考价值。

    前阵回收生产帐号的访问范围,即之前是[email protected]"%"的帐号命名方式,修改成若干个以前端应用部署的机器IP为准,修改成[email protected]"IP address"。尽量减少不可信客户端连接数据库的情况发生,加强数据安全。

    但是回收[email protected]"%"帐号后发现,生产一子系统一直报错,[email protected]"%"帐号不存在的异常。一开始通过检查生产代码的jdbc数据库连接串的配置,发现地址配置成服务器的主机名。怀疑是由于域名被错误解析成外网的IP地址导致,将其修改为内网的IP后重新发版本后仍然存在相同报错。

    后来经过排查后最终发现,由于该子系统还采用触发器,只不过之前写触发器的时候没有定义definer,导致该触发器的definer默认为当前的用户,即:[email protected]"%"。

    原来,mysql在删除用户的时候,只会影响到mysql系统库的user表、db表和tables_priv表,而该用户创建的触发器是不会被连带删除掉的,因为触发器的信息都保存在information.schema库的triggers表里面。所以,其他普通用户(没有管理员权限)想要调用其他用户的触发器的时候,就会报错。

    问题定位出来了,就容易解决了:

    1、删掉原先的[email protected]"%"的触发器,重新定义definer为[email protected]"IP address"的触发器

    2、普通帐号能调用触发器,需要配置多triggers的权限,要不会报trigger权限报错。

    总结一下:

    数据库之所以为数据库,就是其存储数据和检索数据的能力强大,虽然数据库也有触发器、自定义函数和存储过程这类functions,但是functions的执行是牺牲了数据库部分性能来实现的。而且也会导致前端应用同后端服务紧耦合,前端有变更,后续服务也要跟着变。所以,除非是一些特殊的场景如BI、数据分析等,一般生产环境都禁用trigger、functions和 stored procedure。将其功能实现在代码层面,减少数据库的负载。


    

    

本文出自 “厚积薄发” 博客,请务必保留此出处http://1057212.blog.51cto.com/1047212/1910433

以上是关于一次mysql 用户不存在的报错的主要内容,如果未能解决你的问题,请参考以下文章

node-gyp build 编译时sqlserver.vcproj不存在的报错是啥原因

记一次mysql表名不存在的bug

Android studio的MainActivity类文件报错不知道怎么弄得,哪位大佬帮帮忙?

ORACLE数据库以前创建的用户不存在?

python 的报错记录

宏定义不完整引起的奇怪报错