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
相关产品推荐
相关产品推荐

