Oracle对视图有查询权限实际查询却报错ORA-01031: insufficient privileges
Oracle对视图有查询权限实际查询却报错ORA-01031: insufficient privileges
实际现象如下:
15:24:36 C@zkm(51)> select * FROM USER_TAB_PRIVS WHERE table_name='V_T'; GRANTEE OWNER TABLE_NAME GRANTOR PRIVILEGE GRANTABLE HIERARCHY ------------------------- ------------------------------ ------------------------------ ------------------------- ------------------------------ --------- --------- C B V_T B SELECT NO NO Elapsed: 00:00:00.05 15:24:39 C@zkm(51)> select count(*) from b.v_t; select count(*) from b.v_t * ERROR at line 1: ORA-01031: insufficient privileges Elapsed: 00:00:00.00
从视图user_tab_privs可以看出,C用户对表B.V_T(实际是视图)是有select权限的,但是查询确会报权限不足。
还真是奇葩。
实际上V_T是用户B的一个视图,V_T视图内容是查询用户A的表T。
看下实际环境构造时候的语句会更加直观明了。
1.sys管理员用户创建a,b,c三个用户并授权: create user a identified by a; create user b identified by b; create user c identified by c; grant resource,connect,unlimited tablespace,create synonym,create view to a,b,c; 2.登录用户a: create table a.t (id int); grant select on a.t to b; 3.登录用户b: create view v_t as select * from a.t; 4.使用sys将b.v_t授权查询权限给用户c: grant select on b.v_t to c;
按照上边的顺序执行后就将该现象重现出来了。
根本原因在于使用sys用户授权b.v_t给c用户的时候,虽然直接授权成功了,查询user_tab_privs也显示权限没有问题,但是实际上如果第4步使用b用户授权自己的视图v_t给c的时候会报错:
15:24:26 B@zkm(486)> grant select on b.v_t to c; grant select on b.v_t to c * ERROR at line 1: ORA-01720: grant option does not exist for 'A.T'
这样就明白了,b用户对a.t这个表只有查询权限,没法私自将a.t查询权限授权给c去查询。
解决方法就是让b用户也有讲a.t这个表给c用户的权限。
登录a用户:
grant select on t to b with grant option;
不需要在做其他操作,with grant option后c用户再次执行就不会报错了。
因为sys用户拥有最高权限,所以上边第4步骤直接执行成功了,但是我觉得Oracle应该有个校验然后报错提示才合理。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
2020-05-11 Oracle收集对表收集统计信息导致全表扫描直接路径读?