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

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

Право изменять или уничтожать объект присуще владельцу объекта и не может быть предоставлено или отозвано само по себе.

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

ALTER TABLE table_name OWNER TO new_owner;

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

Для назначения привилегий используется команда 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. Для последовательностей эта привилегия также позволяет использовать 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Позволяет грантополучателю подключаться к базе данных. Эта привилегия проверяется при запуске соединения (в дополнение к проверке любых ограничений, наложенных pg_hba.conf).
  • TEMPORARYПозволяет создавать временные таблицы при использовании базы данных.
  • EXECUTEПозволяет вызывать функцию или процедуру, включая использование любых операторов, реализованных поверх функции. Это единственный тип привилегий, применимый к функциям и процедурам.
  • USAGEДля процедурных языков позволяет использовать язык для создания функций на этом языке. Это единственный тип привилегий, применимый к процедурным языкам. Для схем разрешает доступ к объектам, содержащимся в схеме (при условии, что собственные требования к привилегиям объектов также соблюдены). По сути, это позволяет получателю гранта « искать » объекты в схеме. Без этого разрешения по-прежнему можно увидеть имена объектов, например, запросив системные каталоги. Кроме того, после отзыва этого разрешения существующие сеансы могут иметь операторы, которые ранее выполняли этот поиск, поэтому это не совсем безопасный способ предотвращения доступа к объектам. Для последовательностей позволяет использовать функции currvalи nextval. Для типов и доменов позволяет использовать тип или домен при создании таблиц, функций и других объектов схемы. (Обратите внимание, что эта привилегия не контролирует все « использование » типа, например, значения типа, появляющиеся в запросах. Она только предотвращает создание объектов, зависящих от типа. Основная цель этой привилегии — контролировать, какие пользователи могут создавать зависимости от типа, что может помешать владельцу впоследствии изменить тип.) Для оболочек сторонних данных позволяет создавать новые серверы с использованием оболочки сторонних данных. Для внешних серверов позволяет создавать внешние таблицы с использованием сервера. Получатели грантов также могут создавать, изменять или удалять свои собственные сопоставления пользователей, связанные с этим сервером.

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

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

Сокращения привилегий ACL

PrivilegeAbbreviationApplicable Object Types
SELECTr (“read”)LARGE OBJECT, SEQUENCE, TABLE (and table-like objects), table column
INSERTa (“append”)TABLE, table column
UPDATEw (“write”)LARGE OBJECT, SEQUENCE, TABLE, table column
DELETEdTABLE
TRUNCATEDTABLE
REFERENCESxTABLE, table column
TRIGGERtTABLE
CREATECDATABASE, SCHEMA, TABLESPACE
CONNECTcDATABASE
TEMPORARYTDATABASE
EXECUTEXFUNCTION, PROCEDURE
USAGEUDOMAIN, FOREIGN DATA WRAPPER, FOREIGN SERVER, LANGUAGE, SCHEMA, SEQUENCE, TYPE

Сводка прав доступа

Object TypeAll PrivilegesDefault PUBLIC Privilegespsql Command
DATABASECTcTc\l
DOMAINUU\dD+
FUNCTION or PROCEDUREXX\df+
FOREIGN DATA WRAPPERUnone\dew+
FOREIGN SERVERUnone\des+
LANGUAGEUU\dL+
LARGE OBJECTrwnone 
SCHEMAUCnone\dn+
SEQUENCErwUnone\dp
TABLE (and table-like objects)arwdDxtnone\dp
Table columnarwxnone\dp
TABLESPACECnone\db+
TYPEUU\dT+

Привилегии, предоставленные конкретному объекту, отображаются в виде списка aclitemзаписей, каждая из которых aclitemописывает разрешения одного получателя прав, предоставленные конкретным лицом, предоставившим право. Например, 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)

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

Обратите внимание, что параметры неявного предоставления владельца не отмечены на экране привилегий доступа. A *появится только в том случае, если кому-то были явно предоставлены параметры гранта.