GRANT

Определяет права доступа.

Обзор

GRANT { {SELECT | INSERT | UPDATE | DELETE | REFERENCES |
TRIGGER | TRUNCATE } [, ...] | ALL [PRIVILEGES] }
    ON { [TABLE] table_name [, ...]
         | ALL TABLES IN SCHEMA schema_name [, ...] }
    TO { [ GROUP ] role_name | PUBLIC} [, ...] [ WITH GRANT OPTION ]

GRANT { { SELECT | INSERT | UPDATE | REFERENCES } ( column_name [, ...] )
    [, ...] | ALL [ PRIVILEGES ] ( column_name [, ...] ) }
    ON [ TABLE ] table_name [, ...]
    TO { role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]

GRANT { {USAGE | SELECT | UPDATE} [, ...] | ALL [PRIVILEGES] }
    ON { SEQUENCE sequence_name [, ...]
         | ALL SEQUENCES IN SCHEMA schema_name [, ...] }
    TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]

GRANT { {CREATE | CONNECT | TEMPORARY | TEMP} [, ...] | ALL
[PRIVILEGES] }
    ON DATABASE database_name [, ...]
    TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]

GRANT { USAGE | ALL [ PRIVILEGES ] }
    ON DOMAIN domain_name [, ...]
    TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]

GRANT { USAGE | ALL [ PRIVILEGES ] }
    ON FOREIGN DATA WRAPPER fdw_name [, ...]
    TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]

GRANT { USAGE | ALL [ PRIVILEGES ] }
    ON FOREIGN SERVER server_name [, ...]
    TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]

GRANT { EXECUTE | ALL [PRIVILEGES] }
    ON { FUNCTION function_name ( [ [ argmode ] [ argname ] argtype [, ...]
] ) [, ...]
         | ALL FUNCTIONS IN SCHEMA schema_name [, ...] }
    TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]

GRANT { USAGE | ALL [PRIVILEGES] }
    ON LANGUAGE lang_name [, ...]
    TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]

GRANT { { CREATE | USAGE } [, ...] | ALL [PRIVILEGES] }
    ON SCHEMA schema_name [, ...]
    TO { [ GROUP ] role_name | PUBLIC} [, ...] [ WITH GRANT OPTION ]

GRANT { CREATE | ALL [PRIVILEGES] }
    ON TABLESPACE tablespace_name [, ...]
    TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]

GRANT { USAGE | ALL [ PRIVILEGES ] }
    ON TYPE type_name [, ...]
    TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]

GRANT parent_role [, ...]
    TO member_role [, ...] [WITH ADMIN OPTION]

GRANT { SELECT | INSERT | ALL [PRIVILEGES] }
    ON PROTOCOL protocolname
    TO username

Описание

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

Команда GRANT имеет две основные формы: одна предоставляет привилегии на объекты базы данных (таблицы, столбцы, представления, внешние таблицы, последовательности, базы данных, внешние обёртки данных, внешние серверы, функции, процедурные языки, схемы или табличные пространства), а другая — членство в роли.

GRANT для объекта базы данных

Эта форма команды GRANT предоставляет определённую привилегию на объект базы данных одной или нескольким ролям. Эти привилегии будут добавлены к уже предоставленным, если таковые имеются.

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

Ключевое слово PUBLIC означает, что привилегии предоставляются всем ролям, включая те, которые могут быть созданы позже. PUBLIC можно рассматривать как неявно определённую роль уровня группы, которая всегда содержит все роли. Конкретная роль будет иметь сумму привилегий, предоставленных ей напрямую, привилегий, предоставленных ролям, в которых она состоит, и привилегий, предоставленных PUBLIC.

Если указан параметр WITH GRANT OPTION, получатели привилегий могут в свою очередь предоставлять их другим. Без опции передачи получатель не сможет этого сделать. Опция передачи не может быть предоставлена PUBLIC.

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

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

База данных YMatrix предоставляет определённые типы объектов по умолчанию привилегии PUBLIC. По умолчанию привилегии на таблицы, столбцы таблиц, последовательности, внешние обёртки данных, внешние серверы, большие объекты, схемы или табличные пространства не предоставляются PUBLIC. Для других типов объектов привилегии по умолчанию, предоставляемые PUBLIC, следующие:

  • CONNECT и TEMPORARY (создание временных таблиц) для базы данных,
  • EXECUTE для функций,
  • USAGE для языков и типов данных (включая домены).

Разумеется, владельцы объектов могут выполнить REVOKE для стандартных и явно предоставленных привилегий. (Для максимальной безопасности выполняйте REVOKE в той же транзакции, где был создан объект; таким образом, исключается временной интервал, когда другие пользователи могут воспользоваться объектом.)

GRANT для роли

Эта форма команды GRANT предоставляет членство в роли одной или нескольким другим ролям. Членство в роли важно, потому что оно может передавать привилегии, предоставленные роли, каждому её участнику.

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

В отличие от случаев с привилегиями, членство в роли нельзя предоставить PUBLIC.

GRANT для протокола

Вы также можете использовать команду GRANT для указания, какие пользователи могут обращаться к доверенным протоколам. (Если протокол не является доверенным, вы не можете предоставить другим пользователям разрешение на использование его для чтения или записи данных.)

Чтобы разрешить пользователям создавать внешние таблицы для чтения с использованием доверенных протоколов:

GRANT SELECT ON PROTOCOL protocolname TO username

Чтобы разрешить пользователям создавать внешние таблицы для записи с использованием доверенных протоколов:

GRANT INSERT ON PROTOCOL protocolname TO username

Чтобы разрешить пользователям создавать внешние таблицы для чтения и записи с использованием доверенных протоколов:

GRANT ALL ON PROTOCOL protocolname TO username

Вы также можете использовать эту команду для предоставления пользователям разрешения на создание и использование внешних таблиц s3 и pxf. Однако внешние таблицы типов http, https, gpfdist и gpfdists реализованы внутри базы данных YMatrix, а не как пользовательские протоколы. Для этих типов используйте команду CREATE ROLE или ALTER ROLE, чтобы установить атрибут CREATEEXTTABLE или NOCREATEEXTTABLE для каждого пользователя.

Параметры

SELECT

  • Разрешает SELECT из любого столбца указанной таблицы, представления или последовательности или из перечисленных конкретных столбцов. Также разрешает COPY TO. Эта привилегия также необходима для ссылки на существующие значения столбцов в UPDATE или DELETE.

INSERT

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

UPDATE

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

DELETE

  • Разрешает удаление строк из указанной таблицы.

REFERENCES

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

TRIGGER

  • Разрешает создание триггеров на указанной таблице. Примечание: База данных YMatrix не поддерживает триггеры.

TRUNCATE

  • Разрешает TRUNCATE всех строк в указанной таблице.

CREATE

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

CONNECT

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

TEMPORARY

TEMP

  • Разрешает создание временных таблиц при использовании базы данных.

EXECUTE

  • Разрешает использование указанных функций и любых операторов, реализованных на основе этой функции. Это единственный тип привилегии, применимый к функциям. (Этот синтаксис также применяется к агрегатным функциям.)

USAGE

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

ALL PRIVILEGES

  • Предоставляет все доступные привилегии одновременно. Ключевое слово PRIVILEGES в базе данных YMatrix является необязательным, несмотря на строгие требования SQL.

PUBLIC

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

WITH GRANT OPTION

  • Получатель привилегии может в свою очередь предоставлять её другим.

WITH ADMIN OPTION

  • Участники роли могут в свою очередь предоставлять членство другим.

Замечания

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

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

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

GRANT и REVOKE могут выполняться не только владельцем затронутого объекта, но и требуют, чтобы исполнитель был членом роли, владеющей объектом, или членом роли, владеющей привилегией WITH GRANT OPTION для объекта. В этом случае привилегия будет записана как предоставленная ролью, фактически владеющей объектом или имеющей привилегию WITH GRANT OPTION.

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

Команда GRANT не может использоваться для установки привилегий для протоколов файлов, gpfdist или gpfdists. Эти протоколы реализованы внутри базы данных YMatrix. Вместо этого используйте команду CREATE ROLE или ALTER ROLE для установки свойства CREATEEXTTABLE роли.

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

Примеры

Предоставить права на вставку всем ролям для таблицы mytable:

GRANT INSERT ON mytable TO PUBLIC;

Предоставить все доступные привилегии ролям sally в представлении topten. Обратите внимание, что если вышеуказанная команда действительно выполняется суперпользователем или владельцем topten, будут предоставлены все привилегии, а при выполнении другими пользователями — только те привилегии, которыми они обладают с опцией передачи.

GRANT ALL PRIVILEGES ON topten TO sally;

Предоставить членство в роли admins пользователю joe:

GRANT admins TO joe;

Совместимость

Ключевое слово PRIVILEGES требуется в стандарте SQL, но является необязательным в базе данных YMatrix. Стандарт SQL не поддерживает установку привилегий на несколько объектов за одну команду.

База данных YMatrix позволяет владельцам объектов отзывать свои обычные привилегии: например, владелец таблицы может сделать таблицу доступной только для чтения, отозвав у себя привилегии INSERT, UPDATE, DELETE и TRUNCATE. Согласно стандарту SQL, это невозможно. База данных YMatrix рассматривает привилегии владельца как предоставленные ему самим собой; поэтому он может их и отозвать. В стандарте SQL привилегии владельца предоставляются предполагаемой системной сущностью.

Стандарт SQL предусматривает привилегию USAGE для других типов объектов: наборы символов, правила сортировки, преобразования.

В стандарте SQL последовательности имеют только привилегию USAGE, которая контролирует использование выражений NEXT VALUE FOR, эквивалентных функции nextval в базе данных YMatrix. Привилегии SELECT и UPDATE для последовательностей являются расширением YMatrix. Применение привилегии USAGE для последовательностей к функции currval также является расширением YMatrix (как и сама функция).

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

Смотрите также

REVOKE