必须显式授予INFORMATION_SCHEMA.COLUMNS权限并配置SQL SECURITY DEFINER视图,否则BI工具无法获取字段元数据且视图执行会因基表权限检查失败而报错。

直接给第三方 BI 工具账号 SELECT 权限,基本等于把数据库的“目录+内容”全交出去——它能查 information_schema 看所有表结构,能 SELECT * 拖出整张用户表,还能通过视图间接访问本不该暴露的字段。真要安全,必须切断它对基表、系统库、DDL 能力的任何路径。
只授视图 SELECT 权限,但必须配 SQL SECURITY DEFINER
BI 工具连上来后,通常不会直接查 sales 表,而是查你预定义的 v_sales_summary 视图。但光给视图 GRANT SELECT ON bi_db.v_sales_summary 不够——MySQL 默认以调用者(即 BI 账号)身份去验证视图依赖的基表权限。如果没设 SQL SECURITY DEFINER,它会检查 BI 账号是否对 sales 和 regions 有 SELECT,而你恰恰不该给。
- 建视图时必须显式写
CREATE SQL SECURITY DEFINER VIEW ...,DEFINER设为 DBA 或有基表权限的高可信账号(如'dba'@'localhost') -
DEFINER用户本身必须对视图里所有基表有SELECT权限(否则视图创建就失败) - BI 账号只需对视图本身有
SELECT,对基表、函数、存储过程等零权限 - 漏掉
SQL SECURITY DEFINER或写成INVOKER,执行时就会报SELECT command denied
必须显式授予 INFORMATION_SCHEMA.COLUMNS 权限
几乎所有 BI 工具(Tableau、Power BI、Superset、Navicat)在连接后第一件事不是查数据,而是查 INFORMATION_SCHEMA.COLUMNS 获取字段名、类型、是否为空——这是渲染字段列表、拖拽生成 SQL 的前提。没这个权限,工具卡在“正在加载表结构”,或报 Access denied to database 'information_schema'。
- 执行
GRANT SELECT ON INFORMATION_SCHEMA.COLUMNS TO 'bi_reader'@'10.20.%'(必须) - 可选加
GRANT SELECT ON INFORMATION_SCHEMA.TABLES,用于列出视图名;若已限定只连某个库的某几个视图,可省略 - 绝对不要授
GRANT SELECT ON INFORMATION_SCHEMA.*,会暴露ROUTINES、STATISTICS等敏感元数据 - MySQL 8.0+ 对
INFORMATION_SCHEMA的权限控制更严格,不显式授就真查不到
host 匹配和认证插件是连不上的高频断点
权限全给了,GRANT 也 FLUSH PRIVILEGES 了,但 Navicat 或 Python 的 pymysql 就是连不上——八成卡在认证层,而非权限层。
- 确认
CREATE USER的 host 和 BI 工具真实出口 IP 一致:K8s 集群走 NAT 网关?那'bi_reader'@'10.20.%'要改成网关 IP 段;云厂商 LB 后端源 IP 可能被改写,得用SELECT SUBSTRING_INDEX(USER(), '@', -1)在连接后查实际 host - MySQL 8.0+ 默认用
caching_sha2_password插件,老版本 BI 工具(如旧版 Tableau Desktop、某些 JDBC 驱动)不支持,必须显式指定:CREATE USER 'bi_reader'@'10.20.%' IDENTIFIED WITH mysql_native_password BY 'xxx' - 别用
'bi_reader'@'%',哪怕测试方便,上线前必须收紧到具体 CIDR
REVOKE ALL PRIVILEGES 是防止权限残留的关键动作
MySQL 的权限继承机制很隐蔽:用户可能从 mysql.user 表里继承了全局 USAGE,或之前被误授过 bi_db.*,这些都会绕过视图隔离。不清理,等于白配。
- 先查当前权限:
SHOW GRANTS FOR 'bi_reader'@'10.20.%',重点看有没有ON bi_db.*或基表名 - 逐个回收:
REVOKE SELECT ON bi_db.sales FROM 'bi_reader'@'10.20.%',别用REVOKE ALL PRIVILEGES ON bi_db.*——它不清理视图相关权限 - 最后执行:
REVOKE ALL PRIVILEGES ON *.* FROM 'bi_reader'@'10.20.%'; GRANT USAGE ON *.* TO 'bi_reader'@'10.20.%',确保只剩显式授予的那几条 - BI 工具侧也要关掉“自动分析表”、“创建临时表”等 DDL 功能,否则即使权限干净,也会因
ANALYZE TABLE报错被包装成连接超时
真正安全的只读账号,不是靠“少给点权限”凑出来的,而是靠视图封装 + DEFINER 信任链 + 元数据最小化授权 + host 精确匹配 + 权限清零这五层嵌套校验撑起来的。少一层,就可能被工具自动行为或网络环境绕过。


















