MySQL权限:授予create view后用户无法查询自建视图如何解决
故障原因
- 数据库权限体系中,
CREATE VIEW仅代表用户具备创建视图的操作资格,不会在视图创建完成后自动给创建者授予该视图的SELECT权限。视图属于独立的权限管控对象,权限不会随创建动作自动赋值。 - 若创建视图时手动指定了
DEFINER为其他用户,且视图使用默认的DEFINER安全校验模式,当前创建用户不属于视图定义的属主时,会直接被拦截查询请求。 - 视图查询最终会落到对底层基表的访问上,如果创建者没有视图依赖基表的SELECT权限,哪怕视图归属当前用户,也会因为基表权限校验不通过无法查询。
权限配置方案
- 常规场景下,直接给用户授予对应操作范围内的
CREATE VIEW+SELECT组合权限即可,比如允许用户在biz_db库下创建并查询视图,执行以下授权命令:
GRANT CREATE VIEW, SELECT ON biz_db.* TO 'target_user'@'allowed_host'; FLUSH PRIVILEGES;
这种配置下用户在对应库内创建的所有视图,都因为库级SELECT权限的覆盖,可直接正常查询。
- 如果需要严格收敛权限,只给用户授予自己创建的单个视图的SELECT权限、不开放全库SELECT,可以在MySQL 8.0及以上版本中,通过创建元数据触发器监听视图创建事件,自动给创建者授予对应视图的SELECT权限,不过该方案配置复杂度较高,生产环境优先推荐第一种组合授权方案。
- 额外注意:无特殊需求时,创建视图不要手动修改
DEFINER属性,保持默认的DEFINER = CURRENT_USER配置,避免出现视图属主和实际创建人不一致的权限校验问题。
内容的提问来源于stack exchange,提问作者Astora
相关产品推荐
相关产品推荐

