Oracle权限问题:如何让SCHEMA3访问SCHEMA2引用SCHEMA1的视图?
解决Oracle视图权限拒绝问题(无需直接授予基表权限)
问题根源
当SCHEMA3访问SCHEMA2创建的视图时,Oracle会检查SCHEMA3是否对视图的基表(SCHEMA1.TABLE)有直接访问权限——除非SCHEMA2拥有基表的带WITH GRANT OPTION的SELECT权限,否则无法通过视图将权限传递给SCHEMA3。另外,SCHEMA2创建视图时必须使用直接授予的权限(不能通过角色获得基表权限),否则视图的权限传递会失效。
解决方案
方案1:给SCHEMA2授予基表的带WITH GRANT OPTION的SELECT权限
这是最直接的解决方式,步骤如下:
- 以拥有DBA权限的用户(如SYS)执行,给SCHEMA2授予基表权限并允许传递:
GRANT SELECT ON SCHEMA1.TABLE TO SCHEMA2 WITH GRANT OPTION; - 如果之前的视图是在SCHEMA2没有带
WITH GRANT OPTION的权限下创建的,需要重建视图(确保视图使用新的权限上下文):CREATE OR REPLACE VIEW SCHEMA2.VIEW AS SELECT * FROM SCHEMA1.TABLE; - 重新给SCHEMA3授予视图的SELECT权限:
GRANT SELECT ON SCHEMA2.VIEW TO SCHEMA3;
此时SCHEMA3访问视图时,会借助SCHEMA2的权限访问基表,无需直接拥有SCHEMA1.TABLE的权限。
方案2:确认视图使用DEFINER权限模型(默认行为)
Oracle视图默认使用DEFINER权限模型(即执行视图时使用创建者SCHEMA2的权限),但需满足两个前提:
- SCHEMA2必须拥有SCHEMA1.TABLE的直接SELECT权限(不能通过角色获得)
- SCHEMA2的权限需包含
WITH GRANT OPTION(同方案1)
如果已经满足上述条件,只需确保视图创建时没有添加AUTHID CURRENT_USER(即不使用INVOKER权限模型),即可实现权限传递。
注意事项
- 避免用角色给SCHEMA2授予基表权限:角色权限无法用于视图的权限传递,必须使用直接授予的权限。
- 遵循最小权限原则:若后续不需要SCHEMA2将基表权限传递给其他用户,可回收
WITH GRANT OPTION:REVOKE GRANT OPTION FOR SELECT ON SCHEMA1.TABLE FROM SCHEMA2;
回收后,已授予SCHEMA3的视图权限依然有效。
内容的提问来源于stack exchange,提问作者Luke
相关产品推荐
相关产品推荐

