一、场景说明:
同事将视图(A用户)的读取权限授予C用户后,
登录C用户后,读取该视图报错ORA-01031: 权限不足
二、遇到该问题时,我的处理思路:
1、首先该报错一般是创建视图会报,因为缺少CREATE VIEW权限,但读取视图报这个错误却属于非正常情况
2、忽略原理,首先尝试解决问题,询问该视图是否问跨用户视图,得到确认
3、询问是否所有视图相关基表的读取权限都赋予了C用户,得到肯定答复
并且得到反馈为,基表赋权后,直接通过视图的创建语句(select)进行读取可以获得结果,但直接读取视图依然报ORA-01031
4、当时无现成方案,决定赋予C用户select any table系统权限临时处理
三、问题诊断思路:
1、这种问题算诡异问题的一种。因为理论上,赋予视图读取权限要么成功后可以正常读取,要么因为权限不足报错ORA-00990: 权限缺失或无效。
如果报00990 一般为缺少其他用户相关基表的 with grant option,重新赋予读取权限并增加 with grant option解决即可。
2、询问同事是否使用A用户进行授权的,得到使用SYS用户进行直接授权的。怀疑与直接用SYS用户授权有关
四、问题场景模拟还原:
思路说明:创建A,B,C用户。A用户创建视图V_a,并包含B用户的dept表。通过sys用户将该视图的select权限赋予C用户。
1、创建用户
SQL> create user a identified by a account unlock;
用户已创建。
SQL> create user b identified by b account unlock;
用户已创建。
SQL> create user c identified by c account unlock;
用户已创建。
SQL> grant connect,resource to a,b,c;
授权成功。
2、创建表及相关视图
B用户
SQL> create table a.emp as select * from scott.emp;
表已创建