前几天客户遇上这样一个问题,某个用户A将视图的SELECT给予另一个用户B,但是用户B查询这个视图时,仍然报错:ORA-01031: 权限不足。这是怎么一回事呢?下面来模拟一下这个过程:
有三个用户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。
转至:http://www.laoxiong.net/view-and-privilege.html
分享到:
相关推荐
Jenkins创建用户并分配不同视图的权限
在Microsoft Office SharePoint Server (MOSS) 中,视图权限设置是一项关键功能,它允许管理员精细控制用户对列表、库和网站中数据的访问。通过这种权限管理,组织能够确保信息的安全性和合规性,同时提高协作效率。...
确保在新环境中正确设置权限,以便用户表、视图和存储过程能够正常工作。同时,如果你在迁移过程中涉及数据,记得也要考虑数据迁移的策略,如是否需要完全复制数据,或者只保留结构。 总之,将MSSQL的用户表、视图...
当你尝试在特定用户下创建视图时,如果出现“权限不足”的错误,这通常意味着该用户没有足够的权限执行`CREATE VIEW`操作。在本例中,问题出现在`scott`用户试图创建视图时,由于权限限制导致失败。 首先,我们需要...
如何创建视图授权
对象权限与特定的数据库对象(如表、视图)相关,以下视图可用于查看这些权限: - `DBA_TAB_PRIVS`:显示所有用户对所有表的权限。 - `ALL_TAB_PRIVS`:显示当前用户可以看到的所有表的权限。 - `USER_TAB_PRIVS`:...
实验四主要涵盖三个主题:视图定义与查询、数据控制以及嵌入式SQL语言实验,所有操作都在SQL Server 2000查询分析器中进行,基于“图书读者数据库”(Book_Reader_DB)和实验二输入的数据。 1、视图定义与查询: -...
5. **处理权限和依赖关系**:如果视图有相关的权限或依赖其他对象,需要在目标数据库上重新设置这些权限和确保依赖对象的存在。 6. **关闭数据库连接**:完成迁移后,记得关闭源数据库和目标数据库的连接,以释放...
此外,还需要使用SQL语句手动创建两个视图View3和View4,其中View3与View1相同,而View4与View2条件相同。 ##### 2. 数据控制实验 **权限管理**:通过SQL Server的数据控制功能进行权限分配和回收。 - **分配权限*...
4. **权限复制**:视图通常有特定的访问控制,工具也会复制源视图的权限设置,如GRANT和REVOKE语句,确保目标视图的安全性与源视图一致。 5. **错误处理和日志记录**:在复制过程中,可能会遇到各种问题,如语法...
2. 使用`DROP VIEW`语句删除已创建的视图,其语法为`DROP VIEW 视图名`,这将永久移除视图及其相关的权限。 3. `SELECT`命令可以用于查询视图,其语法与查询基本表相同。 4. `UPDATE`, `INSERT`, `DELETE`等命令...
3. **权限管理**:通过视图,数据库管理员可以限制用户访问特定的数据子集,而无需给他们对原始表的直接访问权限。 4. **数据导出**:视图简化了数据导出过程,用户可以直接从视图中提取所需的数据。 现在,我们来...
本资源提供的"可以在月视图与周视图之间切换的calendar控件"旨在帮助开发者实现更加灵活和交互友好的日历功能。 1. 日历控件的基本概念: 日历控件(Calendar View)是Android SDK提供的一种用户界面组件,用于展示...
添加备注信息到表字段的方法与添加备注信息到表相同。我们可以使用以下语句: ```sql comment on column XXXX.YYYY is 'XXXX'; ``` 其中,XXXX 是表名,YYYY 是字段名,'XXXX' 是备注信息。 示例 以下是一个示例...
### 视图的修改与删除 要修改已存在的视图,可以使用ALTER VIEW语句;要删除视图,使用DROP VIEW语句。 ### 总结 SQL Server中的视图是数据库设计的重要工具,它提供了数据抽象、安全性、易用性等多种功能。通过...
本文将详细讲解如何在ClearCase中建立视图,这是一项基础但至关重要的操作,尤其对初学者而言。 首先,我们要理解视图在ClearCase中的意义。视图是ClearCase提供的一种机制,它允许开发者在一个定制化的环境中工作...
2. 安全性与权限控制:通过视图,数据库管理员可以限制用户对原始数据的访问。用户只能看到和操作视图所允许的部分,而不能直接访问基础表的所有内容。这在保护敏感数据和实现不同级别的访问权限方面非常有用。 3. ...
这使得视图成为数据抽象和权限控制的有效工具。 在Oracle数据库中,创建视图主要涉及以下知识点: 1. **视图定义**:视图是由SELECT语句组成的逻辑表,不包含任何实际数据,仅保存查询语句的定义。用户可以通过...
### ORACLE 数据字典与视图详解 #### 一、概述 Oracle 数据库是一个功能强大的关系型数据库管理系统,其中的数据字典与视图是管理数据库的重要组成部分。数据字典是数据库内部用来存储元数据(即关于数据的数据)的...