Oracle数据库视图与权限问题
来源:互联网 发布:sql万能钥匙 编辑:程序博客网 时间:2024/05/16 08:57
http://tech.it168.com/a2009/1116/809/000000809691.shtml
前几天客户遇上这样一个问题,某个用户A将视图的SELECT给予另一个用户B,但是用户B查询这个视图时,仍然报错:ORA-01031: 权限不足。这是怎么一回事呢?下面来模拟一下这个过程:
有三个用户test1,test2,test3, 三个用户都具有DBA色色权限。
用TEST1用户创建一个表T1,并将其查询权限授予TEST2:
表已创建。
SQL> grant select on t1 to test2;
授权成功。
SQL> create table t1 as select * from all_objects;
表已创建。
SQL> grant select on t1 to test2;
授权成功。
用TEST2用户创建一个视图,视图的基表是TEST1.T1,并将查询权限授予TEST3:
视图已建立。
SQL> grant select on v_t1 to test3;
授权成功。
SQL> create view v_t1 as select * from test1.t1;
视图已建立。
SQL> grant select on v_t1 to test3;
授权成功。
TEST3用户查询视图TEST2.V_T1:
select * from test2.v_t1 where rownum<1
*
ERROR 位于第 1 行:
ORA-01031: 权限不足
SQL> select * from test2.v_t1 where rownum<1;
select * from test2.v_t1 where rownum<1
*
ERROR 位于第 1 行:
ORA-01031: 权限不足
可以看到报了权限不足的错误,就算这里TEST3用户有DBA权限。
这到底是怎么回事呢?
其实视图的权限,有两点需要引起注意:
1. 视图中,类似于定义者权限的存储过程,是屏蔽了角色权限的。比如如果TEST1没有显式地将T1表的SELECT权限给予TEST2,那么TEST2在创建视图V_T1时也会报ORA-01031错误,即使TEST2用户拥有DBA角色权限。
2.如果在用户A的视图中,引用了其他用户B的表,用户A将视图的访问权限给予用户C,那么就变相地将用户B的表的访问权限给予了用户C,因此,用户A必须有将用户B的表的访问权限转授用户C的权限,也就是用户B在授予A权限时,必须使用with grant option。
显然这里正是由于第2点的原因,导致用户TEST3不能访问视图。用户TEST1执行下面的操作,将解决这个问题:
授权成功。
SQL> grant select on t1 to test2 with grant option;
授权成功。
对于视图的UPDATE,DELETE权限,同样是如此。
在测试时,有一个现象,有点意思。就是如果用户TEST2没有显式地把V_T1的SELECT权限授予TEST3,而TEST3在有SELECT ANY TABLE或DBA权限时,则查询这个视图时不会报权限不足的错误。由于有SELECT ANY TABLE权限的存在,所有的用户表都可以被访问。但是显式授予表的权限时,似乎表的权限有更高的优先级,并且没有跟系统权限和角色权限进行结合。或者版本不同,表现得不一样,在我的测试中,是Oracle 9.2.0.8 for Windows。
- Oracle数据库视图与权限问题
- Oracle数据库表与视图
- Oracle数据库表与视图
- oracle数据库的权限问题
- oracle权限视图
- Oracle数据库中表与视图的应用
- Oracle数据库中表与视图的应用
- Oracle数据库中表与视图的应用
- Oracle数据库之视图与索引
- oracle 创建其他用户下物化视图 权限不足问题
- Oracle创建视图view权限不足问题剖析
- 关于oracle数据库connect的权限问题
- Oracle数据库sysdba、sysoper权限问题
- oracle与用户角色权限相关的视图
- oracle的与权限,角色相关的视图
- 50、oracle的与权限,角色相关的视图
- ORACLE数据库用户与权限管理
- ORACLE数据库用户与权限管理
- Objective-C学习笔记(1)
- Segmentation fault (core dumped)
- ip地址获取
- 轻量级IOC框架Beancontext发布
- 解决Retrying connect to server: 0.0.0.0/0.0.0.0:8032. Already tried 0 time(s); retry policy is...
- Oracle数据库视图与权限问题
- Struts2文件上传
- Android4.4系统浏览器Chromium实现的加载模块与流程
- 明星吸毒怎么情况
- gdb
- login窗口居中
- c++ namespace域名的使用
- Xcode自定义Eclipse中常用的快捷键
- 详解Objective-C runtime