ITPub博客

首页 > 应用开发 > IT综合 > 建立物化视图的权限

建立物化视图的权限

IT综合 作者:kakaxi9521 时间:2016-12-06 14:15:48 0 删除 编辑

建立物化视图的选项很多,比如刷新方式,刷新模式和是否支持查询重写等。由此涉及到的权限也比较多。而如果在建立物化视图的时候由于缺少权限而报错,ORACLE给出的错误信息仅仅是ORA-01031: 权限不足,而没有清楚的给出是由于缺少哪种权限造成的。

打算通过几篇文章综合描述建立普通的物化视图和建立各种选项的物化视图所需的权限,这篇文章主要介绍物化视图所需的最基本的权限。主要会分为三个不同的情况:基表和物化视图都是当前用户下;基表不在当前用户下;建立其他用户下的物化视图。

[@more@]

建立物化视图所需权限(一)

首先,建立一个新的测试用户,只给CREATE SESSION(保证用户可以登陆到Oracle)和UNLIMITED TABLESPACE(保证用户有足够的空间)权限进行测试。

SQL> CONN YANGTK/YANGTK@TEST4
已连接。
SQL> CREATE USER TEST IDENTIFIED BY TEST DEFAULT TABLESPACE YANGTK;

用户已创建

SQL> GRANT CREATE SESSION TO TEST;

授权成功。

SQL> GRANT UNLIMITED TABLESPACE TO TEST;

授权成功。

由于需要建立物化视图的基表,因此先给TEST用户CREATE TABLE的权限。

SQL> GRANT CREATE TABLE TO TEST;

授权成功。

SQL> CONN TEST/TEST@TEST4
已连接。
SQL> CREATE TABLE T (ID NUMBER PRIMARY KEY, NAME VARCHAR2(30));

表已创建。

SQL> CREATE MATERIALIZED VIEW MV_T AS SELECT * FROM T;
CREATE MATERIALIZED VIEW MV_T AS SELECT * FROM T
*
ERROR 位于第 1 行:
ORA-01031: 权限不足


SQL> CONN YANGTK/YANGTK@TEST4
已连接。
SQL> GRANT CREATE MATERIALIZED VIEW TO TEST;

授权成功。

SQL> CONN TEST/TEST@TEST4
已连接。
SQL> CREATE MATERIALIZED VIEW MV_T AS SELECT * FROM T;

实体化视图已创建。

建立物化视图所需权限(二)

首先,重新构造测试环境:

SQL> CONN YANGTK/YANGTK@TEST4
已连接。
SQL> DROP USER TEST CASCADE;

用户已丢弃

SQL> DROP USER MVIEW_OWNER CASCADE;

用户已丢弃

SQL> CREATE USER TEST IDENTIFIED BY TEST DEFAULT TABLESPACE YANGTK;

用户已创建

SQL> GRANT CREATE SESSION TO TEST;

授权成功。

SQL> GRANT UNLIMITED TABLESPACE TO TEST;

授权成功。

SQL> GRANT CREATE TABLE TO TEST;

授权成功。

SQL> GRANT CREATE MATERIALIZED VIEW TO TEST;

授权成功。

建立快速刷新的物化视图也是建立物化视图,必然需要建立物化视图的最基本的权限。因此,这里只讨论需要快速刷新的物化视图的特点。

第一种情况:基表在当前用户下。这种情况建立快速刷新的物化视图不需要额外的权限。如果一个物化视图需要快速刷新,则比较建立物化视图日志,而物化视图的建立需要CREATE TABLE权限。不过这个权限已经包含在建立物化视图所需的权限中了。因此,上面给了CREATE TABLE和CREATE MATERIALIZED VIEW两个权限,就可以建立快速刷新的物化视图了。

SQL> CONN TEST/TEST@TEST4
已连接。
SQL> CREATE TABLE T (ID NUMBER PRIMARY KEY, NAME VARCHAR2(30));

表已创建。

SQL> CREATE MATERIALIZED VIEW LOG ON T;

实体化视图日志已创建。

SQL> CREATE MATERIALIZED VIEW MV_T REFRESH FAST AS SELECT * FROM T;

实体化视图已创建。

下面讨论第二种情况,基表不在当前用户中:

SQL> CONN YANGTK/YANGTK@TEST4
已连接。
SQL> DROP TABLE T;

表已丢弃。

SQL> CREATE TABLE T (ID NUMBER PRIMARY KEY, NAME VARCHAR2(30));

表已创建。

SQL> CREATE MATERIALIZED VIEW LOG ON T;

实体化视图日志已创建。

SQL> GRANT SELECT ON T TO TEST;

授权成功。

SQL> CONN TEST/TEST@TEST4
已连接。
SQL> CREATE MATERIALIZED VIEW MV_T1 REFRESH FAST AS SELECT * FROM YANGTK.T;
CREATE MATERIALIZED VIEW MV_T1 REFRESH FAST AS SELECT * FROM YANGTK.T
*
ERROR 位于第 1 行:
ORA-12018: 在创建"TEST"."MV_T1" 的代码时出现以下错误
ORA-00942: 表或视图不存在


SQL> CREATE MATERIALIZED VIEW MV_T1 AS SELECT * FROM YANGTK.T;

实体化视图已创建。

现在已经可以看到快速刷新的物化视图和完全刷新的物化视图的区别了。对于完全刷新的物化视图,权限已经足够了,但是对于快速刷新的物化视图来说还差一点。

快速刷新的物化视图和完全刷新的物化视图的主要差别在于,是否需要访问物化视图日志,将用户基表的物化视图日志的查询权限授予用户:

SQL> CONN YANGTK/YANGTK@TEST4
已连接。
SQL> GRANT SELECT ON MLOG$_T TO TEST;

授权成功。

SQL> CONN TEST/TEST@TEST4
已连接。
SQL> CREATE MATERIALIZED VIEW MV_T2 REFRESH FAST AS SELECT * FROM YANGTK.T;

实体化视图已创建。

第三种情况,这种情况和上面的第二种情况差不多,也是缺少对基表的物化视图日志的查询权限。

SQL> CONN YANGTK/YANGTK@TEST4
已连接。
SQL> CREATE USER MVIEW_OWNER IDENTIFIED BY MVIEW_OWNER;

用户已创建

SQL> GRANT CREATE SESSION, UNLIMITED TABLESPACE, CREATE TABLE TO MVIEW_OWNER;

授权成功。

SQL> GRANT CREATE ANY MATERIALIZED VIEW TO TEST;

授权成功。

SQL> GRANT SELECT ON T TO MVIEW_OWNER;

授权成功。

SQL> CONN TEST/TEST@TEST4
已连接。
SQL> CREATE MATERIALIZED VIEW MVIEW_OWNER.MV_T AS SELECT * FROM YANGTK.T;

实体化视图已创建。

SQL> CREATE MATERIALIZED VIEW MVIEW_OWNER.MV_T1 REFRESH FAST AS SELECT * FROM YANGTK.T;
CREATE MATERIALIZED VIEW MVIEW_OWNER.MV_T1 REFRESH FAST AS SELECT * FROM YANGTK.T
*
ERROR 位于第 1 行:
ORA-12018: 在创建"MVIEW_OWNER"."MV_T1" 的代码时出现以下错误
ORA-00942: 表或视图不存在

相似的,将物化视图日志的查询权限授权给物化视图的拥有者就可以了。

SQL> CONN YANGTK/YANGTK@TEST4
已连接。
SQL> GRANT SELECT ON MLOG$_T TO MVIEW_OWNER;

授权成功。

SQL> CONN TEST/TEST@TEST4
已连接。
SQL> CREATE MATERIALIZED VIEW MVIEW_OWNER.MV_T1 REFRESH FAST AS SELECT * FROM YANGTK.T;

实体化视图已创建。

建立快速刷新的物化视图的关键在于物化视图日志。如果基表不在当前用户下,则用户不但需要基表的查询权限,而且需要基表的物化视图日志的查询权限。

建立物化视图所需权限(三)

一般创建ON COMMIT刷新方式的物化视图都是快速刷新的,完全刷新的ON COMMIT物化视图的意义不大,因此本文例子中使用的都是REFRESH FAST ON COMMIT方式。而是否快速刷新对权限的影响不过是增加了对基表物化视图日志的查询权限。

重新构造测试环境:

SQL> CONN YANGTK/YANGTK@TEST4
已连接。
SQL> DROP USER TEST CASCADE;

用户已丢弃

SQL> DROP USER MVIEW_OWNER CASCADE;

用户已丢弃

SQL> CREATE USER TEST IDENTIFIED BY TEST DEFAULT TABLESPACE YANGTK;

用户已创建

SQL> GRANT CREATE SESSION TO TEST;

授权成功。

SQL> GRANT UNLIMITED TABLESPACE TO TEST;

授权成功。

SQL> GRANT CREATE TABLE TO TEST;

授权成功。

SQL> GRANT CREATE MATERIALIZED VIEW TO TEST;

授权成功。

SQL> CONN TEST/TEST@TEST4
已连接。
SQL> CREATE TABLE T (ID NUMBER PRIMARY KEY, NAME VARCHAR2(30));

表已创建。

SQL> CREATE MATERIALIZED VIEW LOG ON T;

实体化视图日志已创建。

SQL> CREATE MATERIALIZED VIEW MV_T REFRESH FAST ON COMMIT AS SELECT * FROM T;

实体化视图已创建。

第一种情况不需要额外的权限,和创建物化视图的基本权限一致。

SQL> CONN YANGTK/YANGTK@TEST4
已连接。
SQL> DROP TABLE T;

表已丢弃。

SQL> CREATE TABLE T (ID NUMBER PRIMARY KEY, NAME VARCHAR2(30));

表已创建。

SQL> CREATE MATERIALIZED VIEW LOG ON T;

实体化视图日志已创建。

SQL> GRANT SELECT ON T TO TEST;

授权成功。

SQL> GRANT SELECT ON MLOG$_T TO TEST;

授权成功。

SQL> CONN TEST/TEST@TEST4
已连接。
SQL> CREATE MATERIALIZED VIEW MV_T1 REFRESH FAST AS SELECT * FROM YANGTK.T;

实体化视图已创建。

SQL> CREATE MATERIALIZED VIEW MV_T1 REFRESH FAST ON COMMIT AS SELECT * FROM YANGTK.T;
CREATE MATERIALIZED VIEW MV_T1 REFRESH FAST ON COMMIT AS SELECT * FROM YANGTK.T
*
ERROR 位于第 1 行:
ORA-01031: 权限不足

第二种情况就可以看出差别了,可以建立快速刷新的物化视图,但是建立ON COMMIT的快速刷新的物化视图就缺少权限了。

SQL> CONN YANGTK/YANGTK@TEST4
已连接。
SQL> GRANT ON COMMIT REFRESH ON T TO TEST;

授权成功。

SQL> CONN TEST/TEST@TEST4
已连接。
SQL> CREATE MATERIALIZED VIEW MV_T2 REFRESH FAST ON COMMIT AS SELECT * FROM YANGTK.T;

实体化视图已创建。

SQL> CONN YANGTK/YANGTK@TEST4
已连接。
SQL> GRANT ON COMMIT REFRESH TO TEST;

授权成功。

SQL> REVOKE ON COMMIT REFRESH ON T FROM TEST;

撤销成功。

SQL> CONN TEST/TEST@TEST4
已连接。
SQL> CREATE MATERIALIZED VIEW MV_T3 REFRESH FAST ON COMMIT AS SELECT * FROM YANGTK.T;

实体化视图已创建。

有两种授权方法,一个授予基表的ON COMMIT REFRESH权限,另一种是授予ON COMMIT REFRESH系统权限,不过第二种方法的权限比较大。

SQL> CONN YANGTK/YANGTK@TEST4
已连接。
SQL> CREATE USER MVIEW_OWNER IDENTIFIED BY MVIEW_OWNER;

用户已创建

SQL> GRANT CREATE SESSION, UNLIMITED TABLESPACE, CREATE TABLE TO MVIEW_OWNER;

授权成功。

SQL> GRANT CREATE ANY MATERIALIZED VIEW TO TEST;

授权成功。

SQL> GRANT SELECT ON T TO MVIEW_OWNER;

授权成功。

SQL> GRANT SELECT ON MLOG$_T TO MVIEW_OWNER;

授权成功。

SQL> CONN TEST/TEST@TEST4
已连接。
SQL> CREATE MATERIALIZED VIEW MVIEW_OWNER.MV_T REFRESH FAST AS SELECT * FROM YANGTK.T;

实体化视图已创建。

SQL> CREATE MATERIALIZED VIEW MVIEW_OWNER.MV_T1 REFRESH FAST ON COMMIT AS SELECT * FROM YANGTK.T;
CREATE MATERIALIZED VIEW MVIEW_OWNER.MV_T1 REFRESH FAST ON COMMIT AS SELECT * FROM YANGTK.T
*
ERROR 位于第 1 行:
ORA-01031: 权限不足

TEST用户已经具有了ON COMMIT REFRESH系统权限,但是创建物化视图仍然报错。这说明必须是物化视图的拥有者具有这个权限才可以。而创建者只需要CREATE ANY MATERIALIZED权限。

SQL> CONN YANGTK/YANGTK@TEST4
已连接。
SQL> GRANT ON COMMIT REFRESH ON T TO MVIEW_OWNER;

授权成功。

SQL> REVOKE ON COMMIT REFRESH ON T FROM TEST;

撤销成功。

SQL> CONN TEST/TEST@TEST4
已连接。
SQL> CREATE MATERIALIZED VIEW MVIEW_OWNER.MV_T1 REFRESH FAST ON COMMIT AS SELECT * FROM YANGTK.T;

实体化视图已创建。

建立物化视图所需权限(四)建立其他用户下的ON PREBUILT TABLE的物化视图。

下面依次对没种情况进行讨论:

SQL> CONN YANGTK/YANGTK@TEST4
已连接。
SQL> DROP USER TEST CASCADE;

用户已丢弃

SQL> DROP USER MVIEW_OWNER CASCADE;

用户已丢弃

SQL> CREATE USER TEST IDENTIFIED BY TEST DEFAULT TABLESPACE YANGTK;

用户已创建

SQL> GRANT CREATE SESSION TO TEST;

授权成功。

SQL> GRANT UNLIMITED TABLESPACE TO TEST;

授权成功。

SQL> GRANT CREATE TABLE TO TEST;

授权成功。

SQL> GRANT CREATE MATERIALIZED VIEW TO TEST;

授权成功。

第一种情况,建立当前用户下的支持查询重写的物化视图。

SQL> CONN TEST/TEST@TEST4
已连接。
SQL> CREATE TABLE T (ID NUMBER PRIMARY KEY, NAME VARCHAR2(30));

表已创建。

SQL> CREATE MATERIALIZED VIEW MV_T ENABLE QUERY REWRITE AS SELECT * FROM T;

实体化视图已创建。

这种情况只需要建立物化视图的基本权限,不需要额外的其他权限。

第二种情况,基表不在当前用户下:

SQL> CONN YANGTK/YANGTK@TEST4
已连接。
SQL> DROP TABLE T;

表已丢弃。

SQL> CREATE TABLE T (ID NUMBER PRIMARY KEY, NAME VARCHAR2(30));

表已创建。

SQL> GRANT SELECT ON T TO TEST;

授权成功。

SQL> CONN TEST/TEST@TEST4
已连接。
SQL> CREATE MATERIALIZED VIEW MV_T1 AS SELECT * FROM YANGTK.T;

实体化视图已创建。

SQL> CREATE MATERIALIZED VIEW MV_T1 ENABLE QUERY REWRITE AS SELECT * FROM YANGTK.T;
CREATE MATERIALIZED VIEW MV_T1 ENABLE QUERY REWRITE AS SELECT * FROM YANGTK.T
*
ERROR 位于第 1 行:
ORA-01031: 权限不足

两种授权方法,一种是给TEST用户YANGTK.T表的查询重写权限,另一种是给TEST用户GLOBAL QUERY REWRITE权限。

SQL> CONN YANGTK/YANGTK@TEST4
已连接。
SQL> GRANT GLOBAL QUERY REWRITE TO TEST;

授权成功。

SQL> CONN TEST/TEST@TEST4
已连接。
SQL> CREATE MATERIALIZED VIEW MV_T2 ENABLE QUERY REWRITE AS SELECT * FROM YANGTK.T;

实体化视图已创建。

SQL> CONN YANGTK/YANGTK@TEST4
已连接。
SQL> REVOKE GLOBAL QUERY REWRITE FROM TEST;

撤销成功。

SQL> GRANT QUERY REWRITE ON T TO TEST;

授权成功。

SQL> CONN TEST/TEST@TEST4
已连接。
SQL> CREATE MATERIALIZED VIEW MV_T3 ENABLE QUERY REWRITE AS SELECT * FROM YANGTK.T;

实体化视图已创建。

第三种情况,在其他用户下建立物化视图:

SQL> CONN YANGTK/YANGTK@TEST4
已连接。
SQL> CREATE USER MVIEW_OWNER IDENTIFIED BY MVIEW_OWNER;

用户已创建

SQL> GRANT CREATE SESSION, UNLIMITED TABLESPACE, CREATE TABLE TO MVIEW_OWNER;

授权成功。

SQL> GRANT CREATE ANY MATERIALIZED VIEW TO TEST;

授权成功。

SQL> GRANT SELECT ON T TO MVIEW_OWNER;

授权成功。

SQL> CONN TEST/TEST@TEST4
已连接。
SQL> CREATE MATERIALIZED VIEW MVIEW_OWNER.MV_T AS SELECT * FROM YANGTK.T;

实体化视图已创建。

SQL> CREATE MATERIALIZED VIEW MVIEW_OWNER.MV_T1 ENABLE QUERY REWRITE AS SELECT * FROM YANGTK.T;
CREATE MATERIALIZED VIEW MVIEW_OWNER.MV_T1 ENABLE QUERY REWRITE AS SELECT * FROM YANGTK.T
*
ERROR 位于第 1 行:
ORA-01031: 权限不足

和前几盘文章类似,这时候需要T的QUERY REWRITE权限的是MVIEW_OWNER用户而不是TEST用户。

SQL> CONN YANGTK/YANGTK@TEST4
已连接。
SQL> GRANT QUERY REWRITE ON T TO MVIEW_OWNER;

授权成功。

SQL> REVOKE QUERY REWRITE ON T FROM TEST;

撤销成功。

SQL> CONN TEST/TEST@TEST4
已连接。
SQL> CREATE MATERIALIZED VIEW MVIEW_OWNER.MV_T1 ENABLE QUERY REWRITE AS SELECT * FROM YANGTK.T;

实体化视图已创建。

支持查询重写的物化视图还存在第四种情况:建立其他用户下ON PREBUILT TABLE的物化视图。

SQL> CONN MVIEW_OWNER/MVIEW_OWNER@TEST4
已连接。
SQL> CREATE TABLE MV_T2 AS SELECT * FROM YANGTK.T;

表已创建。

SQL> CONN TEST/TEST@TEST4
已连接。
SQL> CREATE MATERIALIZED VIEW MVIEW_OWNER.MV_T2 ON PREBUILT TABLE ENABLE QUERY REWRITE AS SELECT * FROM YANGTK.T;
CREATE MATERIALIZED VIEW MVIEW_OWNER.MV_T2 ON PREBUILT TABLE ENABLE QUERY REWRITE AS SELECT * FROM YANGTK.T
ERROR 位于第 1 行:
ORA-01031: 权限不足


SQL> CONN MVIEW_OWNER/MVIEW_OWNER@TEST4
已连接。
SQL> GRANT SELECT ON MV_T2 TO TEST WITH GRANT OPTION;

授权成功。

SQL> CONN TEST/TEST@TEST4
已连接。
SQL> CREATE MATERIALIZED VIEW MVIEW_OWNER.MV_T2 ON PREBUILT TABLE ENABLE QUERY REWRITE AS SELECT * F
ROM YANGTK.T;

实体化视图已创建。

建立这种支持查询重写的ON PREBUILT TABLE物化视图,且不是在当前用户下。则创建用户必须拥有包含表的WITH GRANT OPTION的查询权限。

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/21374452/viewspace-2129848/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: JDBC connect SCAN IP
请登录后发表评论 登录
全部评论

注册时间:2009-04-13

  • 博文量
    136
  • 访问量
    179046