0

我正在尝试使用 SQL 语句在 Oracle 中创建 VPD。这个问题的目的是让员工只能查看同一部门员工的记录,同时将同事的工资屏蔽为 NULL。

正在使用的表的代码如下

create table Employee
(
    ID number primary key,
    DEPT varchar2(25),
    SALARY number(8,2),
    NAME varchar2(25)
); 

我不确定执行此操作的最佳方法是什么……是创建一个包并使用应用程序上下文。我相信让表格只显示我理解的相同“DEPT”中的那些,但不确定如何屏蔽那些具有相同 DEPT 但不同 ID 的数据。

4

1 回答 1

0

原生 RLS 会让您接近但不完全在那里。使用“sec_relevant_cols”将为您提供

  • 只看到与您的谓词匹配的行,但所有值都存在
  • 查看所有行,但屏蔽与谓词不匹配的值

而(如果我没看错的话)你只想看到匹配行的谓词并屏蔽掉一些值。

您可以通过两步法实现这一点

  1. 您的上下文包含两个键(例如)DEPT 和 YOUR_ID

  2. RLS 策略是“其中 dept = sys_context(ctx,'DEPT')”

  3. 您有一个应用该策略的视图 EMP,即

     select 
       id, 
       dept, 
       name,
       case when id = sys_context(ctx,'YOUR_ID') then sal else null end sal
     from EMP_TABLE
    
于 2021-11-17T05:57:22.793 回答