powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / oracle 18 xe - dbms_session.is_role_enabled
16 сообщений из 16, страница 1 из 1
oracle 18 xe - dbms_session.is_role_enabled
    #39827789
Фотография PPA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На 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
oracle 18 xe - dbms_session.is_role_enabled
    #39827799
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PPAвозникает ошибка
И какая же ошибка возникает?
Мсье вообще в курсе, что хранимый код требует прямого гранта на используемые объекты, в т.ч. execute на dbms_session?
...
Рейтинг: 0 / 0
oracle 18 xe - dbms_session.is_role_enabled
    #39827816
Maxim Demenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymous,

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


Regards

Maxim
...
Рейтинг: 0 / 0
oracle 18 xe - dbms_session.is_role_enabled
    #39827822
Фотография PPA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
oracle 18 xe - dbms_session.is_role_enabled
    #39827838
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
oracle 18 xe - dbms_session.is_role_enabled
    #39827841
Фотография PPA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
oracle 18 xe - dbms_session.is_role_enabled
    #39827843
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PPAчем контекст триггера отличается от обычной хранимки?
см.
Код: plsql
1.
select * from session_roles
...
Рейтинг: 0 / 0
oracle 18 xe - dbms_session.is_role_enabled
    #39827844
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
oracle 18 xe - dbms_session.is_role_enabled
    #39827847
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
oracle 18 xe - dbms_session.is_role_enabled
    #39827850
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PPAВ XE 10 это работало верно.
в 11 SE2 тоже все окВ 12.2 доступность роли при проверке в definer посчитали багом и исправили.
...
Рейтинг: 0 / 0
oracle 18 xe - dbms_session.is_role_enabled
    #39827851
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PPAтогда не понятно какой смысл в функции dbms_session.is_role_enabled вообще если ее в триггерах нельзя юзать.


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

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


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

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

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

SY.
...
Рейтинг: 0 / 0
oracle 18 xe - dbms_session.is_role_enabled
    #39890020
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, 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
16 сообщений из 16, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / oracle 18 xe - dbms_session.is_role_enabled
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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