9

我正在尝试创建每 5 分钟自动更新一次的物化视图,我需要根据 Mview 日志表进行更新。

我在 TABLE1 TABLE1.SQL 脚本上创建了物化视图日志

CREATE MATERIALIZED VIEW LOG ON TABLE1;   -- MLOG$_TABLE1

然后我创建了物化视图

CREATE MATERIALIZED VIEW JIBO_MVIEW 
REFRESH START WITH SYSDATE NEXT SYSDATE +5/24/60 
ENABLE QUERY REWRITE AS
      SELECT O.ID
            ,O.DATETIME_CREATED
            ,O.ORIGINATOR
            ,O.DETAILS
            ,O.PAYMENT_REF
        FROM TABLE1 O
       WHERE O.ORIGINATOR LIKE '53%';

改变一些值后在 TABLE1 中,插入新记录 MLOG$_TABLE1 日志表

在此处输入图像描述

但更改的值不会在实体化视图 (JIBO_MVIEW) 中更新。(即使在一天之后:))

当我在警报日志中检查时,自动生成的 DBMS_JOB 存在问题,每次执行都会失败。

 - ORA-12012: error on auto execute of job 4263
 - ORA-00942: table or view does not exist
 - ORA-06512: at "SYS.DBMS_SNAPSHOT", line 2809
 - ORA-06512: at "SYS.DBMS_SNAPSHOT", line 3025
 - ORA-06512: at "SYS.DBMS_IREFRESH", line 689
 - ORA-06512: at "SYS.DBMS_REFRESH", line 195 - 
 - ORA-06512: at line 1

但如果我手动执行作业,它就可以了。这是代码示例

BEGIN DBMS_REFRESH.REFRESH('"JIBO"."JIBO_MVIEW"');
COMMIT;
END; 

然后我向用户添加了新的授权

GRANT CREATE SESSION, CREATE TABLE, CREATE VIEW, CREATE MATERIALIZED VIEW TO JIBO; 
GRANT CREATE ANY TABLE TO JIBO WITH ADMIN OPTION;
GRANT UNLIMITED TABLESPACE TO JIBO;
GRANT SELECT ON SCHEMA1.MLOG$_TABLE1 TO JIBO WITH GRANT OPTION;
GRANT ALL ON SCHEMA1.TABLE1 TO JIBO WITH GRANT OPTION;

现在我在作业自动执行时收到此错误

 - ORA-12012: error on auto execute of job 4287
 - ORA-01031: insufficient privileges
 - ORA-06512: at "SYS.DBMS_SNAPSHOT", line 2809
 - ORA-06512: at "SYS.DBMS_SNAPSHOT", line 3025
 - ORA-06512: at "SYS.DBMS_IREFRESH", line 689
 - ORA-06512: at "SYS.DBMS_REFRESH", line 195
 - ORA-06512: at line 1

请指导我解决这个问题。这个问题是由于错误地创建了物化视图,还是由于 oracle 中的某些参数应该打开?

4

4 回答 4

4

我不确定,但问题可能在于 MV 的刷新作业创建。试试这个查询。

select * from user_jobs where what like 'dbms_refresh.refresh%';列的值是BROKEN多少?

select * from user_snapshot_refresh_times; 看看这个 select * from V$PARAMETER where name = 'job_queue_processes' 参数值,是不是可以,没有超出。

于 2017-04-12T12:52:23.617 回答
2

您可以通过创建如下刷新组让 Oracle 自行管理刷新作业

exec DBMS_REFRESH.MAKE(name => 'MY_RG', list => 'JIBO_MVIEW', next_date => SYSTIMESTAMP, interval => 'SYSTIMESTAMP + Interval ''5'' minute');

之后,您可以使用检查刷新组的状态

select * from user_refresh;
于 2017-05-18T11:43:48.337 回答
1

您好,这里有一些一般提示可能会帮助您解决权限问题(表或视图不存在)。

授予创建任何表,CREATE MATERIALIZED VIEW 给 MV_USER,其中 MV_USER 是 MATERIALIZED VIEW 的 OWNER。

以相同的 MV_USER 身份连接。

然后做你的 CREATE MATERIALIZED VIEW。

要修复损坏的工作,请以 MV_USER(MV 的所有者)身份连接。

然后运行:

set serveroutput on size 1000000                                         
declare                                                                  
v_mview VARCHAR2(30);                                                    
v_run   VARCHAR2(100);                                                
v_job number;                                                            
cursor user_mviews_c is                                                  
select mview_name from user_mviews ;                                     
cursor user_jobs_c is                                                    
select job from user_jobs ;                                              
begin                                                                    
open user_mviews_c;                                                      
loop                                                                     
   fetch user_mviews_c into v_mview;                                     
   exit when user_mviews_c%notfound;                                     
   v_run := 'exec DBMS_MVIEW.REFRESH ('''||v_mview||''',''C'');';        
   dbms_output.put_line(v_run);                                          
end loop;                                                                
close user_mviews_c;                                                     
open user_jobs_c;                                                        
loop                                                                     
   fetch user_jobs_c into v_job;                                         
   exit when user_jobs_c%notfound;                                       
   v_run := 'exec DBMS_JOB.RUN ('||v_job||');';                          
   dbms_output.put_line(v_run);                                          
end loop;                                                                
close user_jobs_c;                                                       
end;                                                                     
/                                                                        
于 2017-05-02T09:13:42.657 回答
0

在类似的设置中,我已授予对sys以下所有对象的执行权限。也许这会解决你的问题。

DBMS_DEFER_SYS,  
DBMS_SNAPSHOT,  
DBMS_SNAP_REPAPI,  
DBMS_REPCAT_DECL,  
DBMS_DEFER_QUERY,  
DBMS_REPCAT_UTL,  
DBMS_DEFER_INTERNAL_QUERY,  
DBMS_DEFER_INTERNAL_SYS,  
DBMS_REPCAT_UNTRUSTED,  
DBMS_OFFLINE_SNAPSHOT,  
DBMS_REPCAT,  
DBMS_INTERNAL_REPCAT,  
DBMS_REPCAT_RPC,  
DBMS_RECTIFIER_DIFF,  
DBMSOBJGWRAPPER,  
DBMS_REPCAT_RGT,  
DBMS_OFFLINE_OG 
于 2017-05-24T08:18:05.740 回答