powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Право создать таблицу в конкретной схеме
14 сообщений из 14, страница 1 из 1
Право создать таблицу в конкретной схеме
    #40072772
juratorneo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Коллеги, добрый день.
Есть команда GRANT CREATE ANY TABLE. В таком случае одна схема получает возможность создать таблицы в любой другой отличной от себя схеме.
Мне необходимо дать право схеме создать таблицы в одной единственной схеме. Как можно это сделать??
...
Рейтинг: 0 / 0
Право создать таблицу в конкретной схеме
    #40072786
SQL*Plus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Создайте процедуру в "одной единственной схеме", например, в ONE_SINGLE_SCHEME:
Код: plsql
1.
2.
3.
4.
5.
6.
CREATE PROCEDURE my_cre_tab(p_cmd_end IN VARCHAR2)
IS
BEGIN
   EXECUTE IMMEDIATE 'CREATE TABLE ' || p_cmd_end);
END;
/


Дайте грант на выполнение этой процедуры тому, кто должен создавать таблицу.
Например, пользователю SCOTT
Код: plsql
1.
GRANT EXECUTE ON my_cre_tab TO scott;



Выполните процедуру от пользователя SCOTT

Код: plsql
1.
2.
3.
4.
BEGIN
   ONE_SINGLE_SCHEME.my_cre_tab('test_tab(txt VARCHAR2(25), num NUMBER, dt DATE)' );
END;
/


Будет создана таблица ONE_SINGLE_SCHEME.test_tab
...
Рейтинг: 0 / 0
Право создать таблицу в конкретной схеме
    #40072826
juratorneo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SQL*Plus,

Этот вариант хитренький. Мы даём право execute procedure и даем ей параметры которые через динамический создаёт таблицу. Умно. Скажите а нет ли манёвра через Гранты.
Или в оракле это не предусмотрено в принципе?
...
Рейтинг: 0 / 0
Право создать таблицу в конкретной схеме
    #40072828
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SQL*Plus

Будет создана таблица ONE_SINGLE_SCHEME.test_tab


А заодно можно "инжектнуть" все на что имеет права ONE_SINGLE_SCHEME но не имеет SCOTT.

SY.
...
Рейтинг: 0 / 0
Право создать таблицу в конкретной схеме
    #40072851
SQL*Plus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SY
SQL*Plus

Будет создана таблица ONE_SINGLE_SCHEME.test_tab

А заодно можно "инжектнуть" все на что имеет права ONE_SINGLE_SCHEME но не имеет SCOTT.

Это вряд ли.

Вы же обратили внимание, что в EXECUTE IMMEDIATE я явно написал 'CREATE TABLE '

Код: plsql
1.
   EXECUTE IMMEDIATE 'CREATE TABLE ' || p_cmd_end;


Поэтому ничего, кроме создания обычной таблицы, эта процедура сделать не сможет.
...
Рейтинг: 0 / 0
Право создать таблицу в конкретной схеме
    #40072855
SQL*Plus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
juratorneo
SQL*Plus,

Этот вариант хитренький. Мы даём право execute procedure и даем ей параметры которые через динамический создаёт таблицу. Умно. Скажите а нет ли манёвра через Гранты.
Или в оракле это не предусмотрено в принципе?

Нету.
Не предусмотрено.
Посмотрел в доке на Oracle Database 21c, но ничего нового в команде GRANT не нашёл.

Вы расскажите зачем вам оно надо?
В процессе рассказа вы вполне возможно поймёте, что оно вам не надо. :-)
...
Рейтинг: 0 / 0
Право создать таблицу в конкретной схеме
    #40072890
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SQL*Plus

Это вряд ли.

Вы же обратили внимание, что в EXECUTE IMMEDIATE я явно написал 'CREATE TABLE '

Код: plsql
1.
   EXECUTE IMMEDIATE 'CREATE TABLE ' || p_cmd_end;


Поэтому ничего, кроме создания обычной таблицы, эта процедура сделать не сможет.


Явное CREATE TABLE не спасет от CREATE TABLE ... AS SELECT простор-для фантазии;

SY.
...
Рейтинг: 0 / 0
Право создать таблицу в конкретной схеме
    #40072907
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
SQL*Plus
Поэтому ничего, кроме создания обычной таблицы, эта процедура сделать не сможет.

Код: 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.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
SQL> sho user;
USER is "XTENDER"
SQL> create user test identified by test;

User created.

SQL> grant connect to test;

Grant succeeded.

SQL> create table my_dual as select * from dual;

Table created.

-- дадим грант на my_dual
SQL> grant read on my_dual to test;

Grant succeeded.

-- а на my_dual2 не дадим:
SQL> create table my_dual2 as select * from dual;

Table created.

SQL> CREATE PROCEDURE my_cre_tab(p_cmd_end IN VARCHAR2) AUTHID DEFINER
  2  IS
  3  BEGIN
  4     EXECUTE IMMEDIATE ('CREATE TABLE ' || p_cmd_end);
  5  END;
  6  /

Procedure created.

SQL> grant EXECUTE on my_cre_tab to test;

Grant succeeded.

SQL> set echo off
Connected.

======================================================================
=======  Connected to  TEST@()
=======  SID
=======  SERIAL#
=======  SPID
=======  DB_VERSION     /
======================================================================
SQL> begin
  2    xtender.my_cre_tab(q'[
  3      yay as
  4      with
  5        function fff(cmd in varchar2) return varchar2 as
  6          procedure p_exec(x varchar2) is
  7            pragma autonomous_transaction;
  8          begin
  9            execute immediate x;
 10          end;
 11        begin
 12          p_exec(cmd);
 13          return 'ok';
 14        exception when others then
 15          return sqlerrm;
 16        end;
 17      select cast(fff('drop table my_dual') as varchar2(100)) as dummy from dual
 18      union all
 19      select cast(fff('grant all on my_dual2 to test') as varchar2(100)) as dummy from dual
 20    ]');
 21  end;
 22  /

PL/SQL procedure successfully completed.

SQL> select * from xtender.my_dual;
select * from xtender.my_dual
                      *
ERROR at line 1:
ORA-00942: table or view does not exist

-- таблица my_dual успешно дропнута

SQL> select * from xtender.my_dual2;

D
-
X

1 row selected.

-- грант на my_dual2 успешно получен.

...
Рейтинг: 0 / 0
Право создать таблицу в конкретной схеме
    #40072913
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sayan Malakshinov
SQL*Plus
Поэтому ничего, кроме создания обычной таблицы, эта процедура сделать не сможет.

Код: 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.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
SQL> sho user;
USER is "XTENDER"
SQL> create user test identified by test;

User created.

SQL> grant connect to test;

Grant succeeded.

SQL> create table my_dual as select * from dual;

Table created.

-- дадим грант на my_dual
SQL> grant read on my_dual to test;

Grant succeeded.

-- а на my_dual2 не дадим:
SQL> create table my_dual2 as select * from dual;

Table created.

SQL> CREATE PROCEDURE my_cre_tab(p_cmd_end IN VARCHAR2) AUTHID DEFINER
  2  IS
  3  BEGIN
  4     EXECUTE IMMEDIATE ('CREATE TABLE ' || p_cmd_end);
  5  END;
  6  /

Procedure created.

SQL> grant EXECUTE on my_cre_tab to test;

Grant succeeded.

SQL> set echo off
Connected.

======================================================================
=======  Connected to  TEST@()
=======  SID
=======  SERIAL#
=======  SPID
=======  DB_VERSION     /
======================================================================
SQL> begin
  2    xtender.my_cre_tab(q'[
  3      yay as
  4      with
  5        function fff(cmd in varchar2) return varchar2 as
  6          procedure p_exec(x varchar2) is
  7            pragma autonomous_transaction;
  8          begin
  9            execute immediate x;
 10          end;
 11        begin
 12          p_exec(cmd);
 13          return 'ok';
 14        exception when others then
 15          return sqlerrm;
 16        end;
 17      select cast(fff('drop table my_dual') as varchar2(100)) as dummy from dual
 18      union all
 19      select cast(fff('grant all on my_dual2 to test') as varchar2(100)) as dummy from dual
 20    ]');
 21  end;
 22  /

PL/SQL procedure successfully completed.

SQL> select * from xtender.my_dual;
select * from xtender.my_dual
                      *
ERROR at line 1:
ORA-00942: table or view does not exist

-- таблица my_dual успешно дропнута

SQL> select * from xtender.my_dual2;

D
-
X

1 row selected.

-- грант на my_dual2 успешно получен.




Ну это лечится через INHERIT PRIVILEGES. А вот просто почитать что нельзя это исключить сложнее.

SY.
...
Рейтинг: 0 / 0
Право создать таблицу в конкретной схеме
    #40072957
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
SY
Ну это лечится через INHERIT PRIVILEGES.
не понял, как это может лечиться через INHERIT PRIVILEGES, если они только для AUTHID CURRENT_USER? А с AUTHID CURRENT_USER ты не сможешь создать таблицу в чужой схеме, если нет CREATE ANY TABLE.


зы. но вообще все это звучит подозрительно, как будто хотят постоянно, динамически и в любое время давать создавать кому-то таблицы. В принципе, конечно, это можно реализовать через CREATE ANY TABLE + DDL триггер с жесткой фильтрацией что и кому можно, но по-моему тут просто нужен прокси юзер
...
Рейтинг: 0 / 0
Право создать таблицу в конкретной схеме
    #40073101
SQL*Plus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SY
SQL*Plus

Это вряд ли.

Вы же обратили внимание, что в EXECUTE IMMEDIATE я явно написал 'CREATE TABLE '

Код: plsql
1.
   EXECUTE IMMEDIATE 'CREATE TABLE ' || p_cmd_end;


Поэтому ничего, кроме создания обычной таблицы, эта процедура сделать не сможет.


Явное CREATE TABLE не спасет от CREATE TABLE ... AS SELECT простор-для фантазии;

SY.

Да, это правда.

Вариант ... AS SELECT я упустил.
...
Рейтинг: 0 / 0
Право создать таблицу в конкретной схеме
    #40073106
SQL*Plus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sayan Malakshinov
SQL*Plus
Поэтому ничего, кроме создания обычной таблицы, эта процедура сделать не сможет.

Код: 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.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
SQL> sho user;
USER is "XTENDER"
SQL> create user test identified by test;

User created.

SQL> grant connect to test;

Grant succeeded.

SQL> create table my_dual as select * from dual;

Table created.

-- дадим грант на my_dual
SQL> grant read on my_dual to test;

Grant succeeded.

-- а на my_dual2 не дадим:
SQL> create table my_dual2 as select * from dual;

Table created.

SQL> CREATE PROCEDURE my_cre_tab(p_cmd_end IN VARCHAR2) AUTHID DEFINER
  2  IS
  3  BEGIN
  4     EXECUTE IMMEDIATE ('CREATE TABLE ' || p_cmd_end);
  5  END;
  6  /

Procedure created.

SQL> grant EXECUTE on my_cre_tab to test;

Grant succeeded.

SQL> set echo off
Connected.

======================================================================
=======  Connected to  TEST@()
=======  SID
=======  SERIAL#
=======  SPID
=======  DB_VERSION     /
======================================================================
SQL> begin
  2    xtender.my_cre_tab(q'[
  3      yay as
  4      with
  5        function fff(cmd in varchar2) return varchar2 as
  6          procedure p_exec(x varchar2) is
  7            pragma autonomous_transaction;
  8          begin
  9            execute immediate x;
 10          end;
 11        begin
 12          p_exec(cmd);
 13          return 'ok';
 14        exception when others then
 15          return sqlerrm;
 16        end;
 17      select cast(fff('drop table my_dual') as varchar2(100)) as dummy from dual
 18      union all
 19      select cast(fff('grant all on my_dual2 to test') as varchar2(100)) as dummy from dual
 20    ]');
 21  end;
 22  /

PL/SQL procedure successfully completed.

SQL> select * from xtender.my_dual;
select * from xtender.my_dual
                      *
ERROR at line 1:
ORA-00942: table or view does not exist

-- таблица my_dual успешно дропнута

SQL> select * from xtender.my_dual2;

D
-
X

1 row selected.

-- грант на my_dual2 успешно получен.


Спасибо за доходчивый пример.
...
Рейтинг: 0 / 0
Право создать таблицу в конкретной схеме
    #40073184
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sayan Malakshinov
не понял, как это может лечиться через INHERIT PRIVILEGES, если они только для AUTHID CURRENT_USER?


Упс, прочитал по-диагонали. Увидел AUTHID и зациклился. Но это интересный баг (IMHO). autonomous_transaction внутри DML запрещена и по идее Oracle должен это проверять на всех вложенных уровнях а не только у непосредственно вызванной функции.

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


Упс, опять соврал . Таки разрешена.

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


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