暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 同一包中不同谓词的多个视图的行级安全性

askTom 2018-01-16
295

问题描述

嗨,汤姆,
我有一个要求如下。
我们有多个视图,我们希望在其中实现行级安全性。

我们设计了以下内容
1.一个表 (test_pred_tab),其中包含用户名,视图名称和相应的谓词。

 username     view_name         sql_predicate   
        emp1          view1               id=10
        emp2          view2               id=20 
        emp2          view3               id=5
        emp3          view1               id=30          


2.调用包的触发器的日志 (包含从上表中获取谓词的过程)


在过程中,我们有查询,该查询将谓词与用户名聚合在一起,如下所示。


   SELECT listagg(test_pred_tab.sql_predicate,' OR ') WITHIN GROUP ( ORDER BY NULL) into l_pred FROM test_pred_tab  
     WHERE username = l_user;




然后使用dbms_session.set_context,使用dbms_rls策略为查询重写设置谓词。



这里的问题是当我们尝试查询一个视图时说view3,

 select * from view2; 


我得到的输出,即使其他人的谓词如下。

 select * (select * from view3 where id=20 OR id=5) ;  


但是预期的o/p应该是

 select * from view3 where id=5;  



现在,我需要一个建议,是否有可能具有多个上下文,并仅在单个过程中基于视图名称和用户名抛出谓词。

否则,我们是否需要为每个表/视图具有单独的上下文,单独的过程,单独的策略函数。因为,我们有将近20个视图必须在其中实现安全性,并且如果使用此选项,则有5月20日上下文,20个过程 (每个视图1个)。你能告诉我这个方法吗?

专家解答

策略旨在 * 定义 * 一次,而不是在人们登录时动态分配。

您可以每个表有一个策略和一个 * single * 策略函数,它可以使用您的表返回正确的谓词

例如,一些伪代码可能是

function rls_examp( p_own in varchar2, p_obj in varchar2 ) return varchar2 as
begin
  select predicate
  into   l_pred
  from   my_table
  where  username = sys_context('userenv','session_user')
  and    view_name = p_obj;
  return l_pred;
exception
  when no_data_found then  
  return '1=0';
end;


「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论