Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Базы данных.doc
Скачиваний:
114
Добавлен:
16.03.2016
Размер:
5.67 Mб
Скачать

22.2.3. Создание и ликвидация ролей

Для создания новой роли используется оператор CREATE ROLE, определяемый следующим синтаксическим правилом:

CREATE ROLE role_name

[ WITH ADMIN { CURRENT_USER | CURRENT_ROLE } ]

Имя создаваемой роли должно отличаться от любого идентификатора авторизации, уже определенного и сохраненного в базе данных. В случае успешного создания роли некоторый authIDполучает привилегию на исполнение данной роли. Если в оператореCREATE ROLEне содержится разделWITH ADMIN, то привилегию на исполнение роли получает текущий идентификатор пользователя SQL-сессии, если значение этого идентификатора отлично отNULL; иначе привилегия на исполнение роли дается текущему имени роли сессии.

Если в состав оператора включается раздел WITH ADMIN, то можно выбрать, будет ли являться владельцем ролиauthID, соответствующий текущему идентификатору пользователя SQL-сессии, илиauthID, соответствующий текущему имени роли (при условии, что соответствующие текущий идентификатор или текущее имя не содержатNULL). Кроме того, включение этого раздела означает, чтоauthID-владелец роли получает право на передачу привилегии исполнения данной роли другимauthID.

В соответствии со стандартом SQL:1999, привилегии, требуемые для выполнения оператора CREATE ROLE, определяются в реализациях SQL. Например, в некоторых реализациях выполнение этой операции разрешается только администратору базы данных.

Существующую роль можно ликвидировать с помощью оператора

DROP ROLE role_name

Для выполнения этой операции требуется, чтобы текущий authIDSQL-сессии прямо или косвенно (через цепочку ролей) являлся владельцем ликвидируемой роли. При ликвидации роли, прежде всего, изымается привилегия на ее исполнение у всехauthID, которым данная привилегия была ранее передана.

22.2.4. Передача привилегий и ролей

Для передачи привилегий и ролей от одних authIDдругим поддерживается операторGRANT, который мы обсудим отдельно для случаев передачи привилегий и передачи ролей.

Передача привилегий

В случае передачи привилегий используется следующий синтаксис оператора GRANT:

GRANT { ALL PRIVILEGES | privilege_commalist }

ON privilege_object

TO { PUBLIC | authID_commalist } [ WITH GRANT OPTION ]

[ GRANTED BY { CURRENT_USER | CURRENT_ROLE } ]

privilege ::= SELECT [ column_name_commalist ]

| DELETE

| INSERT [ column_name_commalist ]

| UPDATE [ column_name_commalist ]

| REFERENCES [ column_name_commalist ]

| USAGE

| TRIGGER

| EXECUTE

privilege_object ::= [ TABLE ] table_name

| DOMAIN domain_name

| CHARACTER SET character_set_name

| COLLATION collation_name

| TRANSLATION translation_name

Поскольку authIDможет являться идентификатором пользователя или именем роли, привилегии могут передаваться от пользователей пользователям, от пользователей ролям, от ролей ролям и от ролей пользователям.

В списке привилегий можно использовать SELECT,DELETE,INSERT,UPDATE,REFERENCESиTRIGGERтолько в том случае, когда в качестве объекта привилегий указывается таблица. Соответственно, список привилегий может состоять из единственной привилегииUSAGEтолько в том случае, когда объектом является домен, набор символов, порядок сортировки или трансляция. Если в списке привилегий указывается более одной привилегии, то они все передаются указаннымauthID, но для этого текущийauthIDSQL-сессии должен обладать привилегией на передачу привилегий.

Использование ключевого слова ALL PRIVILEGESвместо явного задания списка привилегий означает, что передаются все привилегии доступа к соответствующему объекту базы данных, которыми обладает текущийauthIDSQL-сессии.

Как показывает синтаксис, один оператор GRANTпозволяет передавать привилегии доступа только к одному объекту, но в том случае, когда объектом является таблица, разные привилегии могут передаваться по отношению к одному и тому же набору столбцов или к разным наборам. Если при указании привилегийSELECT,DELETE,UPDATEиREFERENCESсписок имен столбцов не задается, передаются привилегии по отношению ко всем столбцам таблицы. Заметим, что эти привилегии касаются всех существующих столбов данной таблицы, а также всех столбцов, которые когда-либо будут к ней добавлены.

Включение в оператор необязательного раздела WITH GRANT OPTIONозначает, что получателям передаваемых привилегий дается также привилегия на дальнейшую передачу полученных привилегий, включая привилегию на передачу привилегий. Включение в оператор разделаGRANTED BYпозволяет явно указать, передаются ли привилегии от имени текущего идентификатора пользователя или же текущего имени роли.

При проверке возможности выполнения операции в SQL-сессии учитываются привилегии текущего authIDSQL-сессии, а также привилегии всех ролей, которые переданы данномуauthID. Поскольку этим ролям могли быть переданы другие роли, обладающие собственными привилегиями, анализ возможности выполнения операции является рекурсивной процедурой.

Если одна и та же привилегия передается более одного раза одному и тому же authID2от имени одного и того жеauthID1, то возникает ситуация, называемая избыточной дублирующей привилегией. Эта ситуация не вызывает дополнительных проблем, поскольку избыточная передача привилегии игнорируется. Для аннулирования данной привилегии уauthID2от имениauthID2требуется выполнение всего лишь одной операцииREVOKE(см. ниже в этом разделе). Если привилегия была один раз переданаauthID2от имениauthID1вместе с привилегией на передачу этой привилегии (WITH GRANT OPTION), а в другой раз – без этой опции (порядок действий не является существенным), тоauthID2обладает данной привилегией и привилегией на ее передачу.

Если предпринимается попытка передачи нескольких привилегий, но соответствующий authIDне обладает ни одной из них, то фиксируется ошибка. Аналогично, если производится попытка передачи нескольких привилегий с передачей привилегии на передачу привилегий, но соответствующийauthIDне обладает привилегиейWITH GRANT OPTIONни для одной из передаваемых привилегий, то фиксируется ошибка. Наконец, если производится попытка передачи нескольких привилегий с передачей привилегии на передачу привилегий и соответствующийauthIDобладает привилегией на передачу только части этих привилегий, то в результате выполнения операции вырабатывается предупреждение, но соответствующая часть привилегий передается с привилегиейWITH GRANT OPTION.