假定有一张按地区和国家显示雇员名字的报表。我们需要在这张报表应用数据安全,使用户仅能看到自己所在国家的数据。假定我们已经在Cognos服务器上定义和了合适的组,组内已经添加了合适的用户。
此例,我把自己的账户添加到一个名为China的组内。
准备工作…
使用GO Data Warehouse (Query)数据包创建一张列表。
如何实施…
1. 展开HR(query)->Employee Summary (query)->Employee by region拖拽Branch region, Country, 和 Employee name到列表上作为列表的列。
2. 转至列表对应的查询,从Toolbox窗体中拖拽一个Filter控件到Detail Filters工作区。
3. 定义此filter为:
[Country] in (#CSVIdentityNameList(',')#)
4. 运行并测试报表。可以验证,用户只可以看到自己所属的国家的数据。
工作原理…
此例我们使用了名为CSVIdentityNameList的宏函数。此函数返回运行报表用户的用户名以及所属的所有组和角色。因此,当我运行报表时,过滤[Country] in (#CSVIdentityNameList(',')#)返回了我所属的组,也就是China对应的数据。此宏函数接受使用一个字符作为返回值的分隔符。此处,我使用(,)作为返回值的分隔符。
如果用户属于多个组,他将看到每个组对应数据的并集。
更多…
这个方法有其局限性:所有的用户名不能和国家同名。假定有一个用户Spain,属于组China。显然运行报表时,报表会同时返回China和Spain的数据。因此,如果想使用这个方法进行权限控制,那么必须首先应用一个用户命名规范,确保不会有上述问题发生。