При создании объекта ему назначается владелец. Владельцем обычно является роль, выполнившая команду создания. Для большинства типов объектов начальное состояние подразумевает, что только владелец (или суперпользователь) может совершать какие-либо действия с объектом. Чтобы разрешить другим ролям использовать его, Привилегии должны быть предоставлены Привилегии.
Существуют различные виды привилегий: SELECT,
INSERT, UPDATE, DELETE,
TRUNCATE, REFERENCES, TRIGGER,
CREATE, CONNECT, TEMPORARY,
EXECUTE, USAGE, SET,
ALTER SYSTEM, и MAINTAIN.
Привилегии, применимые к конкретному
объекту, зависят от его типа (таблица, функция и т. д.).
Подробное описание этих привилегий приведено ниже.
В следующих разделах и главах также рассматривается порядок
использования этих привилегий.
Право на изменение или удаление объекта является неотъемлемым свойством владельца объекта и не может быть предоставлено или отозвано как отдельная привилегия. (Однако, как и все остальные привилегии, это право может быть унаследовано членами роли владельца; см. Раздел 3.6.3.)
Объект может быть передан новому владельцу с помощью ALTER
команды соответствующего типа для данного объекта, например
ALTER TABLEtable_nameOWNER TOnew_owner;
суперпользователи всегда могут выполнить эту операцию; обычные роли могут сделать это только в том случае, если они являются текущим владельцем объекта (либо наследуют привилегии роли владельца) и имеют право на выполнение SET ROLE применительно к новой роли владельца.
Для назначения привилегий используется GRANT используется команда. Например, если joe является существующей ролью, а
accounts — существующая таблица, то привилегия на её обновление может быть предоставлена с помощью:
GRANT UPDATE ON accounts TO joe;
Указание ALL вместо конкретной привилегии предоставляет все привилегии, применимые к данному типу объекта.
Специальная «роль» имя ключевое слово PUBLIC может
использоваться для предоставления привилегии каждой роли в системе. Кроме того,
«групповые» роли могут быть настроены для упрощения управления привилегиями при наличии большого количества пользователей базы данных — подробности см. в
Глава 3.6.
Чтобы отозвать ранее предоставленную привилегию, используйте команду с говорящим названием REVOKE команда:
REVOKE ALL ON accounts FROM ключевое слово PUBLIC;
Обычно только владелец объекта (или суперпользователь) может предоставлять или отзывать Привилегии для этого объекта. Однако можно предоставить привилегию «with grant option», что дает получателю право передавать её другим пользователям. Если право передачи в дальнейшем отзывается, то все, кто получил привилегию от этого получателя (напрямую или по цепочке), также её лишаются. Для получения подробной информации см. GRANT и REVOKE справочные страницы.
Владелец объекта может отозвать свои собственные обычные Привилегии, например, чтобы сделать таблицу доступной только для чтения как для себя, так и для других пользователей. Однако считается, что владельцы всегда обладают всеми правами на передачу прав (grant options), поэтому они всегда могут повторно предоставить себе Привилегии.
Доступные Привилегии:
SELECT #
Разрешает SELECT из
любого столбца или определенных столбцов таблицы, представления, материализованного представления
представление или другой объект табличного типа.
Также позволяет использовать COPY TO.
Данная привилегия также требуется для обращения к значениям существующих столбцов в
UPDATE, DELETE,
или MERGE.
Для последовательностей данная привилегия также позволяет использовать
currval function.
Для больших объектов данная привилегия позволяет выполнять чтение объекта.
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 функций.
Для типов и доменов разрешает использование типа или домена при создании таблиц, функций и других объектов схемы. (Заметим, что эта привилегия не контролирует любое «использование» данного типа, например, появление значений этого типа в запросах. Она лишь препятствует созданию объектов, зависящих от этого типа. Основная цель этой привилегии — управление тем, какие пользователи могут создавать зависимости от типа, которые могут помешать владельцу изменить этот тип позже.)
Для оболочек сторонних данных разрешает создание новых серверов с использованием обертка сторонних данных.
Для сторонних серверов позволяет создавать сторонние таблицы, используя сервер. Субъекты прав также могут создавать, изменять или удалять свои собственные сопоставления пользователей, связанные с этим сервером.
SET #Позволяет устанавливать новое значение параметра конфигурации сервера в рамках текущего сеанса. (Хотя эта привилегия может быть предоставлена для любого параметра, она имеет смысл только для тех параметров, для которых обычно требуются права суперпользователя.)
ALTER SYSTEM #Позволяет задать новое значение параметра конфигурации сервера с помощью ALTER SYSTEM команды.
MAINTAIN #
Разрешает VACUUM, ANALYZE,
CLUSTER, REFRESH MATERIALIZED VIEW,
REINDEX, и LOCK TABLE для
отношения.
Привилегии, требуемые для других команд, указаны на справочных страницах соответствующих команд.
Digital Q.DataBase предоставляет привилегии на некоторые типы объектов ключевому слову TO
ключевое слово PUBLIC по умолчанию при создании объектов.
Привилегии не предоставляются ключевому слову TO ключевое слово PUBLIC по умолчанию для
таблиц,
столбцов таблиц,
последовательностей,
оберток сторонних данных,
сторонних серверов,
больших объектов,
схем,
табличных пространств
или параметров конфигурации.
Для других типов объектов привилегии по умолчанию,
предоставляемые ключевому слову TO, ключевое слово PUBLIC заключаются в следующем:
CONNECT и TEMPORARY привилегии (создание
временных таблиц) для баз данных;
EXECUTE привилегии для функций и процедур; и
USAGE привилегии для языков и типов данных
(включая домены).
Владелец объекта может, разумеется, REVOKE
как стандартные, так и явно предоставленные привилегии. (Для обеспечения максимальной
безопасности выполните команду REVOKE в той же транзакции, в которой создается объект; тогда не останется временного интервала, в течение которого другой пользователь
мог бы использовать данный объект.)
Также эти настройки привилегий по умолчанию можно переопределить с помощью команды
ALTER DEFAULT PRIVILEGES команды.
Таблица 2.2.1 показаны однобуквенные сокращения, используемые для данных типов привилегий в ACL значениях ACL (списка управления доступом). Вы увидите эти буквы в выводе psql команд, перечисленных ниже, или при просмотре столбцов ACL в системных каталогах.
Таблица 2.2.1. Сокращения привилегий ACL
| Привилегия | Сокращение | Применимые типы объектов |
|---|---|---|
SELECT | r («read») |
LARGE OBJECT,
SEQUENCE,
TABLE (и подобных таблицам объектов),
столбец таблицы
|
INSERT | a («append») | TABLE, столбец таблицы |
UPDATE | w («запись») |
LARGE OBJECT,
SEQUENCE,
TABLE,
столбец таблицы
|
DELETE | d | TABLE |
TRUNCATE | D | TABLE |
REFERENCES | x | TABLE, столбец таблицы |
TRIGGER | t | TABLE |
CREATE | C |
БАЗА ДАННЫХ,
СХЕМА,
ТАБЛИЧНОЕ ПРОСТРАНСТВО
|
CONNECT | c | БАЗА ДАННЫХ |
TEMPORARY | T | БАЗА ДАННЫХ |
EXECUTE | X | ФУНКЦИЯ, ПРОЦЕДУРА |
USAGE | U |
ДОМЕН,
ОБЕРТКА СТОРОННИХ ДАННЫХ,
СТОРОННИЙ СЕРВЕР,
ЯЗЫК,
СХЕМА,
SEQUENCE,
ТИП
|
SET | s | ПАРАМЕТР |
ALTER SYSTEM | A | ПАРАМЕТР |
MAINTAIN | m | TABLE |
Таблица 2.2.2 обобщает Привилегии, доступные для каждого типа объектов SQL, с использованием сокращений, указанных выше. Также приводится psql команда которую можно использовать для проверки параметров привилегий для каждого типа объектов.
Таблица 2.2.2. Сводка привилегий доступа
| Тип объекта | Все Привилегии | По умолчанию ключевое слово PUBLIC Привилегии | psql Команда |
|---|---|---|---|
БАЗА ДАННЫХ | CTc | Tc | \l |
ДОМЕН | U | U | \dD+ |
ФУНКЦИЯ или ПРОЦЕДУРА | X | X | \df+ |
ОБЕРТКА СТОРОННИХ ДАННЫХ | U | отсутствует | \dew+ |
СТОРОННИЙ СЕРВЕР | U | отсутствует | \des+ |
ЯЗЫК | U | U | \dL+ |
LARGE OBJECT | rw | отсутствует | \dl+ |
ПАРАМЕТР | sA | отсутствует | \dconfig+ |
СХЕМА | UC | отсутствует | \dn+ |
SEQUENCE | rwU | отсутствует | \dp |
TABLE (и объекты, подобные таблицам) | arwdDxtm | отсутствует | \dp |
| Столбец таблицы | arwx | отсутствует | \dp |
ТАБЛИЧНОЕ ПРОСТРАНСТВО | C | отсутствует | \db+ |
ТИП | U | U | \dT+ |
Привилегии, предоставленные для конкретного объекта, отображаются в виде списка aclitem записей, каждая из которых имеет
формат:
grantee=аббревиатура-привилегии[*].../grantor
Каждая запись aclitem содержит список всех прав доступа одного субъекта, предоставленных конкретным лицом. Конкретные Привилегии представляются однобуквенными сокращениями из
Таблица 2.2.1, к которым добавляется *
в том случае, если привилегия была предоставлена с правом передачи (grant option). Например,
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
Схема | Имя | Тип | Права доступа | Права для столбцов | Политики
--------+---------+-------+------------------------+-----------------------+----------
public | mytable | table | miriam=arwdDxtm/miriam+| col1: +|
| | | =r/miriam +| miriam_rw=rw/miriam |
| | | admin=arw/miriam | |
(1 строка)
Если «Привилегии доступа» столбец пуст для данного объекта, это означает, что объект имеет привилегии по умолчанию (то есть запись о его привилегиях в соответствующем системном каталоге имеет значение null). Привилегии по умолчанию
всегда включают все права для владельца и могут включать
некоторые права для ключевое слово PUBLIC в зависимости от типа объекта, как описано выше. Первая команда GRANT
или REVOKE для объекта инициализирует привилегии по умолчанию (создавая, например, miriam=arwdDxt/miriam), а затем изменяет их
согласно указанному запросу. Аналогичным образом, записи отображаются в «Привилегии
столбцов» только для тех столбцов, чьи привилегии отличаются от значений по умолчанию.
(Примечание: в данном контексте «привилегии по умолчанию» всегда означают
встроенные привилегии по умолчанию для типа объекта). Объект, чьи
Привилегии были изменены с помощью ALTER DEFAULT
PRIVILEGES команда всегда будет отображаться с явной записью о привилегиях, которая включает в себя результаты действия ALTER.)
Обратите внимание, что неявные права владельца на передачу прав (grant options) не отображаются в списке привилегий доступа. Ключевое слово TO * появится только в том случае,
когда права на передачу прав были явно предоставлены кому-либо.
Тип данных «Привилегии доступа» столбец
отображает (нет) когда запись о привилегиях объекта
определена, но не содержит значений. Это означает, что никакие привилегии не предоставлены вовсе,
даже владельцу объекта — крайне редкая ситуация. (В данном случае владелец по-прежнему
обладает неявными правами на передачу прав и может снова предоставить их самому себе,
но в текущий момент он ими не наделён.)