Oracle 11 - 仅为一个用户隐藏一些行

时间:2018-04-12 05:20:25

标签: oracle oracle11g

我们的管理员要求从特定用户(user3)隐藏数据库中最常用的表(oracle 11g)中的某些行,我们尝试使用行级安全性(RLS)包一个简单的函数如下所示,它在我们测试的场景中工作正常。我的问题是:

  1. 此解决方案是否适用于我们的目的?

  2. 如果在复杂视图中使用此表,数据库是否会隐藏视图结果中的特定行?

  3. 这是一种很好的做法还是有效的方式?

  4. 此解决方案是否会将性能影响到关键级别?

  5. 将由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;
    /
    

3 个答案:

答案 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)

回答你的问题:

  1. 是(最佳实践)
  2. 关于效率,使用Oracle内置功能总是比滚动自己的功能更具表现力。有第三方产品做类似的事情,但如果您使用的是标准版(因为RLS是企业版功能),或者如果您拥有异构环境并希望为所有数据库提供单一安全解决方案,那么您实际上只会查看这些产品。 。

答案 2 :(得分:0)

查看Oracle Virtual private database

  

使您可以创建安全策略来控制数据库访问   行和列级别。基本上,Oracle虚拟专用数据库   将动态WHERE子句添加到发出的SQL语句中   Oracle Virtual Private的表,视图或同义词   已应用数据库安全策略。