首先,重新构造测试环境:
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-1: 在创建"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
已连接。
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-1: 在创建"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
已连接。
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的查询权限。