Ошибка предиката с Oracle VPD / RLS - PullRequest
1 голос
/ 22 января 2012

Мне нужна помощь с функцией Oracle RLS. Я никогда не использовал его раньше, но провел некоторые онлайн-исследования по этому поводу, однако я столкнулся с проблемой.

Вот шаги, которые я предпринял:

1 - Создать функцию:

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

is                

v_project varchar2(2000);

begin              

v_project:= '(select project from users where user_name = (select sys_context(''userenv'',''session_user'') from dual))';

return 'project = ' || v_project;       

end;

2- Добавить политику безопасности

Begin

DBMS_RLS.ADD_POLICY ('db1', 'data', 'access_policy', 'admin', 'table_access_policy', 'SELECT' );

End;

3 - Запустить простой запрос на выборку для объекта

select * from db1.data

Когда я делаю шаг 3, я получаю следующую ошибку:

ORA-28113: в предикате политики есть ошибка 28113. 00000 - «в предикате политики есть ошибка» * Причина: функция политики генерирует недопустимый предикат. * Действие: просмотрите файл трассировки для получения подробной информации об ошибке. Ошибка в строке: 5 столбец: 14

Я не знаю, что может быть не так с функцией безопасности. Я успешно использовал его вручную в схеме db1 следующим образом:

select * from data
where project = (select project from users where user_name = (select sys_context('userenv','session_user') from dual))

Есть мысли ??

Ответы [ 2 ]

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

Поскольку ваша функция политики находится в схеме администратора, вы должны квалифицировать выбор из таблицы пользователей с ее схемой:

v_project:= '(select project from db1.users where user_name = (select sys_context(''userenv'',''session_user'') from dual))';

Кроме того, вы должны проверить файл трассировки, как он рекомендует, поскольку это будетпокажет вам точный SQL, который выполняется, а также реальное сообщение об ошибке.

0 голосов
/ 22 января 2012

У меня нет копии Oracle Enterprise Edition (VPD только для Enterprise Edition), поэтому я могу только догадываться о нескольких возможных причинах проблемы:

  • Является литаблица, к которой вы хотите применить политику db1.data?
  • Является ли функция table_access_policy схемой admin?
  • Все ли необходимые пользователи получили права EXECUTE наtable_access_policy функция?

Я не думаю, что проблема заключается в чувствительности аргументов к регистру, потому что В собственных примерах Oracle используются имена объектов в нижнем регистре, такие как hr.

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