CREATE VIEW ORA-01031

朋友说遇到了一个奇怪的事,问能访问表,也有CREATE ANY VIEW的权限,为什么不能基于被访问的表创建视图?
而且是同一用户中有的表可以建视图,有的表不能建视图。

 

创建视图有两个条件要满足:
1.有创建视图的权限
2.当前用户有被表的所有者显示授予访问表的权限(即权限不能是通过角色继承过来的)

 

 

下面模拟一下解决过程:

 

-- 1.有访问表scott.emp的权限(此权限不是被显示授予的,是通过角色继承过来的。所以创建视图失败)


SQL> SELECT COUNT(1)  FROM scott.emp;
  COUNT(1)
----------
        13

 

-- 2. 创建视图失败


SQL> CREATE  VIEW emp  AS  SELECT * FROM scott.emp;
CREATE  VIEW emp  AS  SELECT * FROM scott.emp
ORA-01031: 权限不足

 

 

-- 3.查看当前session是否有创建视图的权限,结果表明确实有创建视图的权限(CREATE ANY VIEW)
SQL> SELECT *    FROM SESSION_PRIVS
  2   WHERE PRIVILEGE IN ('CREATE ANY VIEW', 'SELECT ANY TABLE');
PRIVILEGE
----------------------------------------
SELECT ANY TABLE
CREATE ANY VIEW

 

-- 4. 基于其他表可以创建视图,为什么呢?
SQL> CREATE OR REPLACE  VIEW s_dept  AS  SELECT * FROM scott.dept;
View created

 

SQL> CREATE OR REPLACE VIEW s_emp  AS  SELECT * FROM scott.emp;
CREATE OR REPLACE VIEW s_emp  AS  SELECT * FROM scott.emp
ORA-01031: 权限不足

 

--5 查看当前用户拥有的对象权限,发现DEPT表被显示的授予了select的权限,而emp表没有。
    为什么没有授予select权限,还能访问scott.emp表呢?

    因为当前用户拥有DBA权限。dba角色中包含了select any table的权限。
   
SQL> SELECT GRANTOR, TABLE_NAME, PRIVILEGE
  2    FROM USER_TAB_PRIVS
  3   WHERE GRANTOR = 'SCOTT';

GRANTOR         TABLE_NAME      PRIVILEGE     
---------------     ---------------       ---------------
SCOTT               DEPT                SELECT

 

--6. 知道了问题的原因,让scott用户显示授权给report用户selelct 表EMP的权限即可。

SQL> conn scott/tiger
Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.1.0
Connected as scott

 

SQL> grant select on emp to report;
Grant succeeded

 

 

SQL> conn  report/report
Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.1.0
Connected as report

 

SQL> SELECT GRANTOR, TABLE_NAME, PRIVILEGE
  2    FROM USER_TAB_PRIVS
  3   WHERE GRANTOR = 'SCOTT';

GRANTOR      TABLE_NAME      PRIVILEGE     
---------------  ---------------        ---------------
SCOTT           DEPT                  SELECT
EMP               DEPT                  SELECT

 

--7  显示授予report用户selelct权限后,视图可以成功创建。
SQL> CREATE OR REPLACE VIEW sc_emp  AS  SELECT * FROM scott.emp;
View created

 

http://blog.csdn.net/lwei_998/article/details/6326922

posted @ 2012-04-07 13:22  wbzhao  阅读(698)  评论(0编辑  收藏  举报