codeigniter本身不管理数据库权限,跨库访问能否成功完全取决于mysql是否为用户授予多个库的相应权限;必须用多条grant语句分别为每个库授权,如grant select on db1. to 'user'@'host'; grant select on db2. to 'user'@'host';,且需确保host匹配、库名后带.*、用current_user()验证实际权限。

CodeIgniter 本身不管理数据库权限,跨库访问能否成功,完全取决于 MySQL(或你使用的数据库系统)是否给对应用户授予了多个库的相应权限。CI 只是连接并执行 SQL,它不会自动帮你授权、也不会绕过 MySQL 的权限检查。
必须在 MySQL 中为用户逐个库授权
MySQL 不支持一条 GRANT 语句同时授权多个数据库,比如 ON db1.*, db2.* 是语法错误。哪怕权限完全一样,也得拆成多条独立语句:
- GRANT SELECT, INSERT ON sales.* TO 'ci_app'@'192.168.5.%';
- GRANT SELECT, INSERT ON inventory.* TO 'ci_app'@'192.168.5.%';
- GRANT EXECUTE ON sales.* TO 'ci_app'@'192.168.5.%';(如果要用存储过程)
注意:数据库名后必须带 .*,不能省略;主机部分(如 192.168.5.%)要和 CI 实际连接时用的 host 完全一致——'ci_app'@'localhost' 和 'ci_app'@'127.0.0.1' 是两个不同账号,权限不互通。
验证用户实际被匹配到的账号
在 CI 应用里连上数据库后,直接执行:
SELECT CURRENT_USER();
返回结果才是 MySQL 真正用来查权限的账号(格式为 user@host)。拿这个结果去查权限:
SHOW GRANTS FOR 'user'@'host';
就能看到该账号到底有没有拿到你要的那些库的权限。别只看 USER(),它显示的是“你声称自己是谁”,而 CURRENT_USER() 才是“MySQL 认你是谁”。
通配符可简化批量授权(慎用)
如果多个数据库命名有规律(比如都以 app_ 开头),可以用反引号+通配符一次性覆盖:
GRANT SELECT ON `app_%`.* TO 'ci_app'@'192.168.5.%';
这样,新建的 app_orders、app_logs 等库会自动被包含——但要注意:% 匹配任意长度字符,_ 只匹配单个字符;含特殊字符或短横线的库名必须用反引号包裹,否则报错。
CI 配置本身不解决权限问题
CodeIgniter 支持配置多个数据库连接组(如 $db['sales'] 和 $db['inventory']),但它只是让你能分别连两个库。如果 MySQL 用户没被授这两个库的权限,CI 即使切换连接组,执行查询时仍会报 Access denied。常见错误是:建了用户、建了库、配了 CI 连接,却忘了在 cPanel 或 MySQL 命令行里真正执行 GRANT。
授权完成后无需手动 FLUSH PRIVILEGES(MySQL 5.7+ 的 GRANT 自动刷新缓存),但建议执行 SHOW GRANTS 确认无误再上线。











