Шаг 103 - Oracle - Оператор GRANT

Не знаю, чем у вас закончилась история с нашим новым пользователем DUMMY, а у меня он все же остался. Если кто-то из вас создал своего пользователя, то можете воспользоваться своим. А, вот сейчас давайте поговорим о том, как могут взаимодействовать разные схемы БД. И как это все возможно осуществить. Запускайте SQL*Plus и подключайтесь пользователем DUMMY (если вы его все-таки пристрелили, реанимируйте его согласно шагу 101). А теперь, находясь в схеме DUMMY дайте такой запрос:

SELECT * FROM SALESREPS
/

Получаем:

SQL> SELECT * FROM SALESREPS
  2  /
SELECT * FROM SALESREPS
              *
ошибка в строке 1:
ORA-00942: таблица или представление пользователя не существует 

Неудача "ORA-00942: таблица или представление пользователя не существует"! Говорит само за себя. Теперь попробуем:

SELECT * FROM MILLER.SALESREPS
/

Получаем:

SQL> SELECT * FROM MILLER.SALESREPS
  2  /
SELECT * FROM MILLER.SALESREPS
                     *
ошибка в строке 1:
ORA-01031: привилегий недостаточно 

В чем же причина? Да просто у пользователя DUMMY нет прав производить чтение из таблицы схемы MILLER! Как его предоставить? Очень просто. Подключаемся к схеме MILLER:

SQL> CONNECT MILLER/KOLOBOK@PROBA
Соединено.

А теперь записываем следующее:

SQL> GRANT SELECT ON SALESREPS TO DUMMY
  2  /

Привилегии предоставлены.

Меняем подключение на DUMMY:

SQL> CONNECT DUMMY/DUMB@PROBA
Соединено.

Снова повторяем запрос вот так, чтобы было меньше столбцов:

SELECT NAME FROM MILLER.SALESREPS
/

Получаем в результате:

SQL> SELECT NAME FROM MILLER.SALESREPS
  2  /

NAME                                                                            
------------------------------                                                  
Вася Пупкин                                                                     
Маша Распутина                                                                  
Филип Киркоров                                                                  
Света Разина                                                                    
Наташа Королева                                                                 
Игорь Николаев                                                                  
Крис Кельми                                                                     
Игорь Петров                                                                    
Дима Маликов                                                                    
Маша Сидорова                                                                   
Максим Галкин                                                                   

11 строк выбрано.

Теперь результат операции GRANT SELECT ON SALESREPS TO DUMMY виден на практике. Давайте более подробно рассмотрим операторы DDL - GRANT (предоставить) и REVOKE (отменить). Эти операторы нельзя использовать непосредственно в PL/SQL. Они предназначены для возможности выполнения других операторов SQL. Например, чтобы выполнить над таблицей Oracle некоторую операцию - INSERT или DELETE, необходимо иметь полномочия предоставляемые операторам GRANT. Существуют привилегии двух различных видов: объектные и системные. Объектная привилегия (object privilege) разрешает выполнение определенной операции над конкретным объектом (например над таблицей). В то время как системная привилегия (system privilege) разрешает выполнение операций над целым классом объектов. Существует множество системных привилегий, соответствующих практически всем возможным операциям DDL. Например, системная привилегия CREATE TABLE, позволяет ее обладателю создавать таблицы. А, вот системная привилегия CREATE ANY TABLE дает возможность создавать таблицы в других схемах. Давайте кратко насколько это, возможно остановимся на операторе GRANT. Синтаксис для предоставления пользователям или ролям системных полномочий и ролей:

-------        --------- , ------------      ---- , ----- ------------------------
------- GRANT  --- system_privilege ---  TO  --- user --- WITH ADMIN OPTION ------
-------        --- role ---------------      --- role --- ------------------------
                                             --- PUBLIC --------------------------

Давайте посмотрим какие системные полномочия могут предоставляться. Основных операций в языке DDL три - это CREATE, ALTER, DROP.

Группа ALTER:

Для любого объекта - ANY:

Группа CREATE:

Позволяет создавать в любой схеме соответствующий объект:

CREATE ANY PROCEDURE; 	
CREATE ANY SEQUENCE; 	
CREATE ANY TABLE; 		
CREATE ANY TRIGGER; 	
CREATE ANY VIEW; 	
CREATE ANY INDEX; 		

Позволяет создавать в конкретной схеме соответствующий объект:

CREATE PROCEDURE; 	
CREATE SEQUENCE; 	
CREATE TABLE; 		
CREATE TRIGGER; 	
CREATE VIEW; 	
CREATE INDEX; 		

CREATE SESSION
CREATE ROLE; 		

Удаление объектов в любой схеме, а так же очистка таблиц:

DELETE ANY TABLE;

DROP ANY PROCEDURE; 	
DROP ANY SEQUENCE; 	
DROP ANY TABLE; 		
DROP ANY TRIGGER; 	
DROP ANY VIEW; 	
DROP ANY INDEX; 		

Удаление объектов в схеме:

DROP PROCEDURE; 	
DROP SEQUENCE; 	
DROP TABLE; 		
DROP TRIGGER; 	
DROP VIEW; 	
DROP INDEX; 		

И еще полезные системные привилегии:

EXECUTE ANY PROCEDURE - Выполнить любую процедуру.
GRANT ANY PRIVILEGE;
GRANT ANY ROLE;
INSERT ANY TABLE	  	- Вставка в любую таблицу.
LOCK ANY TABLE;
SELECT ANY TABLE		- Чтение любой таблицы.
SELECT ANY SEQUENCE;	- Чтение любой последовательности.

Вот далеко не полный список системных привилегий, которые предоставляются оператором GRANT. Для начала я думаю хватит. А дальше все зависит от вас. Давайте теперь рассмотрим предоставление объектных привилегий. Здесь все выглядит вот так:

------         --------- , ------------                                                   	
------  GRANT  --- object_privilege --- ------------------- ON -- schema.object --- TO --- User ----- 
------         --- ALL ---------------- ---------- , ------                            --- Role ----->	
                       --- PRIVILEGES - -- ( COLUMN ) -----                            --- PUBLIC ---

------> WITH ADMIN OPTION  ------------------

object_privilege - предоставляемая привилегия - одна из:

						
:ALTER
:SELECT
:UPDATE
:DELETE						
:INSERT
:EXECUTE (только для процедур функций и пакетов)
:INDEX (только для таблиц)
:REFERENCES (только для таблиц).

COLUMN - определяет столбец таблицы или вида, на который распространяется предоставляемая привилегия.

ON - определяет объект (таблицу, вид, и т.д.)

TO - указывает кому предоставляется привилегия.

WITH ADMIN OPTION - позволяет имеющему эту привилегию предоставлять их в дальнейшем другими пользователям или ролям.

Как с работать с этим типом мы с вами уже пробовали в начале этого шага! Можете, например добавить еще что-нибудь к вышеизложенному примеру. И наконец, давайте рассмотрим как привилегии изымаются или удаляются. Для этого необходимо применять оператор REVOKE. Его синтаксис аналогичен первым двум операторам за небольшим исключением:

-----          --------- , ------------
-----  REVOKE  --- object_privilege --- ------------------- ON -- schema.object --- FROM --- User ----- 
-----          --- ALL ---------------- ---------- , ------                              --- Role ----->	
                       --- PRIVILEGES -                                                  --- PUBLIC ---

------> CASCADE CONSTRAINTS  ------------------

Например, чтобы изъять привилегию на выборку из таблицы SALESREPS для схемы DUMMY введите следующее находясь в схеме MILLER:

REVOKE SELECT ON SALESREPS FROM DUMMY
/

Получим примерно следующее:

SQL> REVOKE SELECT ON SALESREPS FROM DUMMY
  2  /

Привилегии изъяты.

Вот таким образом применяя операторы GRANT и REVOKE, можно строить взаимоотношение схем и строить политику доступа к объектам БД. Попробуйте создать в новом пользователе несколько объектов и разрешить обращаться к ним из схемы MILLER. Если что не получится пишите!


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Летучий Сергей - 27.02.2004