一:项目背景
1.1:cognos的两种建模工具
为了更好的满足客户的需求,提升报表展现的效率,一种建模工具已经不能满足报表开发和展现的需要。Cognos除了给我们提供了一种基于关系型数据库的建模工具Framework之外,还为我们提供了另外一种基于立方体数据的建模工具Transform。这种工具可以生产cube立方体,用户可以直接从立方体读取数据。
1.2:利用Javaproject来维护cube安全的必要性
有数据就要有安全,通常给cube设置安全就是通过在cube下面创建custom view ,然后控制custom view的权限,然后在视图里面添加角色和用户,这样角色和用户就具有了custom view的权限。但是随着分析类型和需求的增加,cube数量会多起来,用户会多起来,角色会多起来,不同角色之间的权限关系也会多起来,我们如果每次更改就需要手动的打开Transform去更改视图,这样维护起来就会很繁琐,这个时候就需要一个程序去帮我们处理这个事情,于是开发一个利用Java来修改cube权限的project就显的十分重要.
二:实现原理
2.1:可执行操作
l Java可以修改可执行mdl文件
l 利用Transform打开可执行mdl文件可以完成修改指定mdl模型权限的操作
l window批处理(.bat文件)可以调用cogtr.exe打开可执行文件并且重新生产cube
2.2:操作原理流程图
三:技术相关
3.1:数据库
数据库采用Oracle数据库,数据库操作工具PLSQL
3.2:开发工具与语言
开发工具MyEclipse 8.5 Enterprice,Java
3.3:涉及到的开发技术
JavaBean、struts2、Jquery、Ajax、Jsp
四:开发详细步骤
4.1:相关配置表详解
相关表对象的出场顺序将按照Java Project中使用到的先后顺序出场,下面列出的表都是在项目中不可缺少的,表名字根据自己的喜好来,最主要的是相关表结构.其中模型信息表、Cognos认证角色表、数据安全授权表、维度名称表是程序必须的表,区域维度表是数据仓库中的一个维度表,具体操作的时候换成具体场景中的三级以内的维度表即可
4.1.1:模型信息表
4.1.1.1表作用
保存BI项目开发中的所有cube信息,开发好后的模型文件路径,对应可执行文件的路径,生产的cube名称,以及需要添加权限的相关维度,批处理文件路径,对应的Cognos第三方认证空间id,名称等信息
4.1.1.2表结构
-- Create tablecreate table TRANSFORMMODEL( modelid NUMBER, modelname NVARCHAR2(20), modelpath NVARCHAR2(100), modeldimension NVARCHAR2(100), modelupdatefile NVARCHAR2(100), namespaceid NVARCHAR2(20), namespacename NVARCHAR2(20), batpath NVARCHAR2(50))tablespace TBS_COGNOS pctfree 10 initrans 1 maxtrans 255 storage ( initial 64K next 8K minextents 1 maxextents unlimited );-- Add comments to the columnscomment on column TRANSFORMMODEL.modelid is '模型id,主键';comment on column TRANSFORMMODEL.modelname is '模型名称,和模型中cube名称保持一致';comment on column TRANSFORMMODEL.modelpath is '模型在服务器上的绝对路径';comment on column TRANSFORMMODEL.modeldimension is '模型权限相关的维度表名称,可以是一个表,也可以是多个表,多个表之间用逗号隔开如(pdept,ptype),如果为空表示cube不设置相关数据权限,如果有维度表,则表示此cube在此维度上面做了权限控制.';comment on column TRANSFORMMODEL.modelupdatefile is '模型对应的可执行文件,执行打开此文件的操作去修改模型文件的相关权限';comment on column TRANSFORMMODEL.namespaceid is '模型所引用的用户空间id(Cognos第三方名称空间id)';comment on column TRANSFORMMODEL.namespacename is '模型所引用的用户空间名称(Cognos第三方名称空间名称)';comment on column TRANSFORMMODEL.batpath is '执行打开可执行文件并且生成cube的bat批处理文件的所在路径';
4.1.1.3数据展示
4.1.2:cognos认证角色表
4.1.2.1表作用
保存Cognos第三方认证时候的角色信息,BI项目采用的是CJAP认证方式
4.1.2.2表结构
-- Create tablecreate table ORG_ROLE( role_id VARCHAR2(60), role_code VARCHAR2(60), role_name VARCHAR2(60))tablespace TBS_COGNOS pctfree 10 initrans 1 maxtrans 255 storage ( initial 64K next 8K minextents 1 maxextents unlimited );-- Add comments to the columnscomment on column ORG_ROLE.role_id is '角色id';comment on column ORG_ROLE.role_code is '角色英文代码';comment on column ORG_ROLE.role_name is '角色中文名称';
4.1.2.3数据展示
4.1.3:数据安全授权表
4.1.3.1表作用
存储角色和数据仓库中维度表之间的授权关系,该表中配置的维度表个数和模型信息表中modeldimension 字段包含的维度表个数保持一致,cube开发过程中就应该在该表中设计角色和维度直接的授权关系,即什么角色可以访问什么维度值.
4.1.3.2表结构
-- Create tablecreate table ACCESS_TABLE( roleid NUMBER, accesstype NVARCHAR2(30), accessid_1 NUMBER, accessid_2 NUMBER, accessid_3 NUMBER)tablespace TBS_COGNOS pctfree 10 initrans 1 maxtrans 255 storage ( initial 64K next 8K minextents 1 maxextents unlimited );-- Add comments to the columnscomment on column ACCESS_TABLE.roleid is '角色id';comment on column ACCESS_TABLE.accesstype is '授权维度表的中文名称,相对的表名称可以在DIMENSION_NAME中找到';comment on column ACCESS_TABLE.accessid_1 is '一、二、三级维表的第一级';comment on column ACCESS_TABLE.accessid_2 is '一、二、三级维表的第二级';comment on column ACCESS_TABLE.accessid_3 is '一、二、三级维表的第三级';
4.1.3.3数据展示
需要注意的是,当前授权表access_table只能满足最多三级维度的权限配置,如果维度级别增加,请参照下面的结构增加accessid_n即可.
不管维度表有多少级,请保证一个roleid的行只能有一个accessid_n字段有值,因为既一级维度就对应一个值,多级维度的话如果给角色赋予了高等级的权限就不需要再给低等级的权限,同理如果要给低等级的同时就不能再给高等级的权限
a:如果维度表是一级维度,一个roleid对应的accessid_1、accessid_2、accessid_3只能是accessid_1有值,accessid_2、accessid_3一定都为空,当然一个roleid可以有多行值。
b:如果维度表是二级维度,一个roleid对应的accessid_1、accessid_2、accessid_3只能是accessid_1或者accessid_2有值,当然一个roleid可以有多行值
c:如果维度表是三级维度,一个roleid对应的accessid_1、accessid_2、accessid_3只能是accessid_1或者accessid_2或者accessid_3有值,当然一个roleid可以有多行值
4.1.4:维度名称表
4.1.4.1表作用
保存所有维度表英文名字对应的中文名称,方便在创建mdl文件的时候可以根据英文或者中文表名很方便的找到对应的翻译名称,这里的中文名称保持和模型中维度名称一致.
4.1.4.2表结构
-- Create tablecreate table DIMENSION_NAME( dimensionkey NUMBER, dimensionen NVARCHAR2(20), dimensionch NVARCHAR2(20))tablespace TBS_COGNOS pctfree 10 initrans 1 maxtrans 255 storage ( initial 64K next 8K minextents 1 maxextents unlimited );-- Add comments to the columnscomment on column DIMENSION_NAME.dimensionkey is '维度表表id';comment on column DIMENSION_NAME.dimensionen is '维度表英文名';comment on column DIMENSION_NAME.dimensionch is '维度表中文名';
4.1.4.3数据展示
4.1.5:区域维度表
4.1.5.1表作用
这里只是拿出一个数据分析中的维表作为讲解使用,程序中使用到而已,具体的维表根据自己的分析需求而定,这里就拿区域维度表来给cube中的不同角色赋权,即那些角色可以访问哪些区域,当然这里可以换成任意一个三级以内的维度表.
4.1.5.2表结构
-- Create tablecreate table PAREA( countrykey NUMBER, country NVARCHAR2(10), provincekey NUMBER, province NVARCHAR2(10), citykey NUMBER, city NVARCHAR2(10))tablespace TBS_COGNOS pctfree 10 initrans 1 maxtrans 255 storage ( initial 64K next 8K minextents 1 maxextents unlimited );-- Add comments to the columnscomment on column PAREA.countrykey is '国家key';comment on column PAREA.country is '国家';comment on column PAREA.provincekey is '省份key';comment on column PAREA.province is '省份';comment on column PAREA.citykey is '城市key';comment on column PAREA.city is '城市';
4.1.5.3数据展示
4.2:关键java程序功能说明
4.2.1:根据access_table表找出每一个roleid的所有维度表的授权信息
参照demo项目中的GetAllAccessTable(String dimensionstr)方法就可以得到该model指定维度下面的所有角色的类似下面格式的授权信息信息
10001:parea:20000,10000
10002:parea:10001,1000301
10003:parea:1000302,20000
10004:parea:10003,20000,1000101
10005:parea:10000,20001
10006:parea:10003
10007:parea:1000302
4.2.2:根据roleid对应的每一个维度表的授权信息的到filter 字符串
紧接着4.2.1然后参照demo项目中的GetFilterStr(String tablename,String filterstr)方法就可以为每一个角色每一个表得到所有授权的信息
4.2.3:去除List中对象ID一样的对象或者合并对象ID一样的value值
4.2.3.1: 去除List中对象ID一样的对象
详情参照update_customview(int modelid )中的双重for循环
4.2.3.2合并List中对象ID一样的value值
详情参照GetAllAccessTable (String dimensionstr)中的双重for循环
4.2.4:创建可执行文件之前清空之前的内容
详情参照clearfile(int modelid)方法
4.3:可执行文件格式说明
4.3.1:修改model权限的mdl文件格式说明
这里主要说一下update_customview的执行逻辑为什么要按照下面的顺序执行
打开模型文件1
↓
删除所有以角色名称命名的视图2
↓
增加管理员视图3
↓
把管理员角色加入管理员视图4
↓
SecurityObjectMake 'CAMID("Intrust:r:10000")' SecurityNamespace "Intrust"5
↓
添加所有角色视图6
↓
添加所有角色到对应的角色视图里面7
↓
增加所有视图到cube中8
↓
保存模型9
1-9我想说的就是2-4
2的代码如下面所示,作用是清空之前模型的所有权限设置,这样可以保证程序重新按照数据库最新的权限关系生产Custom view.
CustomViewDelete "管理员"
CustomViewDelete "中国大区总经理"
CustomViewDelete "信托一部经理"
CustomViewDelete "信托二部经理"
CustomViewDelete "信托三部经理"
CustomViewDelete "财务部经理"
CustomViewDelete "浙江大区经理"
CustomViewDelete "宁波分区经理"
3-4的代码如下面所示,作用是每次默认为管理员添加最高权限,这样就可以避免每次在access_table中添加管理员对应的多个维度表的值
SecurityNameSpaceMake "Intrust" SecurityNamespaceCAMID 'CAMID("Intrust")'
CustomViewMake "管理员"
SecurityObjectMake 'CAMID("Intrust:r:10000")' SecurityNamespace "Intrust"
SecurityObjectDisplayName "管理员" SecurityObjectType SecurityType_Role
CustomViewList "管理员" EndList
4.3.2:打开可执行文件的批处理文件格式说明
taskkill /f /im BIBusTKServerMain.exe
D:
cd D:\Program Files (x86)\ibm\cognos\c10\bin
"cogtr.exe" -n2 "D:\Model\TR\Intrust_update.mdl"
首先要杀掉cube的访问进程,不然刷新不了cube提示被占用
其次转到服务器的cogtr.exe目录,只有转到此目录才可以执行model的相关操作
最后执行打开mdl模型刷新cube
4.4:action执行方法逻辑
int modelid=Integer.parseInt(request.getParameter("modelid"));
qu.update_customview(modelid);//创建可执行文件
qu.executecmd(modelid);//调用bat文件去打开可执行文件和刷新cube
String createresult="success";
out = response.getWriter();
out.print(createresult);//把执行完成的结果返回给Ajax
4.5:功能展示与效果查看
4.5.1:Java project给出cube列表
4.5.2:点击更新权限,后台执行所有操作,同事提示更新成功
4.5.3:可执行文件被更新,模型文件也被更新,cube也被刷新
4.5.4:打开模型看执行的效果,赋权成功