You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL/MariaDB授权语句大小写丢失致SHOW TABLES异常求解决方案

MySQL/MariaDB 大小写表名授权后SHOW TABLES异常问题

问题场景(MySQL 5.7)

需要为用户授予特定表的SELECT、SHOW VIEW权限,执行以下语句:

GRANT SELECT, SHOW VIEW ON `db`.`Table1` TO 'altium'@'%'
GRANT SELECT, SHOW VIEW ON `db`.`Table2` TO 'altium'@'%'

执行SHOW GRANTS for altium后,结果中的表名被转换为小写:

GRANT SELECT, SHOW VIEW ON `db`.`table1` TO 'altium'@'%'
GRANT SELECT, SHOW VIEW ON `db`.`table2` TO 'altium'@'%'

由此引发异常:

  • 用户可正常执行SELECT * FROM Table1
  • 执行SHOW TABLES;返回空集(MySQL Workbench等工具也无法显示表)

验证发现:若表本身为小写,SHOW TABLES可正常显示。当前无法升级MySQL,寻求可行解决办法。

问题复现(MariaDB 10.6.5,Windows环境,lower_case_table_names=2)

执行以下步骤复现问题:

CREATE TABLE `atable` (
  `idatable` int(11) NOT NULL,
  PRIMARY KEY (`idatable`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3

CREATE TABLE `Btable` (
  `idBtable` int(11) NOT NULL,
  PRIMARY KEY (`idBtable`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3

CREATE USER 'tester'@'%' IDENTIFIED BY 'password';

GRANT SELECT, SHOW VIEW ON `db`.`atable` TO 'tester'@'%' with grant option;
GRANT SELECT, SHOW VIEW ON `db`.`Btable` TO 'tester'@'%' with grant option;

SHOW GRANTS FOR tester;

SHOW GRANTS返回结果中表名变为小写:

+-----------------------------------------------------------------------------+
|GRANT SELECT, SHOW VIEW ON `db`.`btable` TO `tester`@`%` WITH GRANT OPTION   |
|GRANT SELECT, SHOW VIEW ON `db`.`atable` TO `tester`@`%` WITH GRANT OPTION   |
+-----------------------------------------------------------------------------+

使用tester用户登录后操作:

C:\Users\me>mysql -utester -ppassword
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 6
Server version: 10.6.5-MariaDB mariadb.org binary distribution

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> use db;
Database changed
MariaDB [db]> show tables;
+------------------------------+
| Tables_in_db                 |
+------------------------------+
| atable                       |
+------------------------------+
1 row in set (0.001 sec)

MariaDB [db]> select * from atable;
Empty set (0.000 sec)

MariaDB [db]> select * from btable;
Empty set (0.000 sec)

MariaDB [db]> select * from Btable;
Empty set (0.000 sec)

MariaDB [db]> select * from user;
ERROR 1142 (42000): SELECT command denied to user 'tester'@'localhost' for table 'user'

现象总结:

  • SHOW TABLES仅显示与授权大小写匹配的atable
  • 对btable/Btable的查询均正常
  • 无法创建保留大写表名的授权语句
  • 已提交MariaDB Bug报告

可行解决办法

  • 统一表名为小写
    将现有大写表名重命名为小写,然后重新授予权限。例如:

    RENAME TABLE `db`.`Table1` TO `db`.`table1`;
    GRANT SELECT, SHOW VIEW ON `db`.`table1` TO 'altium'@'%';
    

    此方法彻底解决大小写不匹配问题,符合lower_case_table_names=2环境的预期行为。

  • 授予数据库级别的SHOW TABLES权限
    如果允许用户查看数据库内所有表,可直接授予数据库级别的权限:

    GRANT SHOW TABLES ON `db`.* TO 'altium'@'%';
    

    注意:此操作会让用户看到数据库内所有表,需评估权限范围是否符合安全要求。

  • 使用视图替代直接表授权(可选)
    创建对应表的视图,然后授予视图的SELECT、SHOW VIEW权限:

    CREATE VIEW `db`.`v_table1` AS SELECT * FROM `db`.`Table1`;
    GRANT SELECT, SHOW VIEW ON `db`.`v_table1` TO 'altium'@'%';
    

    用户通过视图访问数据,同时SHOW TABLES会显示视图(若授权正确),但此方法增加了维护成本。


内容的提问来源于stack exchange,提问作者dognose

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 16:37:09