четверг, 21 ноября 2013 г.

Изучаю Oracle: Пользователи и их права

В предыдущем посте в п. 2 я писал как исправить проблемы с некорректно установленным Oracle'ом. Как оказалось, то что я написал не полностью решает проблему, по-этому я его снес и установил заново уже под локальной учетной записью. Теперь все работает как надо и можно продолжить изучение.

При установке Oracle по умолчанию создаются два пользователя/схемы - SYS и SYSTEM. Я написал "пользователя/схемы" потому, что при создании нового пользователя для него создается одноименная схема. Не сразу понятно чем понятие "пользователь" отличается от понятия "схема". Чтобы понять представьте пользователя Windows (Unix). Пользователь имеет имя ИмяПользователя  и принадлежащую ему папку - C:\Users\ИмяПользователя (/home/ИмяПользователя). Так вот пользователь Oracle аналогичен пользователю Windows, а схема - аналогична папке пользователя. Точно так же как у пользователя Windows, у пользователя Oracle есть набор прав. Так же как папка пользователя Windows содержит различные файлы, также и схема Oracle содержит различные объекты - таблицы, последовательности, триггеры и др. Если продолжать аналогию, то пользователей SYS и SYSTEM можно считать Администратором Windows или root-пользователем Unix. Они имеют неограниченные права. И работать под ними не рекомендуется. По-этому сначала нужно создать еще одного пользователя.

1. Создание пользователя и предоставление ему прав


Создадим пользователя, например fiftin:
CREATE USER fiftin IDENTIFIED BY 123456;
Мы создали пользователя fiftin с паролем 123456. Он не имеет абсолютно никаких прав. Вы даже не сможете под ним зайти:
SQL> connect fiftin
Enter password:
ERROR:
ORA-01045: user FIFTIN lacks CREATE SESSION privilege; logon denied
Для наделения пользователя правами существует команда GRANT. Например дадим права пользователю fiftin на вход:
GRANT CREATE SESSION TO fiftin;
Если теперь вы попробуете подключиться как пользователь fiftin у вас это получится. Но это все что разрешено пользователю fiftin. Наделим пользователя правами администратора:
GRANT dba TO fiftin WITH ADMIN OPTION;
Теперь вы можете подцепиться к БД под fiftin'ом как админ:
connect fiftin/fiftin
Создадим таблицу:
CREATE TABLE table1(id INT, column1 INT);
Вставим данные:
INSERT INTO table1(id, column1) VALUES (0, 1)

2. Права на создание таблиц


Создадим еще одного пользователя - test:
CREATE USER test IDENTIFIED BY 123;
Дадим ему права:
GRANT create session, create table TO test;
Теперь пользователь test может подключаться и создавать таблицы. Попробуем создать таблицу (не забудьте зайти под test'ом):
CREATE TABLE tbl_test(id int, column1 INT);
Получаем ошибку:
ORA-01950: no privileges on tablespace 'SYSTEM'
Почему так? Оказывается для того чтобы обычный пользователь (не админ) мог что-либо создать в БД, ему нужно выделить для этого место. Зайдем снова под fiftin'ом и выполним команду:
ALTER USER test QUOTA 50m ON system;
Этой командой мы выделяем пользователю test 50Мб под его нужды. Попробуйте теперь зайти под пользователем test и создать таблицу и у вас получится.

3. Права на доступ к таблицам из другой схемы


Теперь предположим что пользователь test должен брать данные из таблицы table1t. По-идее для этого нужно вызвать команду:
SELECT * FROM table1;
Но это не работает. Все потому, что таблица table1 находится в схеме fiftin и пользователь test её не видит (test видит таблицы только в своей схеме). Чтобы test увидел таблицу table1 нужно явно указать что она находится в схеме test - fiftin.table1. Но если вы сейчас попробуете обратиться к таблице fiftin.table1 вы её все равно не увидите. Потому что у пользователя test нет прав на доступ к данным из другой схемы (так же как пользователь Windows не может увидеть файлы другого пользователя, если у него нет на это прав).
Чтобы дать пользователю test права на чтение данных из таблицы fiftin.table1 нужно вызвать команду:
GRANT SELECT ON fiftin.table1 TO test
Теперь повторим попытку чтения из fiftin.table1 под пользователем test. Ура, получилось!

4. Синонимы


Чтобы не писать каждый раз "fiftin.table1" Oracle предоставляет возможность создавать синонимы. Мы можем создать синоним таблицы table1 в схеме test и обращаться к ней по короткому имени.
Для начала дадим права пользователю test на создание синонимов:
GRANT CREATE SYNONYM TO test
А теперь создадим сам синоним:
CREATE SYNONYM table1 FOR fiftin.table1;
Все.

Комментариев нет:

Отправить комментарий