Oracle数据库视图与权限问题

   有三个用户test1,test2,test3, 三个用户都具有DBA色色权限。

  用TEST1用户创建一个表T1,并将其查询权限授予TEST2:

  SQL> create table t1 as select * from all_objects;

  表已创建。

  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> create view v_t1 as select * from test1.t1;

  视图已建立。

  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:

  SQL> select * from test2.v_t1 where rownum<1;

  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;

  授权成功。

  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。

时间: 2024-08-29 06:30:34

Oracle数据库视图与权限问题的相关文章

Oracle数据库-视图的概念

oracle|概念|视图|数据|数据库     视图是原始数据库数据的一种变换,是查看表中数据的另外一种方式.可以将视图看成是一个移动的窗口,通过它可以看到感兴趣的数据.     视图是从一个或多个实际表中获得的,这些表的数据存放在数据库中.那些用于产生视图的表叫做该视图的基表.一个视图也可以从另一个视图中产生.     视图的定义存在数据库中,与此定义相关的数据并没有再存一份于数据库中.通过视图看到的数据存放在基表中.     视图看上去非常象数据库的物理表,对它的操作同任何其它的表一样.当通

Oracle数据库存储过程与权限

在执行存储过程时,我们可能会遇到权限问题 ● 定义者权限存储过程 ● 调用者权限存储过程 在数据库中创建存储过程时,定义者权限是缺省模式 当指定AUTHID CURRENT_USER关键字后,便是调用者权限存储过程 他俩之间最根本的差异在于role能否在存储过程中生效 ㈠ 定义者权限存储过程问题 定义者权限存储过程role无效,必须要有显式授权 即便是拥有dba role,还是不能访问不同用户的表 sys@EMREP> grant connect,resource to u1 identifie

orabbix监控oracle数据库状态例子

1 下载 下载地址: http://www.smartmarmot.com/product/orabbix/download/ 2 授予文件可执行的权限 #chmod +x /opt/orabbix -R #chmod +x /opt/orabbix/run.sh 3 创建一个名为config.props文件,有模板可以参考. #cp /opt/orabbix/conf/config.props.sample config.props 下面是我的一个配置: 注意DatabaseList大小写敏感

Oracle数据库表与视图

oracle|视图|数据|数据库 Oracle数据库数据对象中最基本的是表和视图,其他还有约束.序列.函数.存储过程.包.触发器等.对数据库的操作可以基本归结为对数据对象的操作,理解和掌握Oracle数据库对象是学习Oracle的捷径. 表和视图 Oracle中表是数据存储的基本结构.ORACLE8引入了分区表和对象表,ORACLE8i引入了临时表,使表的功能更强大.视图是一个或多个表中数据的逻辑表达式.本文我们将讨论怎样创建和管理简单的表和视图. 管理表 表可以看作有行和列的电子数据表,表是关

充分认识 Oracle 数据库表与视图

  Oracle数据库数据对象中最基本的是表和视图,其他还有约束.序列.函数.存储过程.包.触发器等.对数据库的操作可以基本归结为对数据对象的操作,理解和掌握Oracle数据库对象是学习Oracle的捷径. 表和视图 Oracle中表是数据存储的基本结构.Oracle8i引入了分区表和对象表,Oracle8i引入了临时表,使表的功能更强大.视图是一个或多个表中数据的逻辑表达式.本文我们将讨论怎样创建和管理简单的表和视图. 管理表 表可以看作有行和列的电子数据表,表是关系数据库中一种拥有数据的结构

oracle数据库误修改/u01权限/所有者的故障恢复

有朋友找到我,说他对生产库做了误操作,导致数据库异常,请我帮忙处理,对/u01目录修改了用户和权限,导致数据库无法登录,但是业务还在继续 误操作命令 mkdir -p /u01/app/grid mkdir -p /u01/app/11.2.0/grid chown -R grid:oinstall /u01 mkdir -p /u01/app/oracle chown oracle:oinstall /u01/app/oracle chmod -R 775 /u01 尝试sqlplus登录数据

oracle数据库01-连接&amp;amp;用户&amp;amp;权限

     Oracle数据库是Oracle(中文名称叫甲骨文)公司的核心产品,Oracle数据库是一个适合于大中型企业的数据库管理系统.      Oracle数据库涉及银行.电信.移动通信.航空.保险.金融.电子商务和跨国公司等,Oracle的市场占有率最高,显然Oracle的主要用户涉及面非常广.      Oracle产品是免费的,可以在Oracle官方网站上下载到安装包,但是Oracle服务是收费的.在Java开发中,Oracle数据库是非常理想的选择.           http:/

Oracle中使用数据库的最高权限

  我们知道,Oracle数据库中有比如SYSTEM这类用户,但它不是最高权限,有些操作无法进行.会出现权限不足的提示.   那么我们怎么利用最高权限登录呢?   方法一 ①打开sqlplus,利用某个用户名登录进去. ②connect/as sysdba   方法二 ①打开cmd面板 ②set oracle_sid=mypd(你的数据库名字) ③sqlplus/nolog ④connect/as sysdba   当然如果你知道某个用户有最高权限,你就用这个用户名登录好啦!将第四步改成conn

Oracle创建视图view错误ORA-01031: 权限不足

今天在对表创建视图的时候,用户提示 ORA-01031用户权限不足,insufficient privileges .使用system用户对其分配dba等权限,依然无法创建视图. 创建视图  代码如下 复制代码 create or replace view stats as select 'STAT...' || a.name name, b.value       from v$statname a, v$mystat b      where a.statistic# = b.statist