При создании объекта ему назначается владелец. Обычно владельцем является роль, которая выполнила оператор создания. Для большинства видов объектов начальное состояние таково, что только владелец (или суперпользователь) может что-либо делать с объектом. Чтобы разрешить другим ролям использовать его, должны быть предоставлены привилегии .
Существуют различные виды привилегий: 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
Privilege | Abbreviation | Applicable Object Types |
---|---|---|
SELECT | r (“read”) | LARGE OBJECT , SEQUENCE , TABLE (and table-like objects), table column |
INSERT | a (“append”) | TABLE , table column |
UPDATE | w (“write”) | LARGE OBJECT , SEQUENCE , TABLE , table column |
DELETE | d | TABLE |
TRUNCATE | D | TABLE |
REFERENCES | x | TABLE , table column |
TRIGGER | t | TABLE |
CREATE | C | DATABASE , SCHEMA , TABLESPACE |
CONNECT | c | DATABASE |
TEMPORARY | T | DATABASE |
EXECUTE | X | FUNCTION , PROCEDURE |
USAGE | U | DOMAIN , FOREIGN DATA WRAPPER , FOREIGN SERVER , LANGUAGE , SCHEMA , SEQUENCE , TYPE |
Сводка прав доступа
Object Type | All Privileges | Default PUBLIC Privileges | psql Command |
---|---|---|---|
DATABASE | CTc | Tc | \l |
DOMAIN | U | U | \dD+ |
FUNCTION or PROCEDURE | X | X | \df+ |
FOREIGN DATA WRAPPER | U | none | \dew+ |
FOREIGN SERVER | U | none | \des+ |
LANGUAGE | U | U | \dL+ |
LARGE OBJECT | rw | none | |
SCHEMA | UC | none | \dn+ |
SEQUENCE | rwU | none | \dp |
TABLE (and table-like objects) | arwdDxt | none | \dp |
Table column | arwx | none | \dp |
TABLESPACE | C | none | \db+ |
TYPE | U | U | \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 *
появится только в том случае, если кому-то были явно предоставлены параметры гранта.
0 комментариев