Ошибка: ORA-00439: Не задействована функциональная возможность: Fine-grained access control Oracle

Хочу сделать защиту на уровне записей (row level security) для таблицы Good.

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

create or replace function policy_func (p_schema varchar2, p_object varchar2)
return varchar2 is
begin
   if (user = 'USER_ ') then
      return 'price > 700';
   end if;
   return 'price < 200';
end;

Но не получается добавить политику:

Begin
DBMS_RLS.add_policy (
   object_schema => 'system',
   object_name  => 'good',
   policy_name  => 'clients_policy',
   function_schema => 'system',
   policy_function  => 'policy_func',
   statement_types => 'select, insert, update, delete',
   update_check => true
);
End;

Получаю ошибку:

2020-12-03 02:02:51] [67000][439]
[2020-12-03 02:02:51]   ORA-00439: Не задействована функциональная возможность: Fine-grained 
access control
[2020-12-03 02:02:51]   ORA-06512: на  "SYS.DBMS_RLS_INT", line 23
[2020-12-03 02:02:51]   ORA-06512: на  "SYS.DBMS_RLS", line 54
[2020-12-03 02:02:51]   ORA-06512: на  line 2
[2020-12-03 02:02:51] Position: 0

В чем проблема ?


PS моя версия БД 12.2.0.1.0


Ответы (1 шт):

Автор решения: 0xdb

Исключение:

ORA-00439: Не задействована функциональная возможность: Fine-grained access control

или:

ORA-00439: feature not enabled: Fine-grained access control

Вызывается в случае, если функциональная опция недоступна в утановленной версии/редакции БД.

Проверить, включенна ли опция, можно запросом:

select parameter, value 
from v$option where parameter='Fine-grained access control'
/
PARAMETER                        VALUE 
-------------------------------- ------
Fine-grained access control      TRUE  

Если value=false, то опция недоступна, а если true, будет работать:

SQL> begin dbms_rls.add_policy (
  2      object_schema => 'system',
  3      object_name  => 'good',
  4      policy_name  => 'clients_policy',
  5      function_schema => 'system',
  6      policy_function  => 'policy_func',
  7      statement_types => 'select, insert, update, delete',
  8      update_check => true); end;
  9  /

PL/SQL procedure successfully completed.
→ Ссылка