Cognos建模工具除了Framework之外,还有一个Transform,两者的最大区别就是在于Framework是通过结构直连关系数据库的,数据根据数据仓库的变化而变化,而Transform是生产立方体,数据和最后一次执行cube时对应的数据库数据保持一致,而且如果不再次生成cube的话,最新数据永远停留在那一刻.

关于cube权限,大家都知道的就是直接打开Transform在Custom Views窗口手动的去添加Custom View →添加role/user→设置对应Custom view下对应的维度,然后通过过滤掉一些此视图不需要看到的维度值来实现权限的控制,这种方式不再多说,就是纯粹的一一手工的去添加权限,如果有100个用户或者100个角色,而且每一个用户角色的权限都是交叉相错的,针对复杂的大量的权限设置,我们手工添加就显得苍白无力了,那么如何通过mdl语句给cube添加权限呢?下面我们就来了解一下

前提条件:

1:模型格式

模型设计好之后,如果是pyj格式保存为mdl格式

1)pyi是二进制的,mdl是ASCII码的,这是为了移植。比如说我在nt平台下做得模型,要移植到unix上,pyi无法移植,mdl可以。

2)利用mdl格式可以把以前版本的文件用现在的版本打开,而新版本则不可以打开pyi格式的老文件.
3 )模型比较大的时候,PYI访问速度快,特别在编写Transformer宏的时候,比较明显
PYI可以保留数据库用户名和密码,所以通常建议,在项目中使用PYI而不是MDL,并且定期将PYI保存为MDL以防止PYI文件失效。
4)pyi格式是二进制,性能要大大的优于mdl,个人感觉十倍的速度都不止,耗费cpu和网络的资源比较少。而且,移植以后不受cognons的影响,可以正常打开,而且在服务器上生成cube的速度也要比mdl 的速度高一些。
5)mdl是ASCII码的文件,可以用文本打开,进行手工的修改,或者编辑程序对mdl进行批量处理,对于理解模型十分有用。
综述:pyi和mdl模型各有千秋,合理互补使用会给工作带来效益。推荐同时保存两种模型,并使之同步。

2:首次开发

首次开发模型只需要导入数据源,创建好维度层次,度量,cube,如下图,因为mdl语句是基于cube中现有对象进行权限控制的

Transform数据权限浅析1之mdl语句批量加载权限-LMLPHP

维度名称,cube名称在mdl语句中都是具体的对象,下面还有重要的一步操作→  Generate Categories生产维度层级,保证在赋权的时候维度层级里面是数据库里面

最新的维度信息,是否是最新信息可以再Show Diagram里面查看维度结构,之后保存mdl文件

Transform数据权限浅析1之mdl语句批量加载权限-LMLPHP

3:mdl文件相关

----3.1:文件格式举例

下面举例一个最简单的mdl文件,只有一个custom view在cube中,custom view中只授权一个角色
OpenMDL "D:\\Model\\TR\\Intrust.mdl"
SecurityNameSpaceMake "Intrust" SecurityNamespaceCAMID 'CAMID("Intrust")'
ViewMake "信托一部经理" Dimension "区域维度" ViewSecurity "信托一部经理" Filter "" Filter "" Filter ""
CustomViewMake "信托一部经理" DimensionView "区域维度" "信托一部经理"
SecurityObjectMake 'CAMID("Intrust:r:10002")' SecurityNamespace "Intrust"
SecurityObjectDisplayName "信托一部经理" SecurityObjectType SecurityType_Role
CustomViewList "信托一部经理" EndList
PowerCubeCustomViewListUpdate Cube "信托产品分析"
StartList
"信托一部经理"
ENDLIST
SaveMDL "D:\\Model\\TR\\Intrust.mdl"

----3.2:mdl代码详解

3.2.1--打开需要修改权限的文件
OpenMDL "D:\\Model\\TR\\Intrust.mdl"
3.2.2--指定cube安全的名称空间
SecurityNameSpaceMake "Intrust" SecurityNamespaceCAMID 'CAMID("Intrust")'
3.2.3--创建一个名为信托一部经理的视图,并为该视图赋权过滤掉区域维度中1000302 20000的数据
ViewMake "信托一部经理" Dimension "区域维度" ViewSecurity "信托一部经理" Filter "" Filter "" Filter ""
CustomViewMake "信托一部经理" DimensionView "区域维度" "信托一部经理"
ps:如果需要添加多个custom view,就需要写多个类似上面的语句
3.2.4--给视图信托一部经理添加角色或者用户
SecurityObjectMake 'CAMID("Intrust:r:10002")' SecurityNamespace "Intrust"
SecurityObjectDisplayName "信托一部经理" SecurityObjectType SecurityType_Role
CustomViewList "信托一部经理" EndList
ps:如果需要给该custom view添加多个role,就需要写多个类似上面的语句
3.2.5--把视图添加到cube模型中
PowerCubeCustomViewListUpdate Cube "信托产品分析"
StartList
"信托一部经理"
ENDLIST
ps:如果该cube有多个custom view,就需要在StartList和ENDLIST之间加入所有视图名称,多个视图名称之间有空格隔开.
3.2.6--保存修改权限后的模型
SaveMDL "D:\\Model\\TR\\Intrust.mdl"

----3.3:赋权关键字解释

Exclude: 把指定类别及全部下层类别都排除,既看不见,也不参加汇总。
Cloak: 把指定类别及全部下层类别都屏蔽,全都看不见,但它们参加汇总。
Suppress: 仅把本层指定的类别屏蔽,其下层类别提升。不影响其他兄弟类别,也不影响汇总。
Summarize: 把指定类别的全部下层类别屏蔽,使它们看不见,把它们的值汇总到当前类别,当前指定的类别看上去就象是处在最低层。
Apex: 以当前类别作为本维度层次构架的顶点,即只保留当前类别及其以下的部分。旁系分支全部排除,既看不见,也不参加汇总。

----3.4:赋权关键字缺失

在ViewMake的时候后面如果没有带任何赋权的参数,比如Filter、Apex的话,就表示该视图下的角色可以访问所有数据

3.4.--给视图赋权
ViewMake "信托一部经理" Dimension "区域维度" ViewSecurity "信托一部经理" Filter ""
CustomViewMake "信托一部经理" DimensionView "区域维度" "信托一部经理"
3.4.--缺失赋权操作,则此视图里面的角色可以访问所有数据
ViewMake "信托一部经理" Dimension "区域维度" ViewSecurity "信托一部经理"
CustomViewMake "信托一部经理" DimensionView "区域维度" "信托一部经理"

----3.5:赋权关键字显示区别

如果遇到一个视图中指定可以访问部门ID为1的数据则可以使用Apex "1" 来给视图赋权,如果是维度1、、、4中排除1的所有数据,这个时候就可以考虑用Filter "1"

3.5.1--Apex的缺点

如下图,通过Apex ‘1’的方式给部门维度增加custom view后,查看生成的模型如下图所示,部门下面不显示子部门,如果将部门对象拖过去,则显示信托一部,汇总的数据OK,只是显示不出来

Transform数据权限浅析1之mdl语句批量加载权限-LMLPHP

如果一个维度有多个层级,该如何赋权,比如一个区域维度:中国-浙江-杭州           层次为:国家-地区-城市的三级结构

可以分别Apex 国家key、省份key、城市key 或者  Filter国家key、省份key、城市key

Apex "10003"  10003是浙江省代码 只显示浙江省的效果是

Transform数据权限浅析1之mdl语句批量加载权限-LMLPHP

3.5.2--Filter的好处

Filter "20000" Filter "10001" Filter "10002"效果是

Transform中的效果

Transform数据权限浅析1之mdl语句批量加载权限-LMLPHP

Cognos Connection中展现效果

Transform数据权限浅析1之mdl语句批量加载权限-LMLPHP

4:执行方法

按照上面的方法编辑好mdl文件之后,保存例如为update.mdl使用Transform执行打开update.mdl的操作,在这个过程中系统就会执行update.mdl里面的语句,修改Intrust.mdl的Custom view从而实现权限控制,最后保存intrust.mdl实现修改完成操作.

5:一句话总结

在执行文件例如update.md中打开需要修改权限的mdl文件,然后通过在执行文件中添加或者修改intrust.mdl的视图来实现权限的控制.

6:更多mdl语法请参考官方文档

http://www-01.ibm.com/support/knowledgecenter/SSEP7J_10.2.2/com.ibm.swg.ba.cognos.dg_cogtr.10.2.2.doc/c_mdlverbs.html%23MDLVerbs

7:附加一个比较全面的mdl执行文件

OpenMDL "D:\\Model\\TR\\Intrust.mdl"
CustomViewDelete "管理员"
CustomViewDelete "中国大区总经理"
CustomViewDelete "信托一部经理"
CustomViewDelete "信托二部经理"
CustomViewDelete "信托三部经理"
CustomViewDelete "财务部经理"
CustomViewDelete "浙江大区经理"
CustomViewDelete "宁波分区经理"
SecurityNameSpaceMake "Intrust" SecurityNamespaceCAMID 'CAMID("Intrust")' CustomViewMake "管理员"
SecurityObjectMake 'CAMID("Intrust:r:10000")' SecurityNamespace "Intrust"
SecurityObjectDisplayName "管理员" SecurityObjectType SecurityType_Role
CustomViewList "管理员" EndList
ViewMake "中国大区总经理" Dimension "区域维度" ViewSecurity "中国大区总经理"
CustomViewMake "中国大区总经理" DimensionView "区域维度" "中国大区总经理"
ViewMake "信托一部经理" Dimension "区域维度" ViewSecurity "信托一部经理" Filter "" Filter "" Filter ""
CustomViewMake "信托一部经理" DimensionView "区域维度" "信托一部经理"
ViewMake "信托二部经理" Dimension "区域维度" ViewSecurity "信托二部经理" Filter "" Filter "" Filter ""
CustomViewMake "信托二部经理" DimensionView "区域维度" "信托二部经理"
ViewMake "信托三部经理" Dimension "区域维度" ViewSecurity "信托三部经理" Filter ""
CustomViewMake "信托三部经理" DimensionView "区域维度" "信托三部经理"
ViewMake "财务部经理" Dimension "区域维度" ViewSecurity "财务部经理" Filter ""
CustomViewMake "财务部经理" DimensionView "区域维度" "财务部经理"
ViewMake "浙江大区经理" Dimension "区域维度" ViewSecurity "浙江大区经理" Filter "" Filter "" Filter ""
CustomViewMake "浙江大区经理" DimensionView "区域维度" "浙江大区经理"
ViewMake "宁波分区经理" Dimension "区域维度" ViewSecurity "宁波分区经理" Filter "" Filter "" Filter "" Filter ""
CustomViewMake "宁波分区经理" DimensionView "区域维度" "宁波分区经理"
SecurityObjectMake 'CAMID("Intrust:r:10001")' SecurityNamespace "Intrust"
SecurityObjectDisplayName "中国大区总经理" SecurityObjectType SecurityType_Role
CustomViewList "中国大区总经理" EndList
SecurityObjectMake 'CAMID("Intrust:r:10002")' SecurityNamespace "Intrust"
SecurityObjectDisplayName "信托一部经理" SecurityObjectType SecurityType_Role
CustomViewList "信托一部经理" EndList
SecurityObjectMake 'CAMID("Intrust:r:10003")' SecurityNamespace "Intrust"
SecurityObjectDisplayName "信托二部经理" SecurityObjectType SecurityType_Role
CustomViewList "信托二部经理" EndList
SecurityObjectMake 'CAMID("Intrust:r:10004")' SecurityNamespace "Intrust"
SecurityObjectDisplayName "信托三部经理" SecurityObjectType SecurityType_Role
CustomViewList "信托三部经理" EndList
SecurityObjectMake 'CAMID("Intrust:r:10005")' SecurityNamespace "Intrust"
SecurityObjectDisplayName "财务部经理" SecurityObjectType SecurityType_Role
CustomViewList "财务部经理" EndList
SecurityObjectMake 'CAMID("Intrust:r:10006")' SecurityNamespace "Intrust"
SecurityObjectDisplayName "浙江大区经理" SecurityObjectType SecurityType_Role
CustomViewList "浙江大区经理" EndList
SecurityObjectMake 'CAMID("Intrust:r:10007")' SecurityNamespace "Intrust"
SecurityObjectDisplayName "宁波分区经理" SecurityObjectType SecurityType_Role
CustomViewList "宁波分区经理" EndList
PowerCubeCustomViewListUpdate Cube "信托产品分析"
StartList
"中国大区总经理" "信托一部经理" "信托二部经理" "信托三部经理" "财务部经理" "浙江大区经理" "宁波分区经理" "管理员"
ENDLIST
SaveMDL "D:\\Model\\TR\\Intrust.mdl"
05-04 11:25