一次mysql 用户不存在的报错
admin
2023-05-26 15:01:10
0

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

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

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

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

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

    1、删掉原先的xxx@"%"的触发器,重新定义definer为xxx@"IP address"的触发器

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

    总结一下:

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


    

    

相关内容

热门资讯

布林肯又提“实力”但承认:一对... 【文/观察者网 熊超然】据央视新闻报道,5月15日下午,美国总统特朗普结束对中国的国事访问,乘专机离...
三星电子劳资谈判结束,工会决定... △三星电子(资料图)当地时间20日深夜,当天下午再度重启的三星电子劳资谈判结束。三星电子工会一方表示...
敦促乌克兰给白俄“松绑”,美国... 【文/观察者网 张菁娟】钾肥作为提升农作物产量的关键土壤养分,不仅关乎全球粮食安全,更成为当前大国地...
“AI+金融”的下一站:新场景... 记者 胡艳明 “人工智能落到金融领域,在经历过一段时间的探索之后,未来有哪些重点的方向?”2026年...
阿里发布新一代千问旗舰模型Qw... 撰稿 | 150 克 大模型进入高速迭代的第三年,行业关注的重点正在发生变化。 过去,外界衡量一家...
消息称DeepSeek组建Ha... IT之家 5 月 20 日消息,今天下午,“甲子光年”援引 DeepSeek 相关知情人士消息称,D...
机智局 | 京东将举行首场仿真... 深圳商报·读创客户端首席记者 袁静娴 近日,京东宣布,京东零售今年将助推机器人品牌累计销售破100亿...
2026年618大促,摄影性能... 618大促即将到来,不少朋友都想趁着优惠换一台新。如果你预算在一万左右,又特别看重拍照效果,那么兼具...
原创 罗... 导读:罗峰随混沌城主踏入宇宙海倾峰界外域人族基地时,有五位宇宙之主设宴相迎,他们是彭工之主、幽侯之主...