架构权限中的动态角色

问题描述 投票:0回答:1

用例

我们在 icCube 中的所有角色只能访问一种客户端模式。一个用户只能拥有一个角色。但对于某些用户,我也想根据他们的电子邮件授予对 DEMO 域的访问权限。

我的尝试

考虑到DEMO域被称为“Sales(Demo)”,我尝试为每个用户角色添加以下代码:

-- Give access to the client domain
+ <specific client domain> 


+schema [Sales (Demo)]
:schema [Sales (Demo)]

create function isAbc(username_) as instr(username_,'@') > 0 and mid(username_,instr(username_,'@'),100)= '@abc.com'

#IF isAbc(username())

+cube R Sales

#ELSE

-all

#ENDIF

导致错误,为什么?

此代码因加载模式中的错误而中断:

[ROLES_UNEXPECTED_ERROR] isAbc() : [OLAP_MDX_FUNCTION_UNRESOLVED] isAbc() : the function (isAbc) does not exist location: 

在 MDX IDE 中调试

当我在 MDX IDE 中测试该功能时,它似乎可以工作:

with
   function isAbc(username_) as instr(username_,'@') > 0 and mid(username_,instr(username_,'@'),100)= '@abc.com'
   member measures.a as isAbc('[email protected]')
   member measures.b as isAbc('[email protected]')
   member measures.c as isAbc('admin')
select {a,b,c} on 0
from sales

结果:

全M
a 真实
b
c

我错过了什么?

iccube
1个回答
0
投票

看起来函数

isAbc()
不能在预处理语句
#IF
中使用。更有可能的是,首先评估这些预处理语句,以提取要执行的实际语句列表来定义权限。

作为解决方法,您需要在

#IF
语句中编写函数代码:

#IF instr(username(),'@') > 0 and mid(username(),instr(username(),'@'),100)= '@abc.com'
...
#ENDIF
© www.soinside.com 2019 - 2024. All rights reserved.