Иллюстрированный самоучитель по PostgreSQL

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

Представления при контроле доступа

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

Чтобы ограничить доступ к полям, перечислите их в списке полей команды SELECT при создании представления. В результате представление будет возвращать только те поля, которые были указаны вами. Ограничение доступа к записям осуществляется включением секции WHERE в команду SELECT, после чего представление будет состоять из записей, удовлетворяющих условию в секции WHERE (за дополнительной информацией о создании представлений обращайтесь к главе 4).

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

Допустим, в базе данных booktown имеется таблица stock, в которой код ISBN книги связывается с закупочной ценой, розничной ценой продажи и количеством экземпляров на складе. Структуру таблицы иллюстрирует табл. 10.3.

Таблица 10.3. Таблица stock.

Поле Тип Модификатор
isbn text NOT NULL
cost numeric (5. 2)  
retail numeric (5. 2)  
stock integer  

Допустим, вы не хотите, чтобы работники из отдела продаж знали закупочную цену книг. Чтобы ограничить доступ к этой информации, создайте представление, в которое входят данные из полей isbn, retail и stock. В листинге 10.20 мы создаем представление, даем право доступа к нему группе sales и затем проверяем результат командой \z в клиенте psql.

Листинг 10.20. Управление привилегией SELECT с использованием представления.

booktown=# CREATE VIEW stock_view
booktown-# AS SELECT isbn, retail, stock
booktown-# FROM stock;
CREATE
booktown=# GRANT SELECT ON stockjhew TO GROUP sales;
CHANGE
booktown=# \z stock
Access permissions for database "booktown"
Relation | Access permissions
stock |
stock_backup j
stock_view | {"=","manager=arwR"."group sales=r"}
(3 rows)

В листинге 10.21 создается новый пользователь barbara, которому предоставляется право SELECT для представления stock_view. Поскольку пользователь barbara изначально не обладает никакими правами доступа к таблице stock, таблица будет недоступна; ситуация не изменяется даже после получения доступа к представлению в результате выполнения команды GRANT.

Листинг 10.21. Управление привилегией SELECT.

booktown=# CREATE USER barbara;
CREATE USER
booktown=# GRANT USER barbara SELECT ON stock_view;
booktown=# \c – barbara
You are now connected as new user barbara.
booktown › SELECT * FROM stock;
ERROR: stock: Permission denied.
booktown › SELECT * FROM stock_view;
Isbn retail stock
0385121679 36.95 65
039480001X 32.95 31
0394900014 23.95 0
044100590X 45.95 89
0441172717 21.95 77
0451160916 28.95 22
0451198492 46.95 0
0451457994 22.95 0
0590445065 23.95 10
0679803335 24.95 18
0694003611 28.95 50
0760720002 23.95 28
0823015505 28.95 16
0929605942 21.95 25
1885418035 24.95 77
0394800753 16.95 4
(16 rows)

При подключении под именем barbara команда SELECT для представления stock_v1ew выполняется успешно, а выборка из таблицы stock приводит к ошибке Permission denied.

Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.