Oracle VPD列掩码,如何将默认(null)值更改为XXX

时间:2013-02-12 11:12:44

标签: oracle oracle10g

使用Oracle VPD,在添加策略并创建功能后,我能够隐藏未经授权用户的列。

但是,我可以展示像'xxxxxx'

这样的东西,而不是(null)

此外,在我正在验证用户登录的功能中,例如

if sys_context( 'userenv', 'session_user' ) = 'USER1'

在函数中删除此硬编码的最佳方法是什么?

提前致谢。

1 个答案:

答案 0 :(得分:2)

为了在not null的地方返回文本,你必须在表的顶部创建一个视图,将null更改为你想要的静态文字,因为VPD中唯一的选项是隐藏行或将秘密列设置为NULL。

对于您的问题的第二部分,如果您使用该检查来确定谁有权访问敏感列,您可以使用角色而让VPD函数检查如下:

return 'exists (select null from session_roles where role = ''XXXXXX'')';

即。谁拥有角色XXXXXX(只是创建一个合适的角色并将其授予您的特权用户),在他们的会话中设置可以查看数据。这样,您就不需要对一堆用户ID进行硬编码。

e.g:

如果我们创建一个角色并将其授予测试用户:

SQL> create role ACCESS_TABLEA_SEC_COL;

Role created.

SQL> grant ACCESS_TABLEA_SEC_COL to test;

Grant succeeded.

对于我的设置,我创建了一个简单的测试表+一个阻止人们阅读your_sec_col列的政策。

SQL> create or replace package pkg_security_control
  2  as
  3    function apply_access(p_owner in varchar2, p_obj_name  in  varchar2) return varchar2;
  4  end;
  5  /

Package created.

SQL> create or replace package body pkg_security_control
  2  as
  3    function apply_access(p_owner in varchar2, p_obj_name  in  varchar2)
  4      return varchar2
  5    is
  6    begin
  7      return 'exists (select null from session_roles where role = ''ACCESS_TABLEA_SEC_COL'')';
  8    end;
  9  end;
 10  /

Package body created.

SQL> create table TABLEA
  2  (
  3    id number primary key,
  4   your_sec_col  varchar2(30)
  5  );

Table created.

SQL> insert into tablea values (1, 'secret text1');

1 row created.

SQL> insert into tablea values (2, 'secret text2');

1 row created.

现在,如果我们从该表中选择并且我们没有ACCESS_TABLEA_SEC_COL角色,我们就会得到:

SQL> select *
  2    from tablea;

        ID YOUR_SEC_COL
---------- ------------------------------
         1
         2

但你想要一个像xxxxx这样的字符串。 VPD本身不能这样做,但视图可以将NULL解码为该字符串。

SQL> create view v_tablea
  2  as
  3  select id, case when your_sec_col is null then 'xxxxxx' else your_sec_col end your_sec_col
  4    from TABLEA;

View created.

现在从视图中选择将取决于角色是否设置:

SQL> set role none;

Role set.

SQL> select *
  2    from tablea;

        ID YOUR_SEC_COL
---------- ------------------------------
         1
         2

SQL> select *
  2    from v_tablea;

        ID YOUR_SEC_COL
---------- ------------------------------
         1 xxxxxx
         2 xxxxxx

SQL> set role all;

Role set.

SQL> select *
  2    from v_tablea;

        ID YOUR_SEC_COL
---------- ------------------------------
         1 secret text1
         2 secret text2

SQL> select *
  2    from tablea;

        ID YOUR_SEC_COL
---------- ------------------------------
         1 secret text1
         2 secret text2

所以VPD仍会保护您的桌面免受任何人的选择,但是您可以让客户从视图中选择以获取文字字符串。如果受保护的字符串可以包含NULL,并且您希望区分这些字符串,则可以将角色检查放在视图中。

create view v_tablea
as
select id, 
       case (select 'A' from session_roles where role = 'ACCESS_TABLEA_SEC_COL') 
         when 'A' then your_sec_col else 'xxxxxxxx' end your_sec_col
  from TABLEA;