Права

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

Существуют различные виды прав: SELECT, INSERT, UPDATE, DELETE, TRUNCATE, REFERENCES, TRIGGER, CREATE, CONNECT, TEMPORARY, EXECUTE, USAGE, SET и ALTER SYSTEM. Права, применимые к конкретному объекту, различаются в зависимости от типа объекта (таблица, функция и т. д.). Более подробная информация о значениях этих прав приведена ниже. В некоторых разделах и главах также будет описано, как используются эти права.

Право изменять или удалять объект является неотъемлемым правом владельца объекта и не может быть назначено или отозвано само по себе. (Однако, как и все права, это право может быть унаследовано членами роли-владельца; см. раздел Членство в роли.)

Объекту можно назначить нового владельца с помощью команды ALTER соответствующего объекту вида, например:

ALTER TABLE имя_таблицы OWNER TO новый_владелец;

Суперпользователи всегда могут это сделать; обычные роли могут делать это только в том случае, если они являются одновременно текущим владельцем объекта (или наследуют права владеющей роли) и могут выполнять команду SET ROLE для новой роли-владельца.

Для назначения прав используется команда GRANT. Например, если joe является существующей ролью, а accounts — существующей таблицей, право на изменение таблицы можно предоставить так:

GRANT UPDATE ON accounts TO joe;

Запись ALL вместо определенного права предоставляет все права, которые относятся к типу объекта.

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

Чтобы отозвать право, используйте подходящую команду REVOKE:

REVOKE ALL ON accounts FROM PUBLIC;

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

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

Доступные права:

SELECT
Позволяет выбирать с помощью SELECT любой или заданный столбец (или столбцы) таблицы, представления, материализованного представления или другого табличного объекта. Также позволяет использовать COPY TO. Это право также необходимо для обращения по ссылке на существующие значения столбца в UPDATE, DELETE или MERGE. Кроме того для последовательностей это право позволяет использовать функцию currval. Для больших объектов это право позволяет прочитать данные в объекте.

INSERT
Разрешает добавлять с помощью INSERT новую строку в таблицу, представление и т. д. Может быть предоставлено на заданные столбцы, и тогда в команде INSERT можно присваивать значения только этим столбцам (поэтому другие столбцы будут получать значения по умолчанию). Также позволяет использовать COPY FROM.

UPDATE
Разрешает изменять с помощью UPDATE любой или заданный столбец (или столбцы) таблицы, представления и т. д. (На практике любой нетривиальной команде UPDATE также потребуется право SELECT, поскольку она должна обращаться к столбцам таблицы, чтобы определить, какие строки изменять, и/или чтобы вычислить новые значения для столбцов.) Для команды SELECT ... FOR UPDATE и SELECT ... FOR SHARE, в дополнение к праву SELECT, также требуется это право как минимум для одного столбца. Для последовательностей это право позволяет использовать функции nextval и setval. Для больших объектов это право позволяет записывать данные в объект или опустошать его.

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

TRUNCATE
Позволяет опустошать таблицу с помощью TRUNCATE.

REFERENCES
Позволяет создать ограничение внешнего ключа, ссылающегося на таблицу или определенный столбец (или столбцы) таблицы.

TRIGGER
Позволяет создать триггер для таблицы, представления и т. д.

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

CONNECT
Позволяет правополучателю подключаться к базе данных. Это право проверяется при установлении соединения (в дополнение к проверке любых ограничений, налагаемых qhb_hba.conf).

TEMPORARY
Позволяет создавать временные таблицы при использовании конкретной базы данных.

EXECUTE
Позволяет вызывать функцию или процедуру, включая использование любых операторов, реализованных поверх функции. Это единственный тип прав, применимый к функциям и процедурам.

USAGE
Для процедурных языков позволяет использовать язык для создания функций на этом языке. Это единственный тип прав, применимый к процедурным языкам.
Для схем разрешает доступ к содержащимся в них объектам (при условии, что собственные требования к правам объектов также выполнены). По сути это позволяет правополучателю «искать» объекты в схеме. Без этого разрешения имена объектов все равно можно увидеть, например, запросив системные каталоги. Кроме того, после отзыва этого разрешения в существующих сеансах могут быть операторы, ранее выполнявшие этот поиск, так что этот способ предотвращения доступа к объекту не вполне безопасен.
Для последовательностей позволяет использовать функции currval и nextval.
Для типов и доменов позволяет использовать их при создании таблиц, функций и других объектов схемы. (Обратите внимание, что это право не управляет всем «использованием» данного типа, например, значениями типа, появляющимися в запросах. Оно только предотвращает создание объектов, зависящих от этого типа. В основном это право нужно для управления тем, какие пользователи могут создавать зависимости от типа, которые впоследствии могут помешать владельцу типа его изменить.)
Для оберток сторонних данных позволяет создавать с их помощью новые серверы.
Для сторонних серверов позволяет создавать с их помощью сторонние таблицы. Кроме того, правополучатели могут создавать, изменять или удалять свои собственные сопоставления пользователей, связанные с этим сервером.

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

ALTER SYSTEM
Позволяет настроить для параметра конфигурации сервера новое значение с помощью команды ALTER SYSTEM.

Права, требуемые для других команд, перечислены на справочных страницах соответствующих команд.

QHB по умолчанию предоставляет роли PUBLIC права для некоторых типов объектов при создании этих объектов. Для таблиц, столбцов таблиц, последовательностей, оберток сторонних данных, сторонних серверов, больших объектов, схем, табличных пространств или параметров конфигурации PUBLIC никаких прав по умолчанию не получает. Для других типов объектов правами по умолчанию, предоставляемыми PUBLIC, являются: CONNECT и TEMPORARY (создание временных таблиц) для баз данных; право EXECUTE для функций и процедур; право USAGE для языков и типов данных (включая домены). Разумеется, владелец объекта может отозвать с помощью REVOKE как права по умолчанию, так и права, предоставленные явно. (Для обеспечения максимальной безопасности выполните команду REVOKE в той же транзакции, где создается объект; тогда не образуется промежуток, во время которого другой пользователь может использовать этот объект). Кроме того, эти настройки прав по умолчанию можно изменить с помощью команды ALTER DEFAULT PRIVILEGES.

В Таблице 1 перечислены однобуквенные аббревиатуры, которые используются для этих типов прав в значениях ACL (Access Control List, список управления доступом). Эти буквы можно увидеть в выходных данных перечисленных ниже команд psql или при просмотре столбцов ACL системных каталогов.

Таблица 1. Аббревиатуры для прав в ACL

ПравоАббревиатураПрименимые типы объектов
SELECTr («read», чтение)LARGE OBJECT, SEQUENCE, TABLE (и табличные объекты), столбец таблицы
INSERTa («append», добавление)TABLE, столбец таблицы
UPDATEw («write», запись)LARGE OBJECT, SEQUENCE, TABLE, столбец таблицы
DELETEdTABLE
TRUNCATEDTABLE
REFERENCESxTABLE, столбец таблицы
TRIGGERtTABLE
CREATECDATABASE, SCHEMA, TABLESPACE
CONNECTcDATABASE
TEMPORARYTDATABASE
EXECUTEXFUNCTION, PROCEDURE
USAGEUDOMAIN, FOREIGN DATA WRAPPER, FOREIGN SERVER, LANGUAGE, SCHEMA, SEQUENCE, TYPE
SETsPARAMETER
ALTER SYSTEMAPARAMETER

В Таблице 2 сведены права, доступные для каждого типа объекта SQL, с использованием вышеприведенных аббревиатур. Кроме того, здесь перечислены команды psql, с помощью которых можно проверить настройки прав для каждого типа объекта.

Таблица 2. Сводка прав доступа

Тип объектаВсе праваПрава PUBLIC по умолчаниюКоманда psql
DATABASECTcTc\l
DOMAINUU\dD+
FUNCTION или PROCEDUREXX\df+
FOREIGN DATA WRAPPERUнет\dew+
FOREIGN SERVERUнет\des+
LANGUAGEUU\dL+
LARGE OBJECTrwнет\dl+
PARAMETERsAнет\dconfig+
SCHEMAUCнет\dn+
SEQUENCErwUнет\dp
TABLE (и табличные объекты)arwdDxtнет\dp
Столбец таблицыarwxнет\dp
TABLESPACECнет\db+
TYPEUU\dT+

Права, которые были предоставлены для определенного объекта, отображаются в виде списка записей aclitem, каждая из которых имеет такой формат:

правополучатель=аббревиатура-права[*].../праводатель

В каждой записи aclitem перечислены все разрешения одного правополучателя, которые были предоставлены конкретным праводателем. Конкретные права представлены однобуквенными аббревиатурами из Таблицы 1 с добавлением символа *, если право было предоставлено с возможностью передачи. Например, calvin=r*w/hobbes указывает, что роль calvin имеет право SELECT (r) с возможностью его передачи (*), а также не подлежащее передаче право UPDATE (w), и оба они предоставлены ролью hobbes. Если calvin также имеет некоторые права на тот же объект, предоставленные другим праводателем, они будут отображаться в виде отдельной записи aclitem. Пустое поле правополучателя в aclitem означает роль PUBLIC.

В качестве примера предположим, что пользователь miriam создает таблицу mytable и выполняет:

GRANT SELECT ON mytable TO PUBLIC;
GRANT SELECT, UPDATE, INSERT ON mytable TO admin;
GRANT SELECT (col1), UPDATE (col1) ON mytable TO miriam_rw;

Тогда команда psql \dp покажет:

=> \dp mytable
                                  Access privileges
 Schema |  Name   | Type  |   Access privileges   |   Column privileges   | Policies
--------+---------+-------+-----------------------+-----------------------+----------
 public | mytable | table | miriam=arwdDxt/miriam+| col1:                +|
        |         |       | =r/miriam            +|   miriam_rw=rw/miriam |
        |         |       | admin=arw/miriam      |                       |
(1 row)

Если столбец «Access privileges» (права доступа) для данного объекта пуст, это означает, что на объект имеются права по умолчанию (то есть запись его прав в соответствующем системном каталоге равна NULL). Права по умолчанию всегда включают все права для владельца и могут включать некоторые права для PUBLIC в зависимости от типа объекта, как описано выше. Первая команда GRANT или REVOKE для объекта инстанцирует права по умолчанию (создав, например, miriam=arwdDxt/miriam), а затем изменит их согласно указанному запросу. Аналогично записи в «Column privileges» (права для столбцов) отображаются только для столбцов с правами не по умолчанию. (Примечание: для этой цели «права по умолчанию» всегда означают встроенные права по умолчанию для типа объекта. Объект, у которого права были изменены командой ALTER DEFAULT PRIVILEGES, всегда будет отображаться с явной записью прав, включающей эффекты команды ALTER).

Обратите внимание, что неявные возможности владельца передавать права в отображении прав доступа не отмечаются. А знак * появится, только когда возможности передачи прав были кому-либо предоставлены явно.