MySQL 有意思的权限报错

前言

今天遇到了一个报错,觉得挺有意思的,在此记录下。

SELECT command denied to user ‘xxx’@‘xxx’ for table ‘xxx’

1. 报错原因

这里是研发提了一条修改视图的 SQL,说报权限问题,当时就觉得很定是 DEFINER 定义者和修改视图的账号不一样,且没有 super 权限。
就让他去找视图定义账号去手动执行下。

ALTER VIEW

此时研发表示不知道是谁创建的视图,我就帮他去看了下,发现视图的创建者和审核平台的用户名一样,那说明审核平台是有权限执行这条 SQL 的。然后查了下报错:

ERROR:SELECT command denied to user 'xxx'@'xxx' for table 'xxx'

没有这张表的权限,审核平台有整个库所有的权限呀,很奇怪,于是就去查看了下视图的 SQL,发现 db_name.table_name 视图里面有其他库的信息。而且这个库名,数据库中不存在。那这个报错就有点抽象,随后测试了下。

创建一个只读用户:

root@mysql 10:53:  [(none)]>grant select on op_service_db.* to test1@'%' identified by '123';

use 一个存在的库,但是用户没有权限:

test1@mysql 10:53:  [(none)]>use op_bak;
ERROR 1044 (42000): Access denied for user 'test1'@'%' to database 'op_bak'

use 一个不存在的库:

test1@mysql 10:53:  [(none)]>use owqdwqd;
ERROR 1044 (42000): Access denied for user 'test1'@'%' to database 'owqdwqd'

无论数据库是否存在,都报没有权限,挺抽象的,SQL 是研发从 test 环境直接复制的,没有改库信息。

后记

如果遇到此类报错,最好先根据报错内容,查看下 SQL 语句,多数情况下,答案就在 SQL 里面。还有就是要注意 MySQL 权限这里,即使不存在的库,在此类场景下,也报权限不足,除非你的账号拥有 super 权限。

你可能感兴趣的:(MySQL,mysql,数据库)