使用RLS的性能影响

时间:2018-02-07 10:32:01

标签: oracle oracle11g vpd

Generic_Schema有一个公共表GENERIC_TABLE。 GENERIC_TABLE的主键是COL1和COMPANY_ID。

Company_id     Col1 Col2 Col3
-------------- ---- ---- ----
ALL_COMPANIES  A    B    C
Comp1          A    B1   C1
Comp3          A    B3   C

特定公司架构

  1. Schema1 => Comp1
  2. Schema2 => Comp2
  3. SchemaN => CompN
  4. 我们已在GENERIC_TABLE上实施了RLS。 RLS函数返回clob值,但检索函数内的过滤器值的逻辑是:

    1. 将密钥与其他值进行比较,如果Comp1 Schema请求数据,则检索A | B1 | C1数据,并且不检索ALL_COMPANIES数据,因为表中存在特定于公司的值。
    2. 如果Comp4检索数据,它将只获得A | B | C记录。
    3. 需要从另一个返回rowid的函数中检索过滤条件。
    4. 现在,问题就出现了。实现之后,RLS的经过时间要高得多,尽管我们没有看到太多的I / O.任何人都可以认为这个设计是一个问题,因为这不是一个静态谓词,它是上下文敏感的。 如果您需要更多投入,请告诉我。

      功能定义是

      create or replace function
        book_access_policy
        (obj_schema varchar2, obj_name varchar2)
        return clob
      
       is
      
      CURSOR get_d_predicate
      IS
       SELECT /*+ RESULT_CACHE */ rd
        FROM
        (
        SELECT rowid rd
              ,DENSE_RANK() OVER(PARTITION BY COL1 ORDER BY CASE WHEN COMPANY_ID = sys_context('publishing_application','company_id') THEN 1 ELSE 2 END) rnk
      FROM GENERIC_TABLE
        )
         WHERE rnk=1;
      
      get_d_predicate_rec get_d_predicate%ROWTYPE;
      d_predicate clob;
      
      begin
      
       if sys_context('publishing_application','company_id') IS NULL THEN
        d_predicate:= ' 1=1';
      
       else
         d_predicate =' rowid in ('
          OPEN get_d_predicate;
          LOOP
           FETCH get_d_predicate INTO get_d_predicate_rec;
           EXIT WHEN get_d_predicate%NOTFOUND;
             d_predicate = d_predicate|| get_d_predicate_rec.rd;
          END LOOP;
         CLOSE get_d_predicate;
          d_predicate:=d_predicate||')';
      
      
       end if;
      
      return d_predicate;
      
       end;
       /
      

0 个答案:

没有答案