Документ создан: 26.02.2018

Разные полномочия для одной и той же схемы.

Пока не приходилось реализовывать в деле, но решил записать на всякий случай.
Суть примерно такова: есть два сценария подключения к БД в одну и ту же схему (например, два разных приложения) и для одного сценария нужны одни полномочия, а для другого — другие. Для этого можно использовать "set role … identified by …".
Поясню на примере.

  • В БД создаём схему:
    CREATE user t3 IDENTIFIED BY t3 DEFAULT tablespace users quota unlimited ON users;
    GRANT connect TO t3;
  • Затем создаём две роли с соответствующими полномочиями:
    CREATE role read_t1;
    GRANT SELECT ON t1.test TO read_t1;
     
    CREATE role readwire_t1 IDENTIFIED BY "rw";
    GRANT ALL ON t1.test TO readwire_t1;
  • Назначаем роли:
    GRANT read_t1 TO t3;
    GRANT readwire_t1 TO t3;

Теперь подключаемся к БД и пробуем извлечь и вставить данные:

T3@XE (50)> SELECT * FROM t1.test ORDER BY id;
 
             ID NAME
--------------- ----------------------------------------
              1 One
              2 Two
              3 Three
              4 Four
              5 Five
              6 Six
 
6 rows selected.
 
T3@XE (50)> INSERT INTO t1.test (id, name) VALUES (7,'Seven');
INSERT INTO t1.test (id, name) VALUES (7,'Seven')
               *
ERROR at line 1:
ORA-01031: insufficient privileges
 
 
T3@XE (50)> DELETE FROM t1.test WHERE id=6;
DELETE FROM t1.test WHERE id=6
               *
ERROR at line 1:
ORA-01031: insufficient privileges
 
 
T3@XE (50)> UPDATE t1.test SET name='Fünf' WHERE id=5;
UPDATE t1.test SET name='Fünf' WHERE id=5
          *
ERROR at line 1:
ORA-01031: insufficient privileges

Первый сценарий отработал и мы видим, что доступ есть только для чтения. Теперь посмотрим на второй сценарий. Сначала выполняем:

T3@XE (50)> SET role readwire_t1 IDENTIFIED BY rw;
 
Role SET.

а затем

T3@XE (50)> SELECT * FROM t1.test ORDER BY id;
 
             ID NAME
--------------- ----------------------------------------
              1 One
              2 Two
              3 Three
              4 Four
              5 Five
              6 Six
 
6 rows selected.
 
T3@XE (50)> INSERT INTO t1.test (id, name) VALUES (7,'Seven');
 
1 row created.
 
T3@XE (50)> DELETE FROM t1.test WHERE id=6;
 
1 row deleted.
 
T3@XE (50)> UPDATE t1.test SET name='Fünf' WHERE id=5;
 
1 row updated.
 
T3@XE (50)> SELECT * FROM t1.test ORDER BY id;
 
             ID NAME
--------------- ----------------------------------------
              1 One
              2 Two
              3 Three
              4 Four
              5 Fünf
              7 Seven
 
6 rows selected.

Вот такое решение есть.

 
Recent changes RSS feed Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki Donate