问题描述
实现BIEE分析报表的数据权限控制
前提条件
- 数据权限控制通过BIEE中应用程序角色和公司代码的映射实现,可以控制某个角色能访问哪些公司的数据
- 角色和公司代码是多对多的关系
解决方法
因为角色和公司代码是多对多的关系,由一个角色从表中取出的公司代码是多行记录,这时我们用普通变量是不合适的,所以采用row-wise变量来实现对数据权限的控制
创建row-wise变量
- 联机打开资料库
- 进入管理->变量
- 右键点击创建初始化块
- 进入初始化块,输入数据初始化块名称
- 点击编辑数据源.
- 输入获取角色对应公司段的sql,选择连接池
注意:
-
获取当前登陆用户的角色的语法是
‘VALUEOF(NQ_SESSION.ROLES)’, 别忘了加引号 -
由于一个用户有多个角色,需要解析角色的字符串
-
在SELECT 语句中第一列必须是一个字符串,这个字符串就是row-wise变量名,后面用这个字符串引用row-wise变量,第二列是实际的公司代码。例如下面的示例sql中
SELECT 'COMPANY_CODE',
a.org_code
COMPANY_CODE是row-wise变量名,a.org_code是角色对应的公司代码
-示例sql如下
WITH roles AS
(
SELECT TRIM(regexp_substr(q.nums,
'[^;]+',
1,
rownum,
'i')) role
FROM (SELECT REPLACE(REPLACE('VALUEOF(NQ_SESSION.ROLES)',
'(',
''),
')',
'') nums
FROM dual) q
CONNECT BY rownum <=
length(q.nums) - length(regexp_replace(q.nums,
';',
'')) + 1)
SELECT 'COMPANY_CODE',
a.org_code
FROM (SELECT o.org_code
FROM bi_sys_role_access r
WHERE role_code IN (SELECT ROLE
FROM roles)
UNION ALL
SELECT 'X'
FROM dual) a
- 点击测试,测试sql是否正确,确认正确后点击确定
- 这时回到初始化块界面,点击编辑数据目标
9. 选择行范围初始化,点击确定
10. 单击确定按钮保存新建的初始化块
11 检入所做的更改,注意在给应用角色分配权限前一定要检入更改,并且测试初始化块要有数据(如果因条件限制测试时无结果集,可以适当修改下查询条件,测试时有数据,否则在分配权限用到变量时会出现没有定义变量的错误)
应用程序角色分配权限
-
进入管理->身份,点击应用程序角色分页
-
双击要分配权限的角色
-
点击权限按钮
-
进入数据过滤器分页,点击+
-
选择要添加过滤器的对象,事实表和维表都可以
-
点击编辑过滤器按钮,编辑过滤器
-
过滤器中引用row-wise变量
VALUEOF(NQ_SESSION.COMPANY_CODE)