冯东的博客

每天学一点,不断进取
posts - 86, comments - 324, trackbacks - 8, articles - 4
  博客园 :: 首页 :: 新随笔 ::  :: 订阅 订阅 :: 管理

2010年9月26日

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

posted @ 2010-09-26 13:45 冯东 阅读(64) 评论(0) 编辑

Cognos配置过程中经常会遇到由于CSK配置的问题导致启动失败,我这里试了一下,不敢保证一定能把所有的问题都解决。
先说一下我对CSK的理解
ApplicationServer和cm通信的凭证,若Application Server配置的密码与CM配置的密码不一致,那么Application Server就没法注册到CM上。
本地的配置文件cogstartup.xml存储的密码信息都是加密的,而密文是根据CSK的配置生成的。(具体怎么生成的还不清楚)。
我在试验过程中更换jdk(1.6)没有重现那个问题。我觉得重建CSK应该是可以解决一些问题,可以通过删除文件夹或者删除Security->cryptography->Cognos(默认名称)来重建,两个没有区别,我这里演示通过删除文件夹来重建CSK。步骤如下
将c8_location\configuration文件夹下的csk、encryptkeypair、signkeypair文件夹删除(新建一个文件夹,将他们挪过去)
启动Cognos Configuration,点击保存按钮,此时报错,如下图

[Validation]
1. [ ERROR ] CAM-CRP-1064 Unable to process the PKCS #7 data because of an internal error. Unable to find an appropriate common symmetric key to decrypt the data.
The parameter named 'Shared secret' located in 'Portal Services' is currently invalid.
2. [ ERROR ] CAM-CRP-1064 Unable to process the PKCS #7 data because of an internal error. Unable to find an appropriate common symmetric key to decrypt the data.
The parameter named 'Bind user DN and password' located in 'ldap' is currently invalid.
3. [ ERROR ] CAM-CRP-1064 Unable to process the PKCS #7 data because of an internal error. Unable to find an appropriate common symmetric key to decrypt the data.
The parameter named 'User ID and password' located in 'Content Store' is currently invalid.
4. [ ERROR ] CAM-CRP-1064 Unable to process the PKCS #7 data because of an internal error. Unable to find an appropriate common symmetric key to decrypt the data.
The parameter named 'Account and password' located in 'Notification' is currently invalid.

我们看这里面所提示的错误信息都是涉及到用户名和密码的部分,这是因为删除了CSK之后需要重新对这写信息进行加密,而以前的用户名密码是按照之前的csk加密存储的,所以必须重新配置一下这些密码。
如日志提示我的配置当中有4个地方修要修改,不知道密码的属性点击编辑框然后直接点击OK按钮即可。
Enviroment-> Portal Services下的Shared secret点击编辑框,直接点击OK
Security ->Authentication->ldap下的Bind user DN and password,点击编辑框,直接点击OK。
Data Access->Content Manager下的Content store配置的用户名密码,我们需要重新输入一遍
Notification中的Account and password属性,点击编辑框,然后点击OK。
然后点击保存,会出现
下面的提示

点击YES继续,会输出下面的错误信息。

不用担心,我们再次启动cognos这是在Generating cryptographic information时间会稍微长一点。然后就是正常的启动日志

posted @ 2010-09-26 13:30 冯东 阅读(142) 评论(0) 编辑

有些报表是不包含钻取功能,但是点击右键会弹出右键菜单,有些客户就比较反感这个。下面的这个方法可以屏蔽掉cognos报表的右键菜单
在报表中增加一个HTML项,然后将下面的内容拷贝到里面
<script>
function getObjectName()
{
    return document.getElementById("cv.id").value;
}
function disableRightClick()//禁用右键弹出菜单
{
    var objName = getObjectName();
    eval("oCV" + objName + ".bCanUseCognosViewerContextMenu = false;");
}
disableRightClick();
</script>
此方法在8.3和8.4两个版本上测试通过。

posted @ 2010-09-26 13:23 冯东 阅读(114) 评论(0) 编辑