如何在Oracle中添加策略,使用户可以从表中选择所有数据,并且只能在有条件的情况下插入,更新,删除其数据

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

我有这样的对象名称。 将dbms_rls上的执行授予公共; 创建表的星期二 ( EmpNo号(5), 名称nvarchar2(60), 假期日期 ); 插入到星期二值(1,'HANN','02-JAN-2019'); 插入到星期二值(2,'ANNU','12-MAY-2019'); 插入到星期二值(3,'THEOTA','26-AUG-2019');

我创建了3个用户:HANN,ANNU,THEOTA 我想为这些用户建立VPD策略: + ANNU仅可以选择和修改她的数据。 + THEOTA无法选择和修改任何数据。 + HANN可以选择所有数据,但只能在“假日”列中修改(插入,删除,更新)日期大于当前日期的日期(无法修改零件中的日期)

这是我到目前为止所做的:

创建由123456标识的用户HANN; 创建由123456标识的用户ANNU; 创建由123456标识的用户THEOTA; 创建角色emp; 授予与emp的连接; 向emp授予创建会话; 将emp授予HANN; 将emp授予ANNU; 将emp授予THEOTA; 授予选择权,更新,删除,插入到ANNU; 删除函数Annu_Theota; -创建功能 创建或替换函数Annu_Theota(p_schema varchar2,p_obj varchar2) 返回varchar2为 l_user varchar2(20); 开始 l_user:= SYS_CONTEXT('userenv','SESSION_USER'); 如果(l_user ='ANNU')然后 返回“名称=” || ” || l_user || ''; elsif(l_user ='THEOTA')然后 返回'1 = 0'; 万一; 结束Annu_Theota;

开始 dbms_rls.add_policy (object_schema =>'trongdat' ,object_name =>'empholiday' ,policy_name =>“假日控制” ,policy_function =>“ Annu_Theota_Hann” ,statement_Types =>'SELECT,UPDATE,INSERT,DELETE' ); 结束;

我不知道如何为该用户HANN应用合适的策略。任何人都可以提出一些想法。

oracle security policy vpd
1个回答
0
投票

鉴于需求的粒度级别-列级别,即-您应该考虑不允许直接更新表,而应使用PL / SQL函数作为API层来执行更新。

例如,使用以下过程创建名为empholiday_pkg的PL / SQL包:

  • get_data:用于从表中选择行的流水线函数
  • ins_data:在表中插入行的过程
  • upt_data:将更新应用于表的过程
  • del_data:从表中删除行的过程

而不是直接向用户授予表上的“选择,插入,更新,删除”,而是授予他们对该程序包的执行权限。然后,在软件包的PL / SQL中包括您需要的任何业务逻辑-限制它们可以根据角色或其他用户特征来修改哪些列。]

用户随后将调用该程序包以获取数据或进行更改:

select * from empholiday_pkg.get_data();

execute empholiday_pkg.ins_data([put your parameters here]);

begin
    empholiday_pkg.upt_data([put your parameters here]);
    commit;
end;

如果要分别控制对过程的访问,请为每个过程创建单独的单例程序包。使用软件包而不是独立过程可以使您将PL / SQL代码包装在软件包主体中,以确保安全。授予程序包执行权限仅允许用户查看数据字典中的程序包标头,在该数据字典中将完全暴露独立过程。

另一个建议:不要在包过程本身中放入“提交”命令-就像以前使用独立的插入/更新/删除命令那样处理,以便每个用户都可以管理其事务,或者这样您就可以在基本表DML包的顶部构建更大的API。

[Bryn Llewellyn的“ Guarding Your Data Behind a Hard Shell PL/SQL API”中提供了有关此技术的完整文章。

© www.soinside.com 2019 - 2024. All rights reserved.