zoukankan      html  css  js  c++  java
  • 基于Oracle触发器的报表版本保存工具

    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下载

  • 相关阅读:
    socat + kata + cgroup
    2018-8-10-卷积神经网络全面解析
    2019-8-31-PowerShell-通过-WMI-获取系统服务
    2019-8-31-PowerShell-通过-WMI-获取系统服务
    2018-2-13-不使用数据结构反转栈
    统计难题
    Keywords Search
    [JSOI2008]最大数
    Android(java)学习笔记1:多线程的引入
    欢迎使用CSDN-markdown编辑器
  • 原文地址:https://www.cnblogs.com/interboy/p/1835941.html
Copyright © 2011-2022 走看看