powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / DBMS_RLS - назначение параметров namespace и attribute у процедур пакета
9 сообщений из 9, страница 1 из 1
DBMS_RLS - назначение параметров namespace и attribute у процедур пакета
    #40020654
Правильный Вася
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пытаюсь разобраться, зачем нужны и как использовать эти параметры в, например,
Код: plsql
1.
2.
3.
PROCEDURE add_policy( ...
  namespace       IN VARCHAR2 := NULL,
  attribute       IN VARCHAR2 := NULL );


Ни по слишком округлой справке, ни по скудному описанию в тексте пакета никак не пойму, что туда передавать?

Просмотрел множество всяких туториалов, так они вообще ловко обходят именно эти параметры, ни разу о них не вспоминая и уж тем более не объясняя.

Подскажите сабж, кто пользовался?
...
Рейтинг: 0 / 0
DBMS_RLS - назначение параметров namespace и attribute у процедур пакета
    #40020657
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Правильный Вася,


Я не пользовался, но я заметил что эти параметры задаются только в add_policy_context и drop_policy_context.

Security context описывается здесь довольно подробно.
https://docs.oracle.com/cd/B28359_01/network.111/b28531/app_context.htm#DBSEG011
...
Рейтинг: 0 / 0
DBMS_RLS - назначение параметров namespace и attribute у процедур пакета
    #40020659
Правильный Вася
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL,

Что такое контекст, я знаю.
Меня интересуют конкретно параметры для создания политик. При попытке что-то передать в них банально ругаетсяORA-28104: input value for namespace is not valid
Пробовал и просто имена контекстов, и заранее добавленные через add_policy_context() контексты.
...
Рейтинг: 0 / 0
DBMS_RLS - назначение параметров namespace и attribute у процедур пакета
    #40020660
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Правильный Вася,


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

https://blog.tuningsql.com/ora-28104-input-value-for-statement_types-is-not-valid/

А если нет, может кто-то опытный скоро откликнется.
...
Рейтинг: 0 / 0
DBMS_RLS - назначение параметров namespace и attribute у процедур пакета
    #40020662
Правильный Вася
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQLпроисходит при вызове add_policy, у которой нет этих параметров, контекст/атрибут
У неё ЕСТЬ эти параметры, описаны в документации и в декларации пакета.
Вот только описание настолько скудное, что ничего не проясняет. Или я настолько туп, что не понимаю его.
...
Рейтинг: 0 / 0
DBMS_RLS - назначение параметров namespace и attribute у процедур пакета
    #40020666
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Передавать туда контекст и его переменную
Как минимум, это запретит доступ, если эта переменная контекста не установлена
Насколько я понял -- основное предназначение оптимизировать вызов функции возвращения предиката для *CONTEXT_SENSITIVE политики, т.е. вызывать только в случае изменения значения конкретного атрибута. До 12.2 (?) этого не было и, насколько понимаю, предикат пересчитывался при любом изменении любого контекста (?)
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
Oracle Database 18c Enterprise Edition Release 18.0.0.0.0 - Production

tst> create context rls_ctx using rls_ctx_pkg;

Context created.

tst> create package rls_ctx_pkg as
  2  procedure set(name varchar2, value varchar2);
  3  function get_pred(owner varchar2, name varchar2) return varchar2;
  4  end;
  5  /

Package created.

tst> create package body rls_ctx_pkg as
  2  procedure set(name varchar2, value varchar2) is
  3  begin
  4   dbms_session.set_context('RLS_CTX', name, value);
  5  end;
  6  
  7  function get_pred(owner varchar2, name varchar2) return varchar2 as
  8  begin
  9   return 'id='||sys_context('RLS_CTX', 'ID');
 10  end;
 11  end;
 12  /

Package body created.

tst> create table t1 as select rownum id, rownum value from dual connect by level <= 3;

Table created.

tst> exec dbms_rls.add_policy(user, 'T1', 'T1_POLICY', user, 'RLS_CTX_PKG.GET_PRED', -
>                             policy_type=>dbms_rls.SHARED_CONTEXT_SENSITIVE, namespace=> 'RLS_CTX', attribute=> 'ID')

PL/SQL procedure successfully completed.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
tst> select * from t1;
select * from t1
*
ERROR at line 1:
ORA-42801: Value is not set for context attribute ("RLS_CTX", "ID") which is associated with the Row Level Security (RLS) policy "T1_POLICY".


tst> exec rls_ctx_pkg.set('ID', 2)

PL/SQL procedure successfully completed.

tst> select * from t1;

        ID      VALUE
---------- ----------
         2          2


Ну и посмотреть текст ошибок 42800, 42801

PS. Что-то у меня в 18.12 перестал работать event 10730, там можно было посмотреть применение RLS. В 11.2 работало :-(
...
Рейтинг: 0 / 0
DBMS_RLS - назначение параметров namespace и attribute у процедур пакета
    #40020925
Правильный Вася
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вячеслав Любомудров,

Спасибо. Оказалось, я при создании контекста его привязывал не к тому пакету.

Но теперь другая непонятка.
Я считал, что add_policy_context() просто дополнительно расширяет список контекстов для уже созданной с контекстом политики. Однако, судя по
Код: plsql
1.
2.
SELECT * FROM all_policy_contexts;
SELECT * FROM all_policy_attributes;

это не так. В первую вьюху попадают те, что идут от add_policy_context(), а во вторую те, что идут от add_policy().

И вот тут ступор. А что тогда делает add_policy_context() и как потом используются эти контексты? Они вообще как-то соотносятся между собой?
По описанию опять же не пойму.
...
Рейтинг: 0 / 0
DBMS_RLS - назначение параметров namespace и attribute у процедур пакета
    #40020954
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я так понимаю -- add_policy_context используется для группы политик -- т.е. управляется приложением, оно выбирает , какую именно группу политик применять через значение данного аттрибута конкретного контекста

Т.е. в зависимости от изменения этого аттрибута выбирается та или иная группа политик ну и, соответственно, скорее всего надо обновить предикаты

Дальше решение об обновлении предикатов применяется на основании контекстных атрибутов, назначенных данной [*CONTEXT*] политике (если не назначено, обновляется действительно при любом изменении любого контекста " If there is a change in any attribute of any application context during the user session, then by default the database re-executes the policy function to ensure that it captures all changes to the predicate since the initial parsing. This results in unnecessary re-executions of the policy function if none of the associated attributes have changed. You can restrict the evaluation to a specific application context by including both the namespace and attribute parameters.")

Тут еще надо понимать виды политик:
-- DYNAMIC -- всегда вызывается функция вычисления предиката -- соответственно постоянные, накладные расходы
-- *STATIC -- функция вычисления предиката вызывается один раз, предикат один и тот же, но за счет использования [контекстных] переменных могут быть разные результаты
-- *CONTEXT_SENSITIVE -- функция вычисления предиката вызывается каждый раз при смене ассоциированного с ней аттрибута/ов или любого значения любого контекста. Надо четко понять, что это для случаев, когда меняется именно строка предиката в зависимости от значения контекста. Т.е. для предиката типа "ID=SYS_CONTEXT('RLS_CTX', 'ID')" использовать такой тип не надо, для этого существует *STATIC. И, тут уже функция должна быть чистой, т.е. переменные допускаются только контекстные, PL/SQL-ные запрещены

PS. И да, конечно, все возможности я не тестировал. Но, ведь можно обратиться к первоисточнику , на который ссылка, кстати, дана из описания самого пакета
...
Рейтинг: 0 / 0
DBMS_RLS - назначение параметров namespace и attribute у процедур пакета
    #40020958
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И, для добавлении/удалении ассоциации политики с атрибутом контекста, т.е. когда значение предиката меняется на основании, в том числе, и этой переменной контекста, для данной политики надо использовать DBMS_RLS.ALTER_POLICY

Соответственно, для ассоциации изменения выбора группы политик с конкретной контекстной переменной надо юзать DBMS_RLS.ALTER_GROUPED_POLICY
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / DBMS_RLS - назначение параметров namespace и attribute у процедур пакета
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]