CREATE VIEWORA-01031

    技术2022-05-20  35

    朋友说遇到了一个奇怪的事,问能访问表,也有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.empORA-01031: 权限不足

     

     

    -- 3.查看当前session是否有创建视图的权限,结果表明确实有创建视图的权限(CREATE ANY VIEW)SQL> SELECT *    FROM SESSION_PRIVS  2   WHERE PRIVILEGE IN ('CREATE ANY VIEW', 'SELECT ANY TABLE');PRIVILEGE----------------------------------------SELECT ANY TABLECREATE 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.empORA-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/tigerConnected 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/reportConnected 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                  SELECTEMP               DEPT                  SELECT

     

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

    SQL>


    最新回复(0)