powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / DBMS_SQL и права пользователей
8 сообщений из 8, страница 1 из 1
DBMS_SQL и права пользователей
    #32161834
gminter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет друзья,
если вы меня узнали, значит я - Олег Филимонов ))))

Вопрос такой - Есть package, который юзает исключительно DBMS_SQL при редактировании таблиц Т1, Т2, Т3

Пользоваетель имеет права на execute package-а и только SELECT на Т1, Т2, Т3.
При работе с package-ом пользователь прорывается сквозь отсутсвие грантов на UPDATE, DELETE, INSERT.

AUTHID CURRENT_USER в package-е никакого эфеекта не дает.


замена DBMS_SQL на execute immediate проблему снимает (с аудитом конечно)

Помогите понять, в чем заключается проблема.

Спасибо.
...
Рейтинг: 0 / 0
DBMS_SQL и права пользователей
    #32161956
raven13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Динимаческий сикуэл работает с правами владельца схемы, в котором расположен пакет. У него скорее всего и есть гранты
...
Рейтинг: 0 / 0
DBMS_SQL и права пользователей
    #32162134
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 raven13:
According to gminter (AKA Олег Филимонов), package is created with AUTHID CURRENT_USER, which means it is executed on caller's, not package owner's behalf. Based on that I can assume user HAS update, delete and insert, but most likely via role. Why? We all are used to the fact "role based privileges are disabled in stored procedures". However it is not entirely true. It changed since Oracle introduced AUTHID CURRENT_USER. In that case role based privileges or a caller are NOT IGNORED:

Код: plaintext
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.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
SQL> connect u1/xxx@xxx
Connected.
SQL> select * from tbl1;

X
 --------------------------------------------------------------------------------
 
This is U1.TBL1

SQL> create role r1
   2   /

Role created.

SQL> grant select on tbl1 to r1
   2   /

Grant succeeded.

SQL> grant r1 to scott
   2   /

Grant succeeded.

SQL> connect system/xxx@xxx
Connected.
SQL> create or replace
   2     function func1
   3       return varchar2
   4       is
   5           v_x varchar2( 100 );
   6       begin
   7           execute immediate 'select x from u1.tbl1' into v_x;
   8           return v_x;
   9   end;
  10   /

Function created.

SQL> create or replace
   2     function func2
   3       return varchar2
   4       authid current_user
   5       is
   6           v_x varchar2( 100 );
   7       begin
   8           execute immediate 'select x from u1.tbl1' into v_x;
   9           return v_x;
  10   end;
  11   /

Function created.

SQL> grant execute on func1 to scott
   2   /

Grant succeeded.

SQL> grant execute on func2 to scott
   2   /

Grant succeeded.

SQL> connect scott/xxx@xxx
Connected.
SQL> set serveroutput on
SQL> select * from u1.tbl1;

X
 --------------------------------------------------------------------------------
 
This is U1.TBL1

SQL> exec dbms_output.put_line(system.func1)
BEGIN dbms_output.put_line(system.func1); END;

*
ERROR at line  1 :
ORA- 00942 : table or view does not exist
ORA- 06512 : at  "SYSTEM.FUNC1" , line  6 
ORA- 06512 : at line  1 


SQL> exec dbms_output.put_line(system.func2)
This is U1.TBL1

PL/SQL procedure successfully completed.



As you can see, user scott calling func1 which has AUTHID DEFINER can not select form U1.TBL1 since user scott has SELECT on U1.TBL1 via role R1. However user scott calling func2 which has AUTHID CURRENT_USER can select form U1.TBL1 even though select is granted via role R1.

SY
...
Рейтинг: 0 / 0
DBMS_SQL и права пользователей
    #32162175
raven13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 SY
Спасибо (вы исходите из того что system имеет грант на все объекты схемы, это так но только не в динамическом сикуэл где гранты надо раздавать непосредственно), и вот следующий пример.

1)
CREATE TABLE css.tst1
(id NUMBER)

-- Grants for Table
GRANT SELECT ON css.tst1 TO dr
/
GRANT SELECT ON css.tst1 TO gs

2)
CREATE OR REPLACE
FUNCTION gs.func1
return varchar2
is
v_x varchar2(100);
begin
execute immediate 'select id from css.tst1' into v_x;
return v_x;
end;
/

-- Grants for Function
GRANT EXECUTE ON gs.func1 TO dr

3)
CREATE OR REPLACE
FUNCTION gs.func2
return varchar2
authid current_user
is
v_x varchar2(100);
begin
execute immediate 'select id from css.tst1' into v_x;
return v_x;
end;
/

-- Grants for Function
GRANT EXECUTE ON gs.func2 TO dr
/

4)
BEGIN
dbms_output.put_line(func1);
END;
this is the css.tst1 table

5)
BEGIN
dbms_output.put_line(func2);
END;
this is the css.tst1 table

Очевидно, что если выполнить оператор в п. 1 revoke SELECT ON css.tst1 TO gs
то при выполнении 4) оператора вылезет table or view does not exists
Кстати, все вышеописанное только что проделал (уж извините ваш пример не брал - system засорять не охота).

PS Я конечено понимаю некоторые тут на сертификацию уже сдали, на английском как на родном, мы люди сирые умных слов не знаем :-)

2 gminter
Не возможно ли такое, что гранты кто-то дал, лучше явно их уберите на нужные объекты?
...
Рейтинг: 0 / 0
DBMS_SQL и права пользователей
    #32162215
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 raven13:

I do not see roles in your example!!! All privileges in your example are granted directly. All I was saying is:

User X is granted execute on a stored procedure (function, package) with AUTHID CURRENT_USER. (another words it does not matter who owns strored procedure, since it is always executed not on owner's behalf but rather on caller's behalf. So it is irrelevant that in my example function is owned by system). Stored procedure (function, package) references object O owned by user Y (Y.O). User X has privilege on Y.O granted VIA ROLE and it WILL WORK. This is very different from what we used to, where role based privileges are ignored.

SY.
...
Рейтинг: 0 / 0
DBMS_SQL и права пользователей
    #32162220
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>это так но только не в динамическом сикуэл где гранты надо раздавать непосредственно

Not true. Again, if dynamic SQL is executed from a stored procedure with AUTHID CURRENT_USER, role based privileges WILL WORK. And that is shown in my example. Sorry if function owned by SYSTEM in my example mislead you. You can create it under any other user.

SY.
...
Рейтинг: 0 / 0
DBMS_SQL и права пользователей
    #32162233
gminter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем спасибо - я снова поверил в Oracle и ... убил админа, который через роль - а их с дюжину, дал update, delete, insert на эти злостчастные таблицы ВСЕМ пользователям
...
Рейтинг: 0 / 0
DBMS_SQL и права пользователей
    #32162240
raven13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 SY
Во теперь понятно.
Что ж коли так, то становится проще работать.
Спасибо за маленький бесплатный урок :-)
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / DBMS_SQL и права пользователей
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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