zoukankan      html  css  js  c++  java
  • CREATE VIEW ORA01031

    朋友说遇到了一个奇怪的事,问能访问表,也有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

  • 相关阅读:
    架构设计之NodeJS操作消息队列RabbitMQ
    如何搭建一个功能复杂的前端配置化框架(一)
    Web as a App(Web既APP)的概念可以提出吗?
    Bottle源码阅读笔记(二):路由
    Bottle源码阅读笔记(一):WSGI
    Python__slots__详解
    [译]如何在Web开发中使用Python
    C#中Internal关键字的总结
    [DataContract]引用
    分享一个与ABP配套使用的代码生成器源码
  • 原文地址:https://www.cnblogs.com/wbzhao/p/2435892.html
Copyright © 2011-2022 走看看