cognos本身沒有版本控制工具,frameworkmanager和transformer的專案檔可以藉助於cvs\svn等版本控制工具開控製版本,但是所有的報表都是存在content store裡的,如果那張報表一不小心被誤改或者刪除了,那就是永久的了。如果之前沒有備份的話那麼這樣報表就永遠的消失了。
前一段時間研究了一下content store,知道所有的報表定義都儲存在cmobjprops7這張表中,我就在想是不是可以利用觸發器捕獲更新刪除等操作,將之前的報表定義儲存下來呢?所以我就在oracle上建了一張表cmobjversion,一個觸發器cmrep_tr,一個方法getCmObjPath。其中觸發器是針對錶cmobjprops7,當它發生更新或者刪除操作時,先擷取之前的報表定義,並調用getCmObjPath擷取報表格儲存體路徑,儲存到cmobjversion表中。
create table CMOBJVERSION
(
MODIFYDATE DATE,
SPEC CLOB,
ACTION VARCHAR2(32),
REPORTPATH NVARCHAR2(1000)
);
comment on column CMOBJVERSION.MODIFYDATE is '修改時間';
comment on column CMOBJVERSION.SPEC is '報表定義';
comment on column CMOBJVERSION.ACTION is '動作(刪除、修改)';
comment on column CMOBJVERSION.REPORTPATH is '報表格儲存體路徑';
/
create or replace function getCmObjPath(id in number) return varchar2 is
Result varchar2(4000);
pcmid number;
cid number;
cmname varchar2(4000);
begin
/*
作者:interboy
說明:該函數傳入報表的cmid,返回報表的路徑
*/
cid := id;
loop
select a.pcmid, b.NAME
into pcmid, cmname
from cmobjects a, cmobjnames b
where a.cmid = b.CMID and b.ISDEFAULT =1
and a.cmid = cid;
cid := pcmid;
Result := cmname||'/'||Result;
exit when pcmid = 0;
end loop;
return(substr(Result,0,length(Result)-1));
end getCmObjPath;
/
create or replace trigger cmrep_tr
before delete or update on cmobjprops7
for each row
begin
/*
作者:interboy
說明:該觸發器實現了報表儲存和刪除時將之前的報表格儲存體到cmobjversion表中,以達到版本儲存的目的
*/
if :old.spec is not null then
case
when updating then
insert into cmobjversion
(reportpath, modifydate, spec, action)
values
(getcmobjpath(:old.cmid), sysdate, :old.spec, 'update');
when deleting then
insert into cmobjversion
(reportpath, modifydate, spec, action)
values
(getcmobjpath(:old.cmid), sysdate, :old.spec, 'delete');
end case; end if;
end cmrep_tr;
/
執行上述指令碼後,報表發生更新,或者刪除時上一個報表定義會被儲存到cmobjversion表的spec欄位中。以前有個哥們就問過報表被誤刪除了,怎麼還原。因為他沒有做好備份,所以沒辦法恢複。
恢複的步驟
1.找到對應的報表定義,將其拷貝到ultraEdit裡,另存新檔XML檔案,注意編碼要設為UTF8格式
2.用reportstudio開啟本地報表,儲存
指令檔和示範的視頻已經發到論壇裡,有興趣的可以到http://www.cognoschina.net/club/thread-7582-1-1.html下載