暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 关于DBMS_REDACT的问题

askTom 2018-01-10
1266

问题描述

我们的应用程序在后端使用ADF作为UI和Oracle数据库12c。

作为法规要求,我们必须屏蔽应用程序的几列。ADF中的实体对象基于视图。


我们已经尝试使用DBMS_REDACT功能解决这些列的掩蔽,在这样做的同时,我们面临以下问题。


1.已在相应列的表上创建策略。在UI上,数据已被屏蔽并正确显示。在编辑和修改任何已编辑/未已编辑的列时,在保存期间,我们会收到 “ORA-28081: 权限不足-命令引用已编辑的对象”


2.已从表中删除策略,并在相应列的视图上创建策略。在编辑和修改任何已编辑/未编辑的列时,在保存期间,我们可以保存值。

现在,它观察到,当在表上创建策略时,视图无法更新被编辑的基础表的任何列。

我们是否有任何解决方法来摆脱这种情况,或者有什么方法可以实现我想要的。我的要求是,虽然策略仍然存在于表中,但我想通过视图对已编辑的表执行DML操作。

下面是我的工作。

1.我在带有部分掩码的表上创建策略

     BEGIN
       DBMS_REDACT.ADD_POLICY(
         object_schema        => 'OFSLLPOC',
         object_name          => 'LOOKUPS',
         column_name          => 'LKC_DESC',
         policy_name          => 'redact_lkc_pm',
         function_type        => DBMS_REDACT.PARTIAL,
         function_parameters=> 'VVVVVVVVVVVVVVVVVVVVVVVVVVVVVV,VVVVVVVVVVVVVVVVVVVVVVVVVVVVVV,X,1,15',
         expression           => '1=1',
         enable=>true
         );
    END;
复制


2.我对存在政策的表格有一个看法。

从查找中创建或替换视图UIX_LKC_FVW为SELECT *;

3.更新uix_lkc_fvw设置LKC_DESC = 'ABC',其中ROWNUM<2;

我得到ORA-28081: 权限不足-命令引用一个编辑对象。



4.我删除在步骤1中创建的策略。

BEGIN                  
    DBMS_REDACT.DROP_POLICY (object_schema=>'OFSLLPOC'
                             ,object_name=>'LOOKUPS'
                             ,policy_name=>'redact_lkc_pm');
END;
复制



5.我用部分掩码在步骤2中创建的视图上创建策略

      BEGIN
       DBMS_REDACT.ADD_POLICY(
         object_schema        => 'OFSLLPOC',
         object_name          => 'UIX_LKC_FVW',
         column_name          => 'LKC_DESC',
         policy_name          => 'redact_lkc_pm',
         function_type        => DBMS_REDACT.PARTIAL,
         function_parameters=> 'VVVVVVVVVVVVVVVVVVVVVVVVVVVVVV,VVVVVVVVVVVVVVVVVVVVVVVVVVVVVV,X,1,15',
         expression           => '1=1',
         enable=>true
         );
    END;
复制


6.我更新视图UIX_LKC_FVW的基础表

更新查找设置LKC_DESC = 'ABC',其中ROWNUM<2;



1行更新。



问题是,虽然策略仍然只存在于表中,但我想通过基于表创建的视图对已编辑的表执行DML操作。

在上面的示例中,我希望策略保留在查找表中,而我应该能够通过UIX_LKC_FVW对查找表进行DML操作。

专家解答

这就是编辑应该如何工作的,例如

SQL> conn scott/tiger
Connected.

SQL> create table t as select * from scott.emp;

Table created.

SQL> create or replace view vw as select * from t;

View created.

SQL>
SQL>
SQL> conn / as sysdba
Connected.

SQL> BEGIN
  2    DBMS_REDACT.add_policy(
  3      object_schema => 'SCOTT',
  4      object_name   => 't',
  5      column_name   => 'sal',
  6      policy_name   => 'redact_sal',
  7      function_type => DBMS_REDACT.full,
  8      expression    => '1=1'
  9    );
 10  END;
 11  /

PL/SQL procedure successfully completed.

SQL>
SQL> conn scott/tiger
Connected.

SQL> select * from t;

     EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
      7369 SMITH      CLERK           7902 17-DEC-80          0                    20
      7499 ALLEN      SALESMAN        7698 20-FEB-81          0        300         30
      7521 WARD       SALESMAN        7698 22-FEB-81          0        500         30
      7566 JONES      MANAGER         7839 02-APR-81          0                    20
      7654 MARTIN     SALESMAN        7698 28-SEP-81          0       1400         30
      7698 BLAKE      MANAGER         7839 01-MAY-81          0                    30
      7782 CLARK      MANAGER         7839 09-JUN-81          0                    10
      7788 SCOTT      ANALYST         7566 09-DEC-82          0                    20
      7839 KING       PRESIDENT            17-NOV-81          0                    10
      7844 TURNER     SALESMAN        7698 08-SEP-81          0                    30
      7876 ADAMS      CLERK           7788 12-JAN-83          0                    20
      7900 JAMES      CLERK           7698 03-DEC-81          0                    30
      7902 FORD       ANALYST         7566 03-DEC-81          0                    20
      7934 MILLER     CLERK           7782 23-JAN-82          0                    10

14 rows selected.

SQL> select * from vw;

     EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
      7369 SMITH      CLERK           7902 17-DEC-80          0                    20
      7499 ALLEN      SALESMAN        7698 20-FEB-81          0        300         30
      7521 WARD       SALESMAN        7698 22-FEB-81          0        500         30
      7566 JONES      MANAGER         7839 02-APR-81          0                    20
      7654 MARTIN     SALESMAN        7698 28-SEP-81          0       1400         30
      7698 BLAKE      MANAGER         7839 01-MAY-81          0                    30
      7782 CLARK      MANAGER         7839 09-JUN-81          0                    10
      7788 SCOTT      ANALYST         7566 09-DEC-82          0                    20
      7839 KING       PRESIDENT            17-NOV-81          0                    10
      7844 TURNER     SALESMAN        7698 08-SEP-81          0                    30
      7876 ADAMS      CLERK           7788 12-JAN-83          0                    20
      7900 JAMES      CLERK           7698 03-DEC-81          0                    30
      7902 FORD       ANALYST         7566 03-DEC-81          0                    20
      7934 MILLER     CLERK           7782 23-JAN-82          0                    10

14 rows selected.

SQL>
SQL> update vw
  2  set sal = sal + 10
  3  where rownum = 1;
where rownum = 1
               *
ERROR at line 3:
ORA-28081: Insufficient privileges - the command references a redacted object.


SQL>
SQL> update t
  2  set sal = sal + 10
  3  where rownum = 1;

1 row updated.

SQL>
复制


但是ADF应该能够通过

-通过视图查询
-通过表格更新

这个过程的描述在这里

http://andrejusb.blogspot.com.au/2012/05/how-to-update-data-from-db-view-using.html
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论