首先,重新构造测试环境:
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;
实体化视图已创建。
第三种情况,这种情况和上面的第二种情况差不多