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>
Описание
Greengage DB объединяет концепции пользователей и групп в единую сущность — роль.
Поэтому использование ключевого слова GROUP для определения, является ли получатель пользователем или группой, необязательно.
GROUP по-прежнему допускается в команде, но является избыточным.
Команда GRANT имеет два основных варианта: для выдачи привилегий на объекты базы данных (таблица, столбец, представление, сторонняя таблица, последовательность, база данных, обертка сторонних данных, сторонний сервер, функция, процедурный язык, схема или табличное пространство) и для предоставления членства в роли.
GRANT для объектов базы данных
Этот вариант команды GRANT позволяет предоставлять определенные привилегии на объект базы данных одной или нескольким ролям.
Если привилегии уже были предоставлены, новые добавляются к существующим.
Также можно предоставить привилегии на все объекты одного типа в пределах одной или нескольких схем.
Эта возможность поддерживается только для таблиц, последовательностей и функций (при этом ALL TABLES включает также представления и сторонние таблицы).
Ключевое слово PUBLIC указывает, что привилегии предоставляются всем ролям, включая те, которые будут созданы в будущем.
PUBLIC можно рассматривать как неявно определенную групповую роль, которая всегда включает все существующие роли.
Любая конкретная роль получает совокупность привилегий: предоставленных ей напрямую, предоставленных любой роли, членом которой она является, а также привилегий, предоставленных PUBLIC.
Если указан параметр WITH GRANT OPTION, получатель привилегии может предоставлять ее другим ролям.
Без этого параметра такая возможность отсутствует.
Обратите внимание, что WITH GRANT OPTION нельзя использовать для PUBLIC.
Владелец объекта (обычно роль, создавшая объект) автоматически обладает всеми привилегиями, поэтому предоставлять их владельцу не требуется. Тем не менее владелец может отозвать часть своих собственных привилегий в целях безопасности.
Право удалять объект или изменять его определение не считается передаваемой привилегией: оно присуще владельцу и не может быть предоставлено или отозвано.
Аналогичный эффект можно получить, предоставив или отозвав членство в роли, которой принадлежит объект.
Владелец неявно обладает всеми привилегиями с параметром WITH GRANT OPTION для своего объекта.
Greengage DB предоставляет некоторые привилегии 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, gpfdist и gpfdists реализованы внутри Greengage DB, а не как пользовательские протоколы.
Для этих типов следует использовать CREATE ROLE или ALTER ROLE, чтобы установить атрибут CREATEEXTTABLE или NOCREATEEXTTABLE для конкретного пользователя.
Синтаксис и примеры см. в CREATE ROLE.
Параметры
| Параметр | Описание |
|---|---|
SELECT |
Разрешает выполнение |
INSERT |
Разрешает вставку ( |
UPDATE |
Разрешает обновление ( |
DELETE |
Разрешает удалять строки ( |
REFERENCES |
Принято для совместимости, хотя ограничения внешнего ключа не поддерживаются в Greengage DB. Для создания ограничения внешнего ключа необходимо иметь эту привилегию как для ссылающихся, так и для указанных столбцов. Привилегия может быть предоставлена для всех столбцов таблицы или только для выбранных |
TRIGGER |
Разрешает создание триггера для указанной таблицы. ПРИМЕЧАНИЕ
Greengage DB не поддерживает пользовательские триггеры. Дополнительную информацию см. в CREATE TRIGGER. |
TRUNCATE |
Разрешает удаление всех строк из указанной таблицы командой |
CREATE |
Для баз данных разрешает создание новых схем. Для схем — создание новых объектов в схеме. Чтобы переименовать существующий объект, необходимо владеть объектом и иметь эту привилегию для схемы, содержащей объект. Для табличных пространств разрешает создание таблиц и индексов, а также создание баз данных с этим табличным пространством по умолчанию. Отзыв привилегии не изменяет размещение существующих объектов |
CONNECT |
Разрешает подключение к указанной базе данных. Проверяется при запуске подключения (в дополнение к проверке настроек pg_hba.conf) |
TEMPORARY |
Разрешает создание временных таблиц в базе данных |
EXECUTE |
Разрешает использование указанной функции и использование любых операторов, реализованных на основе этой функции. Это единственный тип привилегии, применимый к функциям. Данный синтаксис работает и для агрегатных функций |
USAGE |
Для процедурных языков разрешает использование указанного языка для создания функций на этом языке. Это единственный тип привилегии, применимый к процедурным языкам. Для схемы разрешает доступ к объектам, содержащимся в ней (при условии, что требования к привилегиям самих объектов также выполнены). По сути, это позволяет получателю просматривать объекты внутри схемы. Для последовательностей эта привилегия разрешает использование функций Для типов и доменов эта привилегия разрешает использовать тип или домен при создании таблиц, функций и других объектов схемы. Она не контролирует общее использование типа, например, появление значений этого типа в запросах. Привилегия предотвращает только создание объектов, зависящих от типа. Ее основная цель — ограничить, какие пользователи могут создавать зависимости от типа, что позволяет владельцу в дальнейшем изменять тип без конфликтов. Для оберток сторонних данных эта привилегия позволяет пользователю создавать новые серверы с использованием данной обертки. Для серверов привилегия разрешает пользователю создавать сторонние таблицы с использованием сервера, а также управлять собственными сопоставлениями пользователей, связанными с этим сервером (создавать, изменять и удалять их) |
ALL PRIVILEGES |
Предоставляет все доступные привилегии одновременно.
Ключевое слово |
PUBLIC |
Специальная групповая роль, означающая, что привилегии предоставляются всем ролям, включая те, которые могут быть созданы в будущем |
WITH GRANT OPTION |
Получатель привилегии может в свою очередь предоставлять ее другим пользователям |
WITH ADMIN OPTION |
Член роли может предоставлять членство в роли другим пользователям |
Примечания
Пользователь может выполнять SELECT, INSERT и другие операции над столбцом, если у него есть эта привилегия либо для конкретного столбца, либо для всей таблицы.
Предоставление привилегии на уровне таблицы с последующим ее отзывом для одного столбца не приведет к ожидаемому результату: предоставление на уровне таблицы не затрагивается операцией на уровне столбца.
Суперпользователи базы данных могут получать доступ ко всем объектам независимо от настроек привилегий на объекты. Одно исключение из этого правила — объекты представлений. Доступ к таблицам, на которые ссылается представление, определяется разрешениями владельца представления, а не текущего пользователя (даже если текущий пользователь является суперпользователем).
Если суперпользователь выполняет команду GRANT или REVOKE, она обрабатывается так, как если бы ее выполнил владелец соответствующего объекта.
В частности, привилегии, предоставленные этой командой, считаются выданными владельцем объекта.
Для членства в роли такие операции считаются выполненными от имени самой содержащей роли.
GRANT и REVOKE также могут быть выполнены ролью, которая не является владельцем затронутого объекта, но является членом роли, которая владеет объектом, или является членом роли, которая имеет привилегии WITH GRANT OPTION на объект.
В этом случае привилегии будут записаны как предоставленные ролью, которая фактически владеет объектом или имеет привилегии WITH GRANT OPTION.
Предоставление разрешения на таблицу не распространяется автоматически на любые последовательности, используемые таблицей, включая последовательности, привязанные к столбцам SERIAL.
Разрешения на последовательность должны быть установлены отдельно.
Команду GRANT нельзя использовать для установки привилегий для протоколов file, gpfdist или gpfdists.
Эти протоколы реализованы внутри Greengage DB.
Вместо этого используйте команду CREATE ROLE или ALTER ROLE для установки атрибута CREATEEXTTABLE для роли.
Используйте метакоманду psql \dp для получения информации о существующих привилегиях для таблиц и столбцов.
Для отображения привилегий объектов, не являющихся таблицами, можно использовать другие метакоманды \d.
Примеры
Предоставление привилегии INSERT всем ролям для таблицы mytable:
GRANT INSERT ON mytable TO PUBLIC;
Предоставление всех доступных привилегий роли sally для представления topten.
Обратите внимание, что хотя приведенная команда действительно предоставит все привилегии при выполнении суперпользователем или владельцем topten — при выполнении пользователем, который не является суперпользователем и не владеет объектом, будут предоставлены только привилегии, для которых предоставляющая роль имеет параметр WITH GRANT OPTION.
GRANT ALL PRIVILEGES ON topten TO sally;
Предоставление членства в роли admins пользователю joe:
GRANT admins TO joe;
Совместимость
Ключевое слово PRIVILEGES требуется в стандарте SQL, но в Greengage DB оно необязательно.
Стандарт SQL не поддерживает назначение привилегий сразу на несколько объектов одной командой.
Greengage DB позволяет владельцу объекта отзывать свои собственные обычные привилегии: например, владелец таблицы может сделать таблицу доступной только для чтения для себя, отозвав привилегии INSERT, UPDATE, DELETE и TRUNCATE.
Это невозможно по стандарту SQL.
Greengage DB рассматривает привилегии владельца как предоставленные им самому себе, поэтому он может их отзывать.
В стандарте SQL привилегии владельца предоставляются предполагаемой сущностью "system".
Стандарт SQL предусматривает привилегию USAGE для других видов объектов, таких как наборы символов, правила сортировки и переводы.
В стандарте SQL последовательности имеют только привилегию USAGE, которая контролирует использование выражения NEXT VALUE FOR, эквивалентного функции nextval() в Greengage DB.
Привилегии последовательностей SELECT и UPDATE являются расширениями Greengage DB.
Применение привилегии USAGE к функции currval() также является расширением Greengage DB, как и сама функция.
Привилегии на базы данных, табличные пространства, схемы и языки также являются расширениями Greengage DB.