-
Notifications
You must be signed in to change notification settings - Fork 2
45. Управление разрешениями в SQL Server
У субъекта системы есть только один путь получения доступа к объектам - иметь назначенные непосредственно или опосредовано разрешения. При непосредственном управлении разрешениями они назначаются субъекту явно, а при опосредованном разрешения назначаются через членство в группах, ролях или наследуются от объектов, лежащих выше по цепочке иерархии. Управление разрешениями производится путем выполнения инструкций языка DCL (Data Control Language): GRANT
(разрешить), DENY
(запретить) и REVOKE
(отменить).
Инструкция GRANT
предоставляет разрешения на таблицу, представление, функцию, хранимую процедуру, очередь обслуживания, синоним. Синтаксис инструкции GRANT
:
GRANT { ALL [ PRIVILEGES ] | список_разрешений }
ON список_объектов
TO список_принципалов
[ WITH GRANT OPTION ] [ AS принципал ]
Ключевое слово ALL
с необязательным словом RIVILEGES
не включает все возможные разрешения, оно эквивалентно предоставлению всех разрешений ANSI-92, применимых к указанному объекту. Значение ALL
различается для разных типов объектов. Ниже перечислены главные классы разрешений и защищаемых объектов, к которым эти разрешения могут применяться:
- разрешения на скалярные функции:
EXECUTE, REFERENCES
; - разрешения на функции, возвращающие табличное значение:
DELETE, INSERT, REFERENCES, SELECT, UPDATE
; - разрешения на хранимые процедуры:
EXECUTE
; - разрешения на таблицы:
DELETE, INSERT, REFERENCES, SELECT, UPDATE
; - разрешения на представления:
DELETE, INSERT, REFERENCES, SELECT, UPDATE
.
Полный список разрешений содержит 195 пунктов.
Если разрешение предоставляется на таблицу, представление или
функцию, возвращающую табличное значение, то справа от разрешения в круглых скобоках могут указываться имена столбцов. На столбец могут быть предоставлены только разрешения SELECT, REFERENCES и UPDATE
.
Объект, на который предоставляется разрешение, имеет следующее описание: [ OBJECT :: ] [ имя_схемы ].имя_объекта
.
Фраза OBJECT
необязательна, если указан аргумент имя_схемы. Если же она указана, указание квалификатора области (::)
обязательно. Если не указан аргумент имя_схемы, подразумевается схема по умолчанию. Если указан аргумент _имя_схемы), обязательно указание квалификатора области схемы (.)
.
Принципалом может быть:
- пользователь базы данных,
- роль базы данных,
- роль приложения.
Необязательная фраза WITH GRANT OPTION
указывает, что принципалу также дается возможность предоставлять указанное разрешение другим принципалам.
Необязательная фраза AS принципал определяет принципала, у которого другой принципал, выполняющий данный запрос, наследует право предоставлять данное разрешение.
Пример. Предоставление разрешения EXECUTE
на хранимую процедуру HumanResources.uspUpdateEmployeeHireInfo
роли приложения Role03
.
USE AdventureWorks;
GRANT EXECUTE ON OBJECT::HumanResources.uspUpdateEmployeeHireInfo TO Role03;
GO
Инструкция REVOKE
отменяет разрешения, ранее предоставленные инструкцией GRANT
. Синтаксис инструкции REVOKE
:
REVOKE [ GRANT OPTION FOR ] список_разрешений ON список_объектов
{ FROM | TO } список_принципалов
[ CASCADE ]
[ AS принципал ]
- Необязательная фраза
GRANT OPTION FOR
показывает, что право на предоставление заданного разрешения другим принципалам будет отменено. Само разрешение отменено не будет. - Необязательное ключевое слово
CASCADE
показывает, что отменяемое разрешение также отменяется для других принципалов, для которых оно было предоставлено или запрещено этим принципалом. Каскадная отмена разрешения, предоставленного с помощью параметраWITH GRANT OPTION
, приведет к отмене правGRANT
иDENY
для этого разрешения. - Необязательная фраза
AS
принципал указывает принципала, от которого принципал, выполняющий данный запрос, получает право на отмену разрешения. Пример. Отмена разрешенияEXECUTE
для хранимой процедуры
USE AdventureWorks;
REVOKE EXECUTE ON OBJECT::HumanResources.uspUpdateEmployeeHireInfo
FROM Role03;
GO
Инструкция DENY
запрещает разрешения на члены класса OBJECT
защищаемых объектов. Синтаксис инструкции DENY:
DENY список_разрешений
ON список_объектов
TO список_принципалов [ CASCADE ]
[ AS принципал ]
Пример. Запрет разрешения REFERENCES
на представление с CASCADE
USE AdventureWorks;
DENY REFERENCES (EmployeeID) ON OBJECT::HumanResources.vEmployee TO User02 CASCADE;
GO