Самоучитель по SQL-сервер в Linux



Управление группами

Группы упрощают процедуру назначения прав пользователям. Обычные привилегии должны назначаться каждому пользователю по отдельности. Это может быть весьма утомительно, если нескольким пользователям требуется одинаковый уровень доступа к нескольким объектам базы данных.

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

ПРИМЕЧАНИЕ

Пользователь может входить в любое количество групп, но может и не принадлежать ни к одной группе.

Создание и удаление групп

Прежде чем переходить к управлению группами, сначала необходимо разобраться в том, как происходит создание и удаление групп. Обе операции требуют привилегий суперпользователя (за дополнительной информацией о суперпользователях обращайтесь к разделу «Управление пользователями» этой главы).

Создание группы

Любой суперпользователь может создать новую группу PostgreSQL командой SQL CREATE GROUP. Синтаксис команды CREATE GROUP:

CREATE GROUP группа [ WITH

[ SYSID идентификатор_группы ]

[ USER пользователь [. ...]]]

Параметр группа определяет имя создаваемой группы. Имена групп должны начинаться с алфавитного символа, а их длина не может превышать 31 символа. В секции WITH передаются дополнительные атрибуты. Ключевое слово SYSID задает системный идентификатор новой группы. Ключевое слово USER позволяет включить одного или нескольких пользователей в группу на стадии ее создания. Имена членов группы разделяются запятыми.

Следует помнить, что таблицы пользователей и групп в PostgreSQL существуют отдельно друг от друга. Несмотря на это, в PostgreSQL не допускается совпадение системных идентификаторов пользователей и групп.

В листинге 10.11 создается группа sales, в которую при создании включаются два пользователя, all en и vi ncent.

Листинг 10.11. Создание группы

booktown=# CREATE GROUP sales

booktown-# WITH USER alien, Vincent;

CREATE GROUP

Сообщение CREATE GROUP означает, что группа успешно создана. Чтобы убедиться в этом, а также получить список всех существующих групп, достаточно выполнить запрос к системной таблице рд_дгоир. Пример такого запроса приведен в листинге 10.12.

Листинг 10.12. Получение списка групп

booktown=# SELECT * FROM pg_group;

groname grosysid | grolist

sales | 1 | {7017.7016}

accounting | 2 |

marketing | 3

(3 rows)

Обратите внимание на столбец grol 1st — в нем перечислены идентификаторы пользователей PostgreSQL, входящих в группу. Это те самые идентификаторы, которые выводятся в представлении pg_user. Пример:

booktown=# SELECT usename FROM pg_user

booktown-# WHERE usesysid = 7017 OR usesysid = 7016;

usename

alien

vincent

(2 rows)

Удаление группы

Любой суперпользователь может удалять существующие группы командой SQL DROP GROUP. Будьте внимательны при выполнении этой команды, поскольку она необратима и вам не будет предложено подтвердить удаление группы (даже если в ней остаются пользователи). В отличие от команды DROP DATABASE, команда DROP GROUP может выполняться в транзакционном блоке.

Синтаксис команды DROP GROUP:

DROP GROUP группа

Параметр группа определяет имя удаляемой группы. В листинге 10.13 из базы данных booktown удаляется ненужная группа marketi ng.

Листинг 10.13. Удаление группы

booktown=# DROP GROUP marketing;

DROP GROUP

Сообщение DROP GROUP означает, что группа успешно удалена. Учтите, что при удалении группы назначенные ей права не уничтожаются, а всего лишь становятся «бестелесными», не связанными с реальным субъектом. Все права объекта базы данных для удаленной группы фактически относятся не к самой группе, а ее системному идентификатору.

ПРИМЕЧАНИЕ

Случайно удаленную группу можно восстановить. Для этого следует создать новую группу с тем же системным идентификатором, что у удаленной группы. Системный идентификатор назначается ключевым словом SYSID, о котором говорилось в пункте «Создание группы». Если присвоить группе права доступа к таблице и затем удалить эту группу, то права группы для таблицы останутся. Разумеется, в созданную группу нужно будет заново включить пользователей.

Назначение пользователей в группы

Включение пользователей в группы и удаление их из групп в PostgreSQL выполняется командой SQL ALTER GROUP. Синтаксис команды ALTER GROUP:

ALTER GROUP группа { ADD DROP } USER пользователь [. ... ]

Параметр группа определяет имя группы, а параметр пользователь — имя включаемого или удаляемого пользователя (в зависимости от присутствия ключевого слова ADD или DROP).

Включение пользователя в группу

Предположим, ваша компания принимает в отдел сбыта двух новых работников, для которых создаются учетные записи пользователей с именами davi d и ben. В листинге 10.14 приведена команда ALTER GROUP для включения новых пользователей в группу sales.

Листинг 10.14. Включение пользователей в группу

booktown=# ALTER GROUP sales ADD USER david. ben;

ALTER GROUP

Сообщение ALTER GROUP означает, что пользователи david и ben успешно включены в группу sales. В листинге 10.15 приведен запрос к таблице рд_дгоир, проверяющий наличие новых пользователей в группе. Обратите внимание: количество системных идентификаторов в столбце grolist для группы sales увеличилось до четырех.

Листинг 10.15. Проверка факта включения пользователей в группу

booktown=# SELECT * FROM pg_group WHERE groname = 'sales':

groname | grosysid | grolist

sales 1 | {7019.7018.7017.7016}

(1 row)

Удаление пользователя из группы

Предположим, один из работников был переведен из отдела сбыта в бухгалтерию. Чтобы сохранить правильный состав групп и убедиться в том, что он не обладаетправами, предоставляемыми только группе sales, пользователя david необходимо исключить из группы. Задача решается командой ALTER GROUP, приведенной в листинге 10.16.

Листинг 10.16. Удаление пользователя из группы

booktown=# ALTER GROUP sales DROP USER david;

ALTER GROUP

Сообщение ALTER GROUP означает, что пользователь david успешно удален из группы sales.

Перевод работника завершается его включением в группу accounti ng. В следующем фрагменте использованы команды, аналогичные командам в листингах 10.14 и 10.15. В результате пользователь david включается в группу accounting, и любые права, предоставляемые этой группе, будут автоматически предоставляться пользователю david до тех пор, пока он остается членом этой группы.

booktown=# ALTER GROUP accounting ADD USER david:

ALTER GROUP

booktown=# SELECT * FROM pg_group;

groname | grosysid | grolist

sales | 1 | {7016.7017.7019}

accounting 2 | {7018}

(2 rows)




Книжный магазин