问题描述
嗨,汤姆,
我有一个要求如下。
我们有多个视图,我们希望在其中实现行级安全性。
我们设计了以下内容
1.一个表 (test_pred_tab),其中包含用户名,视图名称和相应的谓词。
2.调用包的触发器的日志 (包含从上表中获取谓词的过程)
在过程中,我们有查询,该查询将谓词与用户名聚合在一起,如下所示。
然后使用dbms_session.set_context,使用dbms_rls策略为查询重写设置谓词。
这里的问题是当我们尝试查询一个视图时说view3,
我得到的输出,即使其他人的谓词如下。
但是预期的o/p应该是
现在,我需要一个建议,是否有可能具有多个上下文,并仅在单个过程中基于视图名称和用户名抛出谓词。
否则,我们是否需要为每个表/视图具有单独的上下文,单独的过程,单独的策略函数。因为,我们有将近20个视图必须在其中实现安全性,并且如果使用此选项,则有5月20日上下文,20个过程 (每个视图1个)。你能告诉我这个方法吗?
我有一个要求如下。
我们有多个视图,我们希望在其中实现行级安全性。
我们设计了以下内容
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 * 策略函数,它可以使用您的表返回正确的谓词
例如,一些伪代码可能是
您可以每个表有一个策略和一个 * 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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




