跨用户创建依赖视图时Grant Option权限异常问题咨询
这是个挺典型的权限场景,我来帮你拆解背后的几个可能原因:
1. 权限缓存未及时刷新
MySQL(以及多数关系型数据库)会缓存用户权限来提升性能,如果你是刚给ein用户授予带WITH GRANT OPTION的权限,立刻执行CREATE VIEW语句,服务器可能还没加载新的权限配置,导致创建视图时的权限检查用的是旧状态,从而报错。
而单独执行SELECT语句时,可能缓存已经自动刷新(或某些场景下SELECT会触发权限重新校验),所以能正常运行。当你删除视图后,间隔的时间足够权限缓存更新,重新创建时就会读取到最新的权限,自然不会报错。
你可以手动执行FLUSH PRIVILEGES;来强制刷新权限,之后再创建视图,大概率能避免首次报错的问题。
2. 视图DEFINER属性的遗留问题
如果之前已经存在同名的ein.eswar视图,执行CREATE OR REPLACE VIEW时,视图的DEFINER(定义者)属性可能会沿用旧视图的设置,而不是当前执行创建操作的ein用户。
举个例子:假设旧视图是由ron用户创建的,那么替换视图时,服务器会检查ron用户对ron.anil表的权限(而非ein用户的),如果ron没有对应的GRANT OPTION,就会报错。当你删除旧视图后,重新创建的视图DEFINER是当前的ein用户,权限检查自然通过。
你可以通过查询INFORMATION_SCHEMA.VIEWS表来确认视图的DEFINER:
SELECT DEFINER FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_SCHEMA = 'ein' AND TABLE_NAME = 'eswar';
如果确实是DEFINER的问题,创建视图时可以显式指定DEFINER = CURRENT_USER来避免:
CREATE OR REPLACE VIEW ein.eswar DEFINER = CURRENT_USER AS SELECT * FROM ron.anil t ,msd.ram v where t.id=v.id;
3. 角色权限的激活延迟
如果你是通过角色给ein用户授予的权限,而你的数据库没有开启activate_all_roles_on_login选项,那么刚登录的用户需要手动执行SET ROLE ALL;来激活角色权限。
首次创建视图时,角色可能还未激活,导致权限检查不通过;而执行SELECT时你可能已经激活了角色,或者某些场景下SELECT会自动触发角色权限的校验。删除视图后,角色已经处于激活状态,重建视图时权限就满足要求了。
总结一下,最常见的原因是权限缓存未及时刷新或者旧视图的DEFINER遗留问题,你可以根据上面的方法排查验证。
内容的提问来源于stack exchange,提问作者Eswara Rao L

