Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / oracle 18 xe - dbms_session.is_role_enabled / 16 сообщений из 16, страница 1 из 1
18.06.2019, 15:19
    #39827789
PPA
PPA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
oracle 18 xe - dbms_session.is_role_enabled
На Oracle 18 XE (Windows) возникает ошибка при вызове dbms_session.is_role_enabled из триггера
это баг ?

К кого есть настоящая 18 версия под рукой можете проверить этот скрипт:

Код: sql
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.
alter session set "_ORACLE_SCRIPT"=true;

create role PS_RW_ROLE;

create user PS identified by ps2 temporary tablespace temp;
alter user ps quota 12 M on USERS;  
grant PS_RW_ROLE to PS with admin option;
alter user PS default role PS_RW_ROLE;
grant debug connect session to PS;
grant create session to PS with admin option;
grant create table to PS with admin option;
grant create trigger to PS with admin option;

connect ps/ps2@....
/

drop table ttt
/
create table ttt
(
  id number
)
/

CREATE OR REPLACE TRIGGER taiud_ttt
  after insert or update or delete on ttt
  for each row
declare
begin
  if not dbms_session.is_role_enabled('PS_RW_ROLE') then
     Raise_application_error(-20999, '[1] У Вас нет прав для изменения данных в базе данных. Обратитесь к администратору');
  end if;
end taiud_ttt;
/


declare
begin
  if not dbms_session.is_role_enabled('PS_RW_ROLE') then
     Raise_application_error(-20999, '[2] У Вас нет прав для изменения данных в базе данных. Обратитесь к администратору');
  end if;
  insert into ttt (id) values (123);
end;
/
...
Рейтинг: 0 / 0
18.06.2019, 15:32
    #39827799
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
oracle 18 xe - dbms_session.is_role_enabled
PPAвозникает ошибка
И какая же ошибка возникает?
Мсье вообще в курсе, что хранимый код требует прямого гранта на используемые объекты, в т.ч. execute на dbms_session?
...
Рейтинг: 0 / 0
18.06.2019, 15:56
    #39827816
Maxim Demenko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
oracle 18 xe - dbms_session.is_role_enabled
andrey_anonymous,

dbms_session по дефолту дана public, этого достаточно должно быть
если у public, ее нет - то это уже харденинг/customization


Regards

Maxim
...
Рейтинг: 0 / 0
18.06.2019, 16:04
    #39827822
PPA
PPA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
oracle 18 xe - dbms_session.is_role_enabled
andrey_anonymous,

Ошибка такая: (т.е. dbms_session.is_role_enabled('PS_RW_ROLE') в триггере возвращает false)

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
declare
begin
  if not dbms_session.is_role_enabled('PS_RW_ROLE') then
     Raise_application_error(-20999, '[2] У Вас нет прав для изменения данных в базе данных. Обратитесь к администратору');
  end if;
  insert into ttt (id) values (123);
end;
ORA-20999: [1] У Вас нет прав для изменения данных в базе данных. Обратитесь к администратору
ORA-06512: на  "PS.TAIUD_TTT", line 4
ORA-04088: ошибка во время выполнения триггера 'PS.TAIUD_TTT'
ORA-06512: на  line 6



У dbms_session из коробки грант на PUBLIC - триггер компилируется и без явного гранта схеме PS

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
SQL> 
SQL> create or replace procedure ttttttttttttttt is
  2  begin
  3    if not dbms_session.is_role_enabled('PS_RW_ROLE') then
  4       Raise_application_error(-20999, 'xxxxx');
  5    end if;
  6  end ttttttttttttttt;
  7  /
Procedure created
...
Рейтинг: 0 / 0
18.06.2019, 16:32
    #39827838
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
oracle 18 xe - dbms_session.is_role_enabled
PPA,

Причем тут dbms_session.is_role_enabled? Триггер всегда игнорирует роли, т.е. внутри триггера роль PS_RW_ROLE выключена. Медитируй:

Код: 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.
SQL> create or replace
  2  function f1
  3  return number
  4  is
  5  cnt number;
  6  begin
  7  select count(*) into cnt from session_roles;
  8  return cnt;
  9  end;
 10  /

Function created.

SQL> select count(*) from session_roles;

  COUNT(*)
----------
        26

SQL> select f1 from dual;

        F1
----------
         0

SQL> 



SY.
...
Рейтинг: 0 / 0
18.06.2019, 16:42
    #39827841
PPA
PPA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
oracle 18 xe - dbms_session.is_role_enabled
SY,

В доке как про этой найти?
тогда не понятно какой смысл в функции dbms_session.is_role_enabled вообще если ее в триггерах нельзя юзать.
и чем контекст триггера отличается от обычной хранимки?

В XE 10 это работало верно.
в 11 SE2 тоже все ок:

Код: 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.
Connected to Oracle Database 11g Release 11.2.0.4.0 

SQL> CREATE OR REPLACE TRIGGER taiud_ttt
  2    after insert or update or delete on ttt
  3    for each row
  4  declare
  5  begin
  6    if not dbms_session.is_role_enabled('PS_RW_ROLE') then
  7       Raise_application_error(-20999, 'У Вас нет прав для изменения данных в базе данных. Обратитесь к администратору');
  8    end if;
  9  end taiud_ttt;
 10  /

Trigger created


SQL> declare
  2  begin
  3    -- Test statements here
  4    if not dbms_session.is_role_enabled('PS_RW_ROLE') then
  5       Raise_application_error(-20999, 'У Вас нет прав для изменения данных в базе данных. Обратитесь к администратору');
  6    end if;
  7    --
  8    insert into ttt (id) values (123);
  9  end;
 10  /

PL/SQL procedure successfully completed
...
Рейтинг: 0 / 0
18.06.2019, 16:47
    #39827843
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
oracle 18 xe - dbms_session.is_role_enabled
PPAчем контекст триггера отличается от обычной хранимки?
см.
Код: plsql
1.
select * from session_roles
...
Рейтинг: 0 / 0
18.06.2019, 16:47
    #39827844
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
oracle 18 xe - dbms_session.is_role_enabled
PPA,

И роли в триггерe нельзя "и уважать себя заставил" в отличие от процедур/ф-ций:

Код: 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.
SQL> create or replace
  2  function f1
  3  return number
  4  authid current_user
  5  is
  6  cnt number;
  7  begin
  8  select count(*) into cnt from session_roles;
  9  return cnt;
 10  end;
 11  /

Function created.

SQL> select count(*) from session_roles;

  COUNT(*)
----------
        26

SQL> select f1 from dual;

        F1
----------
        26

SQL> 



SY.
...
Рейтинг: 0 / 0
18.06.2019, 16:50
    #39827847
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
oracle 18 xe - dbms_session.is_role_enabled
SYТриггер всегда игнорирует роли, т.е. внутри триггера роль PS_RW_ROLE выключена. Медитируй:Следи за руками:
есть пока не забаненная How to Verify the Enabled Roles for a Session Within a Trigger or PL/SQL Routine (Doc ID 159757.1)

но есть уже DBMS_SESSION.IS_ROLE_ENABLED ALWAYS RETURN FALSE (Doc ID 2305012.1)

Начиная с 12.2 Oracle довёл до логического конца тезис All roles are disabled in any named PL/SQL block that executes with definer's rights.
...
Рейтинг: 0 / 0
18.06.2019, 16:53
    #39827850
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
oracle 18 xe - dbms_session.is_role_enabled
PPAВ XE 10 это работало верно.
в 11 SE2 тоже все окВ 12.2 доступность роли при проверке в definer посчитали багом и исправили.
...
Рейтинг: 0 / 0
18.06.2019, 16:53
    #39827851
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
oracle 18 xe - dbms_session.is_role_enabled
PPAтогда не понятно какой смысл в функции dbms_session.is_role_enabled вообще если ее в триггерах нельзя юзать.


Ты не понял. Дело не в dbms_session.is_role_enabled. Он прекрасно работает в триггерах. Это просто зеркало на которое пенять бессмысленно. Роли в триггере вырублены что dbms_session.is_role_enabled и показывает.

SY.
...
Рейтинг: 0 / 0
18.06.2019, 17:06
    #39827862
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
oracle 18 xe - dbms_session.is_role_enabled
ElicСледи за руками:


TC явно спрашивал про 18C. До 12.2 dbms_session.is_role_enabled в definer rights показывал километры - роль-то в действительности была disabled и любой SQL требующий привилегию из роли вылетал.

SY.
...
Рейтинг: 0 / 0
18.06.2019, 17:13
    #39827868
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
oracle 18 xe - dbms_session.is_role_enabled
SYTC явно спрашивал про 18C
У ТС явно кастомная обработка прикладных ролей.
Я бы предложил ему двигаться в сторону контекстов.
...
Рейтинг: 0 / 0
18.06.2019, 17:16
    #39827872
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
oracle 18 xe - dbms_session.is_role_enabled
SYДо 12.2 dbms_session.is_role_enabled в definer rights показывал километрыТы первую ноту читал-то хоть?
...
Рейтинг: 0 / 0
18.06.2019, 17:19
    #39827875
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
oracle 18 xe - dbms_session.is_role_enabled
andrey_anonymousЯ бы предложил ему двигаться в сторону контекстов.

Согласен. ТC использует роли не по назначению - как состояния. Вопрос в том используются они статически или динамически. Если динамически, то да - контекст. Если статически, то возмoжно USER_ROLE_PRIVS.

SY.
...
Рейтинг: 0 / 0
16.11.2019, 13:26
    #39890020
Вячеслав Любомудров
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
oracle 18 xe - dbms_session.is_role_enabled
Кстати, 19c тут немного подшаманили
Код: 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.
SQL> grant create session to u1 identified by u12345678;
 
Grant succeeded.
 
SQL> create role r;
 
Role created.
 
SQL> grant r to u1;
 
Grant succeeded.
 
SQL> create or replace trigger u1_trg
  2  after logon on u1.schema
  3  begin
  4      dbms_output.enable;
  5      dbms_output.put_line('dbms_session.is_role_enabled(''R''): '||
  6           case when dbms_session.is_role_enabled('R') then 'true' else 'false' end);
  7      dbms_output.put_line('dbms_session.current_is_role_enabled(''R''): '||
  8           case when dbms_session.current_is_role_enabled('R') then 'true' else 'false' end);
  9      dbms_output.put_line('dbms_session.session_is_role_enabled(''R''): '||
 10           case when dbms_session.session_is_role_enabled('R') then 'true' else 'false' end);
 11  end;
 12  /
 
Trigger created.
 
SQL> connect u1/u12345678
Connected.
SQL> set serveroutput on
SQL> exec null
dbms_session.is_role_enabled('R'): false
dbms_session.current_is_role_enabled('R'): false
dbms_session.session_is_role_enabled('R'): true
 
PL/SQL procedure successfully completed.
 
SQL> begin
  2      dbms_output.enable;
  3      dbms_output.put_line('dbms_session.is_role_enabled(''R''): '||
  4           case when dbms_session.is_role_enabled('R') then 'true' else 'false' end);
  5      dbms_output.put_line('dbms_session.current_is_role_enabled(''R''): '||
  6           case when dbms_session.current_is_role_enabled('R') then 'true' else 'false' end);
  7      dbms_output.put_line('dbms_session.session_is_role_enabled(''R''): '||
  8           case when dbms_session.session_is_role_enabled('R') then 'true' else 'false' end);
  9  end;
 10  /
dbms_session.is_role_enabled('R'): true
dbms_session.current_is_role_enabled('R'): true
dbms_session.session_is_role_enabled('R'): true
 
PL/SQL procedure successfully completed.
 
SQL> select * from session_roles;
 
ROLE
-------------------------------------------------------------------------------------------------
R
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / oracle 18 xe - dbms_session.is_role_enabled / 16 сообщений из 16, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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