Oracle中SYS与普通用户授予V$SESSION权限对象名差异问题
问题场景
Oracle数据库中针对v$Session视图的授权操作存在看似矛盾的现象,复现步骤如下:
- 以SYS用户登录,执行授权命令可成功:
SYS> grant SELECT on V_$SESSION to "SOMEUSER" with GRANT OPTION;
- 切换到SOMEUSER用户,可正常查询V$SESSION视图:
SOMEUSER> select * from V$SESSION; ..... 预期输出内容 .....
- SOMEUSER持有带GRANT OPTION的权限,但执行如下转授命令时报ORA-00942错误:
SOMEUSER> grant SELECT on V_$SESSION to "OTHERUSER" with GRANT OPTION; grant select on V_$SESSION to "OTHERUSER" * ERROR at line 1: ORA-00942: table or view does not exist
- SOMEUSER将授权对象改为V$SESSION时,转授可成功:
SOMEUSER> grant select on V$SESSION to "OTHERUSER"; Grant succeeded.
核心原因
这个差异本质是Oracle动态性能视图的两层对象结构,以及数据库对SYS用户、普通用户的对象解析、授权规则不同导致的:
- 首先明确动态性能视图的两层对象关系:
所有V$开头的动态性能视图,真实的实体对象都存放在SYS schema下,命名规则为V_$<视图后缀>,比如本次场景里的真实对象是SYS.V_$SESSION,这是数据库中实际承载权限、存储访问逻辑的实体对象。
而所有用户默认能直接访问的V$SESSION,是Oracle预创建的公共同义词,这个同义词本身没有权限逻辑,只是指向SYS.V_$SESSION的别名。 - 为什么SYS授权必须指定
V_$SESSION:
Oracle的授权语法要求,授权操作必须针对真实存在的实体对象(表、视图、存储过程等),不能直接对同义词授权。SYS作为对象属主,自身schema下不存在名为V$SESSION的实体对象,只有V_$SESSION是真实存在的视图,因此必须指定V_$SESSION才能完成授权。如果SYS尝试直接grant select on V$SESSION to xxx,同样会报对象不存在的错误。 - 为什么普通用户转授必须指定
V$SESSION,指定V_$SESSION反而报错:
普通用户没有SYS schema下实体对象的直接引用权限:SYS给SOMEUSER授权时,仅授予了SYS.V_$SESSION的查询和转授权限,没有给SOMEUSER开放SYS.V_$SESSION对象名的直接可见性,也不存在V_$SESSION的公共同义词,因此SOMEUSER写V_$SESSION时,数据库在当前schema、公共同义词列表里都找不到对应对象,自然抛出ORA-00942错误。
而普通用户能访问到的相关对象只有公共同义词V$SESSION,Oracle针对这个场景做了语法适配:当用户持有某个公共同义词指向的底层实体的转授权限时,允许用户直接用公共同义词名作为授权对象执行转授,数据库会自动将权限映射到背后的真实实体上完成操作,因此指定V$SESSION的授权可以成功。
内容的提问来源于stack exchange,提问作者Andrew Vickers
相关产品推荐
相关产品推荐

