必须显式授予create view和show view权限,仅select不足;create view需数据库级(db_name.*)授权,查询视图还需单独授予select和show view权限,且视图权限与基表权限完全解耦。

用户不能只靠 GRANT SELECT 就创建或查询视图——必须显式授予 CREATE VIEW 和 SHOW VIEW 权限,否则会报错 ERROR 1142 (42000): CREATE VIEW command denied to user 或 ERROR 1142 (42000): SELECT command denied to user。
给用户授予权限前必须确认其是否具备 CREATE VIEW 权限
MySQL 中创建视图不是普通 DML 操作,它属于 DDL(数据定义语言),需要独立的 CREATE VIEW 权限。仅授予 SELECT 不足以让该用户执行 CREATE VIEW 语句。
-
CREATE VIEW权限必须在数据库级(db_name.*)或全局(*.*)授予,不能只给某张表 - 若用户还需在该库中创建其他对象(如表、存储过程),可一并加上
CREATE、ALTER等权限,但不要滥用ALL PRIVILEGES - 执行授权后需运行
FLUSH PRIVILEGES;(仅当直接修改mysql系统表时才强制需要;用GRANT语句通常自动生效)
授权用户查询视图必须同时给 SELECT + SHOW VIEW
即使视图已存在,且用户有底层表的 SELECT 权限,仍无法 SELECT 视图本身——MySQL 默认不继承视图所依赖表的权限,必须显式授予对视图对象的 SELECT,以及额外的 SHOW VIEW 权限才能查看视图定义(SHOW CREATE VIEW)或执行查询。
- 正确写法:
GRANT SELECT, SHOW VIEW ON mydb.myview TO 'user'@'localhost'; - 错误写法:
GRANT SELECT ON mydb.mytable TO 'user'@'localhost';—— 这不能让 user 查询基于mytable的视图 - 如果要授权整个库下所有现有及未来视图,可用通配符:
GRANT SELECT, SHOW VIEW ON mydb.* TO 'user'@'localhost';
用户创建视图后,其他人查不了?那是因为没授视图级 SELECT
视图创建者默认拥有该视图的所有权限,但其他用户默认没有任何权限。即使你已给用户 A 授予了 CREATE VIEW 和对基表的 SELECT,A 创建的视图对用户 B 来说仍是不可见、不可查的。
- B 需要单独被授予对该视图的
SELECT(和SHOW VIEW)权限,例如:GRANT SELECT, SHOW VIEW ON mydb.emp_summary_view TO 'bob'@'%'; - 注意:视图名必须带数据库前缀(
mydb.emp_summary_view),不能只写emp_summary_view,否则 MySQL 会报错Unknown table - 如果视图定义里用了函数、子查询或跨库表,还可能触发
SQL SECURITY DEFINER限制——此时需确保 definer 用户存在且有对应权限,否则视图查询会静默失败
最容易被忽略的一点是:视图权限和基表权限完全解耦。哪怕你把底层所有表的 SELECT 都给了某用户,只要没单独给他那个视图的 SELECT 和 SHOW VIEW,他就执行不了 SELECT * FROM myview; —— 错误信息看起来像权限不足,实际只是漏掉了这两项。











