暂无图片
分享
杨卓
2020-04-23
创建视图报权限不足

SQL> create user a identified by a;
SQL> create user b identified by a;
SQL> create user c identified by a;
SQL> grant connect ,resource to a;
SQL>grant connect to b,c;
a
SQL> create table a(id int,name varchar2(20));
b
SQL> grant select on a.a to b;
SQL> grant create view to b;
SQL> create view v1 as select * from a.a;
c
SQL> grant create view to c;
SQL> grant select on b.v1 to c;
SQL> grant select on a.a to c;
SQL> create view v2 as select id from b.v1;
ORA-01031: insufficient privileges

收藏
分享
8条回答
默认
最新
杨卓
上传附件:tt_ora_1921.trc
暂无图片 评论
暂无图片 有用 0
打赏 0
seagull

select * from role_sys_privs;看一下有没有create view权限,不行单独赋予create view权限

暂无图片 评论
暂无图片 有用 0
打赏 0
杨卓

有权限的
select * from user_tab_privs

GRANTEE OWNER TABLE_NAME GRANTOR PRIVILEGE GRA HIE


C A A A SELECT NO NO
C B V1 B SELECT NO NO

select * from user_sys_privs

USERNAME PRIVILEGE ADM


C CREATE VIEW NO

暂无图片 评论
暂无图片 有用 0
打赏 0
大柏树

有可能是需要显式赋权

暂无图片 评论
暂无图片 有用 0
打赏 0
始于脚下

grant create any view to c;试一下

暂无图片 评论
暂无图片 有用 0
打赏 0
peiyang

这个是没有级联,因为最后create view v2 as select id from b.v1;这个需要取调用底层视图,你可以通过10046去追踪一下,我今天测试了一下。

PARSING IN CURSOR #139935025613160 len=37 dep=1 uid=0 oct=3 lid=0 tim=1587694095465031 hv=1398610540 ad=‘de1f8af0’ sqlid=‘grwydz59pu6mc’
select text from view$ where rowid=:1
END OF STMT
PARSE #139935025613160:c=33,e=33,p=0,cr=0,cu=0,mis=0,r=0,dep=1,og=4,plh=3684871272,tim=1587694095465029
BINDS #139935025613160:
Bind#0
oacdty=11 mxl=16(16) mxlc=00 mal=00 scl=00 pre=00
oacflg=18 fl2=0001 frm=00 csi=00 siz=16 off=0
kxsbbbfp=7f45297e4528 bln=16 avl=16 flg=05
value=000161C0.0001.0001
EXEC #139935025613160:c=612,e=10292,p=0,cr=0,cu=0,mis=0,r=0,dep=1,og=4,plh=3684871272,tim=1587694095475417
FETCH #139935025613160:c=31,e=31,p=0,cr=2,cu=0,mis=0,r=1,dep=1,og=4,plh=3684871272,tim=1587694095475487
STAT #139935025613160 id=1 cnt=1 pid=0 pos=1 obj=69 op=‘TABLE ACCESS BY USER ROWID VIEW$ (cr=1 pr=0 pw=0 time=23 us cost=1 size=15 card=1)’
CLOSE #139935025613160:c=71,e=71,dep=1,type=0,tim=1587694095475574

PARSING IN CURSOR #139935025614104 len=40 dep=0 uid=104 oct=21 lid=104 tim=1587694095475977 hv=2292582133 ad=‘7f452979fdf0’ sqlid=‘8t3mccy4ac1rp’
create view v2 as select * from user2.v1
END OF STMT
PARSE #139935025614104:c=1735,e=11416,p=0,cr=2,cu=0,mis=1,r=0,dep=0,og=1,plh=0,tim=1587694095475976

PARSING IN CURSOR #139935025607992 len=45 dep=1 uid=0 oct=3 lid=0 tim=1587694095476147 hv=3393782897 ad=‘de1df018’ sqlid=‘9p6bq1v54k13j’
select value$ from sys.props$ where name = :1
END OF STMT
PARSE #139935025607992:c=28,e=28,p=0,cr=0,cu=0,mis=0,r=0,dep=1,og=4,plh=415205717,tim=1587694095476146
BINDS #139935025607992:
Bind#0
oacdty=01 mxl=32(22) mxlc=00 mal=00 scl=00 pre=00
oacflg=10 fl2=0001 frm=01 csi=852 siz=32 off=0
kxsbbbfp=7f4529710bc8 bln=32 avl=22 flg=05
value=“GG_XSTREAM_FOR_STREAMS”
EXEC #139935025607992:c=5506,e=13369,p=0,cr=0,cu=0,mis=0,r=0,dep=1,og=4,plh=415205717,tim=1587694095489567
FETCH #139935025607992:c=32,e=32,p=0,cr=2,cu=0,mis=0,r=0,dep=1,og=4,plh=415205717,tim=1587694095489617
STAT #139935025607992 id=1 cnt=0 pid=0 pos=1 obj=98 op=‘TABLE ACCESS FULL PROPS$ (cr=2 pr=0 pw=0 time=32 us cost=2 size=28 card=1)’
CLOSE #139935025607992:c=5,e=5,dep=1,type=0,tim=1587694095489670
因为调用底层视图,肯定没有权限。
所以你这个很好处理,我昨天测试用了两种方法:
1.授予c select any table的权限,就可以创建了。
2.grant select on a.a to b; 加上with grant option就可以了。

但是这种应该在生产少见,一般不会这么用,因为视图查视图这种本身就比较复杂,如果是a表创建非常复杂,根据a表创建视图v1也很复杂的话,创建V2去做测试这种视图估计可能会产生性能问题的,一般这种直接去查a表就可以,不过研究研究还是挺好玩的。

暂无图片 评论
暂无图片 有用 0
打赏 0
杨卓

感谢,有个客户有这个需求,而且看起来权限都有,但是grant 报错,提示无法授权;但是如果视图自身带有with grant option则可以,测试有意思。

暂无图片 评论
暂无图片 有用 0
打赏 0
杨卓
问题已关闭: 问题已经得到解决
暂无图片 评论
暂无图片 有用 0
打赏 0
回答交流
Markdown


请输入正文
提交
相关推荐
Oracle 在集群环境下 ,如何判断参数应该配置在 grid 中的sqlnet.ora 还是 Oracle 用户下面的 sqlnet.ora?
回答 4
已采纳
我理解的是集群配置在grid下,数据库配置在Oracle下。
oracle 12c 统计信息收集job异常
回答 2
暂无文字回复
Oracle还原并恢复undo表空间的一个数据文件
回答 1
已采纳
A5,4,3,2(1,6,7不需要)5.Startthedatabaseinmountmode.4.Restorethedamagedfile.3.Recoverthedamagedfile.2.Op
19c rac 节点与DB节点不符合
回答 1
可能性1、创建数据库时,addinstance的时候,节点名称和实例名称反了;可能性2、数据库安装的时候模式选择错误,db安装Oracle支持策略或者池的概念,数据库实例可以在不同的RAC节点,需要铲
如何设置shared_pool_reserved_size的值
回答 1
已采纳
sharedpoolreservedsize一般默认是sharedpoolsize的5%,这个比例由参数sharedpoolreservedpct控制.如果负载不一致,导致共享池大小不一致,那么sha
oracle 和mysql 语句结果不一致问题
回答 7
已采纳
leftjoin不会过滤左表数据。那肯定是where条件过滤了。你看两个库中超级管理员那行的parents列的值是相同的吗?
Oracle group by之后想要查询其他列,怎么操作?
回答 1
已采纳
having
怎么能看到索引创建的百分比?
回答 1
setline250colssidformat9999headingSID;colopnameformata15TRUNCATE;coltargetformata28TRUNCATE;colesfor
ogg提示01292 sqlerror 01400
回答 1
OPCODE列非空,所以无法插入null值
latch: row cache objects
回答 6
有结论了吗?看awr报告中的TimeModelStatistics,建议开发查找是否有执行失败、报错的sql,将sql改正确。并且将相关sql使用绑定变量,减少硬解析。