壹佰网|ERP100 - 企业信息化知识门户

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1928|回复: 10

[人力] 安全性配置文件-->自定义安全性问题

[复制链接]
发表于 2012/2/22 16:20:04 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。如果您注册时有任何问题请联系客服QQ: 83569622  。

您需要 登录 才可以下载或查看,没有帐号?注册

x
本帖最后由 zackchen 于 2012/2/22 16:34 编辑

我需要要设置一个安全性配置文件,限制用户能够访问的员工类型,根据帮助文档中说的,设置好配置文件会生成类似这样的SQL
select 1
  from per_all_assignments_f    ASSIGNMENT,
       per_all_people_f         PERSON,
       per_person_type_usages_f PERSON_TYPE
where ASSIGNMENT.assignment_id = :asg_id
   and :effective_date between ASSIGNMENT.effective_start_date and
       ASSIGNMENT.effective_end_date
   and PERSON.person_id = ASSIGNMENT.person_id
   and :effective_date between PERSON.effective_start_date and
       PERSON.effective_end_date
   and PERSON.person_id = PERSON_TYPE.PERSON_ID
   and :effective_date between PERSON_TYPE.effective_start_date and
       PERSON_TYPE.effective_end_date
   and {your custom where clause fragment goes here}
那么在客户化的SQL中可以用到的表有"ASSIGNMENT"、"PERSON"、"PERSON_TYPE"
但是当我用PERSON_TYPE.person_type_id后,点击校验提示:"PERSON_TYPE"."PERSON_TYPE_ID":无效的标识符。
自定义安全性SQL如下:
person_type.person_type_id in (
  select t1.person_type_id
    from per_person_types t1, per_person_types_tl t2
   where t1.person_type_id = t2.person_type_id
     and t2.language = 'ZHS'
     and t2.user_person_type in ('长期员工', '非员工')
     and t1.business_group_id = 0
)
错误截图如下:
QQ截图1.jpg
之后改用其他方法做安全性控制,校验通过了,但是在查询安全性视图的时候报错。
自定义安全性SQL如下
person.person_id in (
select t1.person_id
  from per_people_f             t1,
       per_person_type_usages_f t2,
       per_person_types         t3,
       per_person_types_tl      t4
where t1.PERSON_ID = t2.person_id
   and :effective_date between t1.effective_start_date and t1.effective_end_date
   and t2.person_type_id = t3.person_type_id
   and t3.person_type_id = t4.person_type_id
   and :effective_date between t2.effective_start_date and t2.effective_end_date
   and t4.language = 'ZHS'
   and t4.user_person_type in ('长期员工', '非员工')
    and t3.business_group_id = 0
)
错误截图如下
QQ截图2.jpg


请各位高手指教,谢谢

 楼主| 发表于 2012/2/22 16:42:32 | 显示全部楼层
后来又尝试修改:effective_date为sysdate发现可以控制安全性,但是怎么使用系统的有效时间,而不是固定的时间呢。
 楼主| 发表于 2012/2/23 10:29:52 | 显示全部楼层
等待中!!!
发表于 2012/2/23 10:37:42 | 显示全部楼层
下面两种方式都可以:
exists(
select 1
from Per_Person_Types Ppt, Per_Person_Type_Usages_f Pptuf
where PERSON.Person_Id = Pptuf.Person_Id
and trunc(sysdate) between pptuf.effective_start_date and pptuf.effective_end_date
and Ppt.System_Person_Type = 'EMP'
And Ppt.Person_Type_Id = Pptuf.Person_Type_Id
AND Ppt.User_Person_Type in ('xx员工')
)
-----------------------
PERSON.PERSON_ID IN(
select person_id
from Per_Person_Types Ppt, Per_Person_Type_Usages_f Pptuf
where PERSON.Person_Id = Pptuf.Person_Id
and trunc(sysdate) between pptuf.effective_start_date and pptuf.effective_end_date
and Ppt.System_Person_Type = 'EMP'
And Ppt.Person_Type_Id = Pptuf.Person_Type_Id
AND Ppt.User_Person_Type in ('xx员工')
)
日期的问题有时间我再研究下,先参考sysdate这种

发表于 2012/2/23 10:42:31 | 显示全部楼层
sysdate between t1.effective_start_date and t1.effective_end_date 应该是这样写的。effective_start_date and effective_end_date shi是这个人本身的有效时间,逻辑是用系统当前时间sysdate来作为判断。看在不在这个有效时间内
 楼主| 发表于 2012/2/23 12:44:23 | 显示全部楼层
o5591673 发表于 2012/2/23 10:42
sysdate between t1.effective_start_date and t1.effective_end_date 应该是这样写的。effective_start_da ...

我希望是用系统的有效时间,而不是固定的使用sysdate,比如在帮助文档中对人员表历史记录限制用的:effective_date,但是在自定义的安全性中却不能用这个:effective_date,不知道是什么原因,或者说Oracle的帮助文档有问题
 楼主| 发表于 2012/2/23 12:45:21 | 显示全部楼层
另外一个问题就是,在自定义安全性中能不能用person_type,有没人用过,指点一下
 楼主| 发表于 2012/2/24 17:18:14 | 显示全部楼层
可以通过这种方式实现获取有效日期:
exists (
select 1
  from per_person_type_usages_f t1,
       per_person_types         t2,
       per_person_types_tl      t3,
       fnd_sessions f
where PERSON.person_id = t1.person_id
   and t1.person_type_id = t2.person_type_id
   and t2.person_type_id = t3.person_type_id
   and f.effective_date between t1.effective_start_date and
       t1.effective_end_date
   and t3.user_person_type in ('长期员工', '非员工')
   and t2.business_group_id = 0
   and f.session_id = userenv('sessionid')
)
这种方法在EBS中用是没有问题的,但是我们现在的系统是EBS的外围系统,用了EBS的安全性视图,没有办法通过session来获取effective_date,走过路过的帮忙看看,有没有什么解决办法{:soso_e140:}
发表于 2012/6/1 16:57:17 | 显示全部楼层
求这个安全性配置文件设置的详细文档,哪位大师有,共享一下啊。
 楼主| 发表于 2012/6/4 08:59:51 | 显示全部楼层
码砖头的人 发表于 2012/6/1 16:57
求这个安全性配置文件设置的详细文档,哪位大师有,共享一下啊。

EBS自带帮助文档还有有一定参考价值的,可以先看看那个
发表于 2012/11/12 10:32:40 | 显示全部楼层
在项目中验证。
EXISTS (SELECT 1
          FROM per_person_types_v       pt,
               per_person_type_usages_f pu
         WHERE 1 = 1
           AND pt.person_type_id = pu.person_type_id
           AND person.person_id = pu.person_id
           AND person.effective_start_date BETWEEN pu.effective_start_date AND pu.effective_end_date
           AND pt.user_person_type = '人员类型')
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|Archiver|小黑屋|手机版|壹佰网 ERP100 ( 京ICP备19053597号-2 )

Copyright © 2005-2012 北京海之大网络技术有限责任公司 服务器托管由互联互通
手机:13911575376
网站技术点击发送消息给对方83569622   广告&合作 点击发送消息给对方27675401   点击发送消息给对方634043306   咨询及人才点击发送消息给对方138011526

GMT+8, 2025/11/29 16:17 , Processed in 0.022898 second(s), 17 queries , File On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表