Oracle RLS / VPD с циклом for в функции политики - PullRequest
1 голос
/ 26 января 2012

Это продолжение старого вопроса о функции безопасности Oracle на уровне строк, которая обсуждалась ранее здесь

Мне нужно было изменить, потому что исходный код вернул бы более одного результата, если пользователь был присоединен к нескольким проектам. Так что теперь мне нужно иметь несколько, где условия (то есть, где project = project_1 или project = project_2) переданы в политику безопасности, чтобы это работало. Для этого я попытался изменить код с помощью цикла for, и он не работает ...

--create function
create or replace function
   table_access_policy
   (obj_schema varchar2, obj_name varchar2) return varchar2

is                

v_project_temp varchar2(9000);

begin              

v_project_temp:= 'declare v_project varchar2(9000);

begin
v_project:= ''project = '';

for c in (select admin.access_list.project from admin.access_list where upper(admin.access_list.user_id) = SYS_CONTEXT (''USERENV'', ''SESSION_USER'')) 

loop

v_project := v_project || c.project_sn || '' or project = '' ;

end loop;

v_project := rtrim(v_project, '' or project = '');

end;';

return v_project_temp;

end;

Функция сохраняет / запускает без каких-либо ошибок, но сама политика выдает ошибку при ее вызове. Есть ли лучший способ сделать это?

1 Ответ

2 голосов
/ 26 января 2012

Вместо того, чтобы помещать PL / SQL в строку, вы должны запустить его и собрать строку v_project для возврата. Такие как:

--create function
create or replace function
   table_access_policy
   (obj_schema varchar2, obj_name varchar2) return varchar2    
is
  v_project varchar2(9000);
begin              
  v_project:= 'project = ';
  for c in (select admin.access_list.project from admin.access_list where upper(admin.access_list.user_id) = SYS_CONTEXT ('USERENV', 'SESSION_USER')) 
  loop
    v_project := v_project ||''''|| c.project_sn ||''''|||| ' or project = ' ;
  end loop;    
  v_project := rtrim(v_project, ' or project = ');    
  return v_project;    
end;

В конечном итоге значение, отображаемое в v_project, будет идти сразу после where в выражении SQL, таком как:

select * from data;

станет

select * from date where <v_project>;

Так что в v_ project должно идти только то, что следует за where.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...