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
特定公司架构
我们已在GENERIC_TABLE上实施了RLS。 RLS函数返回clob值,但检索函数内的过滤器值的逻辑是:
现在,问题就出现了。实现之后,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;
/