我们的管理员要求从特定用户(user3)隐藏数据库中最常用的表(oracle 11g)中的某些行,我们尝试使用行级安全性(RLS)包一个简单的函数如下所示,它在我们测试的场景中工作正常。我的问题是:
此解决方案是否适用于我们的目的?
如果在复杂视图中使用此表,数据库是否会隐藏视图结果中的特定行?
这是一种很好的做法还是有效的方式?
此解决方案是否会将性能影响到关键级别?
将由RLS政策调用的函数:
CREATE OR REPLACE FUNCTION test_rls_policy(
schema_var IN VARCHAR2,
table_var IN VARCHAR2
)
RETURN VARCHAR2
IS
return_val VARCHAR2 (400);
currentuser varchar2(100);
BEGIN
--retrive the current user
select user into currentuser from dual;
-- check if the user is user3, then add the where condition, else null
if currentuser = 'USER3' then
return_val := 'type<>4'; -- this will be added to the where clause dynamically
else
return_val := '1=1';
end if;
RETURN return_val;
END test_rls_policy;
/
答案 0 :(得分:1)
VPD,resp。 RLS当然是一种有效的方式。
也许更简单,更便宜(但不太灵活)的方式是使用视图。
create view v_your_table as
select *
from your_table
where type<>4;
CREATE OR REPLACE SYNONYM USER3.your_table FOR v_your_table;
将所有必需的视图v_your_table
权限授予USER3,并撤消表your_table
的全部权限。 USER3还可以通过视图插入/更新/删除表(如果适用)。
答案 1 :(得分:1)
回答你的问题:
关于效率,使用Oracle内置功能总是比滚动自己的功能更具表现力。有第三方产品做类似的事情,但如果您使用的是标准版(因为RLS是企业版功能),或者如果您拥有异构环境并希望为所有数据库提供单一安全解决方案,那么您实际上只会查看这些产品。 。
答案 2 :(得分:0)
查看Oracle Virtual private database,
使您可以创建安全策略来控制数据库访问 行和列级别。基本上,Oracle虚拟专用数据库 将动态WHERE子句添加到发出的SQL语句中 Oracle Virtual Private的表,视图或同义词 已应用数据库安全策略。