用例
我们在 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 | 假 |
我错过了什么?
看起来函数
isAbc()
不能在预处理语句#IF
中使用。更有可能的是,首先评估这些预处理语句,以提取要执行的实际语句列表来定义权限。
作为解决方法,您需要在
#IF
语句中编写函数代码:
#IF instr(username(),'@') > 0 and mid(username(),instr(username(),'@'),100)= '@abc.com'
...
#ENDIF