这篇文章讨论以ON COMMIT模式刷新的物化视图所需权限。
和前两篇文章一样,仍然是分为三种情况讨论:基表在当前用户下;基表不在当前用户下;在其他用户下建立物化视图。
一般创建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 COMMIT物化视图比普通物化视图多了一个ON COMMIT REFRESH权限。