单表授权后,Navicat没有显示该表所在的数据库

【 TiDB 使用环境】生产环境
【 TiDB 版本】7.1.2
【复现路径】
grant select on db_1.test to ‘user’@‘%’;
【遇到的问题:问题现象及影响】
navicat中没有显示db_1数据库,但执行show databases有db_1,navicat是通过SELECT SCHEMA_NAME, DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME FROM information_schema.SCHEMATA,获取数据库信息,执行该SQL没有db_1的结果

这可能是由于 Navicat 在获取数据库信息时使用了 SELECT SCHEMA_NAME, DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME FROM information_schema.SCHEMATA 这个 SQL 查询语句,但该语句没有返回您授权的数据库 db_1

这是因为在 TiDB 中,授权操作只会影响到用户对表的权限,而不会改变数据库的元数据信息。因此,即使您对表 db_1.test 授予了 SELECT 权限,但数据库元数据中的信息仍然不包含 db_1

虽然 Navicat 在获取数据库信息时可能无法显示 db_1,但您仍然可以通过执行 SHOW DATABASES 命令来查看数据库列表,其中应该包含 db_1

如果您需要在 Navicat 中显示数据库 db_1,您可以尝试重新连接到 TiDB,或者在 Navicat 中执行 SHOW DATABASES 命令来刷新数据库列表。

2 个赞

表妹越来越专业了

我用dbeaver出现过这种情况,可以刷新一下链接或者重新链接就出来了。

1 个赞

navicat里面不行的,主要在于information_schema.SCHEMATA里面没有对应的值,mysql也不存在这种现象,我认为是个bug

刷新下或者重连

大概明白你的意思了,只给单表授权从SCHEMATA里是看不到该库信息的,在tidb里貌似有整库的权限才能看到SCHEMATA里的库名,刚测了下这点和mysql确实似乎不太一致,不知道是不是预期内的行为。

不显示schema,所以这条语句是授权查询权限不成功呗?

不是,授权成功了,查询数据和show databases都没问题,只是在information_schema.SCHEMATA看不到对应库名,应该是鉴权这里和mysql不太一样。

:thinking:那确实有可能是个bug了

1 个赞

这个要在naivcate里设置一下,手动加一下你授权的那个库,然后再刷新下就能看到你授权单张表的库

1 个赞

这个方法可行,目前我也是这样做的,但还是不方便

可以换dbeaver试试,我就是从navicat转到dbeaver的

1 个赞

dbeaver、datagrip都试试,navicate目前只能这么搞

sqlyog试一试