powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Странное поведение DBMS_RLS.ADD_POLICY
4 сообщений из 4, страница 1 из 1
Странное поведение DBMS_RLS.ADD_POLICY
    #40029403
Правильный Вася
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Наткнулся на ошибку, которая в моем понимании быть не должна.
Вот демо-код:
Код: 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.
38.
39.
40.
41.
42.
43.
DROP TABLE t_for_policy PURGE;

CREATE TABLE t_for_policy ( f1 NUMBER );

CREATE OR REPLACE FUNCTION fn_for_policy( p1 CHAR, p2 CHAR ) RETURN VARCHAR2
AS BEGIN RETURN ''; END;
/
BEGIN
  DBMS_RLS.add_policy(
    object_name           => 't_for_policy',
    policy_name           => 'pol_01',
    policy_function       => 'fn_for_policy'
  );
END;
/
BEGIN
  DBMS_RLS.add_policy(
    object_name           => 't_for_policy',
    policy_name           => 'pol_02',
    policy_function       => 'fn_for_policy', 
    statement_types       => 'SELECT,INSERT,UPDATE,DELETE'
  );
END;
/
BEGIN
  DBMS_RLS.add_policy(
    object_name           => 't_for_policy',
    policy_name           => 'pol_03',
    policy_function       => 'fn_for_policy', 
    statement_types       => 'SELECT,INSERT,UPDATE,DELETE',
    update_check          => FALSE
  );
END;
/
BEGIN
  DBMS_RLS.add_policy(
    object_name           => 't_for_policy',
    policy_name           => 'pol_04',
    policy_function       => 'fn_for_policy', 
    update_check          => FALSE
  );
END;
/


А вот результат его выполнения:
Код: 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.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
Connected to Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 
Connected as u99

SQL> CREATE TABLE t_for_policy ( f1 NUMBER );

Table created

SQL> CREATE OR REPLACE FUNCTION fn_for_policy( p1 CHAR, p2 CHAR ) RETURN VARCHAR2
  2  AS BEGIN RETURN ''; END;
  3  /

Function created

SQL> BEGIN
  2    DBMS_RLS.add_policy(
  3      object_name           => 't_for_policy',
  4      policy_name           => 'pol_01',
  5      policy_function       => 'fn_for_policy'
  6    );
  7  END;
  8  /

PL/SQL procedure successfully completed

SQL> BEGIN
  2    DBMS_RLS.add_policy(
  3      object_name           => 't_for_policy',
  4      policy_name           => 'pol_02',
  5      policy_function       => 'fn_for_policy',
  6      statement_types       => 'SELECT,INSERT,UPDATE,DELETE'
  7    );
  8  END;
  9  /

ORA-28104: входное значение для statement_types является недопустимым
ORA-06512: на  "SYS.DBMS_RLS_INT", line 23
ORA-06512: на  "SYS.DBMS_RLS", line 54
ORA-06512: на  line 2

SQL> BEGIN
  2    DBMS_RLS.add_policy(
  3      object_name           => 't_for_policy',
  4      policy_name           => 'pol_03',
  5      policy_function       => 'fn_for_policy',
  6      statement_types       => 'SELECT,INSERT,UPDATE,DELETE',
  7      update_check          => FALSE
  8    );
  9  END;
 10  /

ORA-28104: входное значение для statement_types является недопустимым
ORA-06512: на  "SYS.DBMS_RLS_INT", line 23
ORA-06512: на  "SYS.DBMS_RLS", line 54
ORA-06512: на  line 2

SQL> BEGIN
  2    DBMS_RLS.add_policy(
  3      object_name           => 't_for_policy',
  4      policy_name           => 'pol_04',
  5      policy_function       => 'fn_for_policy',
  6      update_check          => FALSE
  7    );
  8  END;
  9  /

PL/SQL procedure successfully completed

SQL>


Странно тут вот что:
1. По документации statement_types IN VARCHAR2 DEFAULT NULL , но есть приписочка, что It can be any
combination of INDEX, SELECT, INSERT, UPDATE, or DELETE. The default is to apply to all of these types except INDEX.
2. По документации update_check IN BOOLEAN DEFAULT FALSE .

Таким образом, все 4 варианта создания политик должны быть равноценны, однако это не так . Причём пробовал в 12.2 и 19 - одинаковая реакция.
...
Рейтинг: 0 / 0
Странное поведение DBMS_RLS.ADD_POLICY
    #40029405
Правильный Вася
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И заключительный штрих:
Код: plsql
1.
2.
3.
4.
5.
6.
SQL> SELECT policy_name, sel, ins, upd, del, idx FROM User_Policies WHERE object_name='T_FOR_POLICY';

POLICY_NAME                                                                      SEL INS UPD DEL IDX
-------------------------------------------------------------------------------- --- --- --- --- ---
POL_01                                                                           YES NO  YES YES NO
POL_04                                                                           YES NO  YES YES NO


Почему же INSERT не оказался среди дефолтных?
...
Рейтинг: 0 / 0
Странное поведение DBMS_RLS.ADD_POLICY
    #40029421
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А это именно с 12.2 поперло: https://docs.oracle.com/database/121/ARPLS/d_rls.htm#ARPLS67721 update_check

Optional argument for INSERT or UPDATE statement types. The default is FALSE. Setting update_check to TRUE causes the server to also check the policy against the value after insert or update.

The check applies only to the security relevant columns that are included in the policy definition. In other words, the INSERT or UPDATE operation will fail only if the security relevant column that is defined in the policy is added or updated in the INSERT or UPDATE statement.
https://docs.oracle.com/en/database/oracle/oracle-database/12.2/arpls/DBMS_RLS.html#GUID-1E528A51-DE53-4961-8770-C53924E427CC update_check

Optional argument for the INSERT or UPDATE statement type. The default is FALSE. If you plan to use the INSERT statement type, then you must set update_check to TRUE. Otherwise, an ORA-28104 input value for string is not valid error is generated .

The check applies only to the security relevant columns that are included in the policy definition. In other words, the INSERT or UPDATE operation will fail only if the security relevant column that is defined in the policy is added or updated in the INSERT or UPDATE statement.
...
Рейтинг: 0 / 0
Странное поведение DBMS_RLS.ADD_POLICY
    #40029870
Правильный Вася
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, занятно.
Я-то пользуюсь add_grouped_policy , по сути это то же самое, но справку я по ней же читал. А вот в ней нет такой странной приписки как у add_policy ни в доках 12.2, ни в в 19.
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Странное поведение DBMS_RLS.ADD_POLICY
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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