GRANT
Эта страница переведена при помощи нейросети GigaChat.
GRANT - определение привилегий доступа.
Синтаксис
GRANT { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER }
[, ...] | ALL [ PRIVILEGES ] }
ON { [ TABLE ] table_name [, ...]
| ALL TABLES IN SCHEMA schema_name [, ...] }
TO role_specification [, ...] [ WITH GRANT OPTION ]
[ GRANTED BY role_specification ]
GRANT { { SELECT | INSERT | UPDATE | REFERENCES } ( column_name [, ...] )
[, ...] | ALL [ PRIVILEGES ] ( column_name [, ...] ) }
ON [ TABLE ] table_name [, ...]
TO role_specification [, ...] [ WITH GRANT OPTION ]
[ GRANTED BY role_specification ]
GRANT { { USAGE | SELECT | UPDATE }
[, ...] | ALL [ PRIVILEGES ] }
ON { SEQUENCE sequence_name [, ...]
| ALL SEQUENCES IN SCHEMA schema_name [, ...] }
TO role_specification [, ...] [ WITH GRANT OPTION ]
[ GRANTED BY role_specification ]
GRANT { { CREATE | CONNECT | TEMPORARY | TEMP } [, ...] | ALL [ PRIVILEGES ] }
ON DATABASE database_name [, ...]
TO role_specification [, ...] [ WITH GRANT OPTION ]
[ GRANTED BY role_specification ]
GRANT { USAGE | ALL [ PRIVILEGES ] }
ON DOMAIN domain_name [, ...]
TO role_specification [, ...] [ WITH GRANT OPTION ]
[ GRANTED BY role_specification ]
GRANT { USAGE | ALL [ PRIVILEGES ] }
ON FOREIGN DATA WRAPPER fdw_name [, ...]
TO role_specification [, ...] [ WITH GRANT OPTION ]
[ GRANTED BY role_specification ]
GRANT { USAGE | ALL [ PRIVILEGES ] }
ON FOREIGN SERVER server_name [, ...]
TO role_specification [, ...] [ WITH GRANT OPTION ]
[ GRANTED BY role_specification ]
GRANT { EXECUTE | ALL [ PRIVILEGES ] }
ON { { FUNCTION | PROCEDURE | ROUTINE } routine_name [ ( [ [ argmode ] [ arg_name ] arg_type [, ...] ] ) ] [, ...]
| ALL { FUNCTIONS | PROCEDURES | ROUTINES } IN SCHEMA schema_name [, ...] }
TO role_specification [, ...] [ WITH GRANT OPTION ]
[ GRANTED BY role_specification ]
GRANT { USAGE | ALL [ PRIVILEGES ] }
ON LANGUAGE lang_name [, ...]
TO role_specification [, ...] [ WITH GRANT OPTION ]
[ GRANTED BY role_specification ]
GRANT { { SELECT | UPDATE } [, ...] | ALL [ PRIVILEGES ] }
ON LARGE OBJECT loid [, ...]
TO role_specification [, ...] [ WITH GRANT OPTION ]
[ GRANTED BY role_specification ]
GRANT { { SET | ALTER SYSTEM } [, ... ] | ALL [ PRIVILEGES ] }
ON PARAMETER configuration_parameter [, ...]
TO role_specification [, ...] [ WITH GRANT OPTION ]
[ GRANTED BY role_specification ]
GRANT { { CREATE | USAGE } [, ...] | ALL [ PRIVILEGES ] }
ON SCHEMA schema_name [, ...]
TO role_specification [, ...] [ WITH GRANT OPTION ]
[ GRANTED BY role_specification ]
GRANT { CREATE | ALL [ PRIVILEGES ] }
ON TABLESPACE tablespace_name [, ...]
TO role_specification [, ...] [ WITH GRANT OPTION ]
[ GRANTED BY role_specification ]
GRANT { USAGE | ALL [ PRIVILEGES ] }
ON TYPE type_name [, ...]
TO role_specification [, ...] [ WITH GRANT OPTION ]
[ GRANTED BY role_specification ]
GRANT role_name [, ...] TO role_specification [, ...]
[ WITH ADMIN OPTION ]
[ GRANTED BY role_specification ]
where role_specification can be:
[ GROUP ] role_name
| PUBLIC
| CURRENT_ROLE
| CURRENT_USER
| SESSION_USER
Описание
Команда GRANT имеет два основных варианта:
- Предоставление прав доступа к объекту базы данных (таблице, столбцу, представлению, сторонней таблице, последовательности, базе данных, внешнему источнику данных, внешнему серверу, функции, процедуре, процедурному языку, большому объекту, параметру конфигурации, схеме, табличному пространству или типу).
- Предоставление членства в роли.
Эти варианты во многом похожи, но различия между ними достаточно значимы, чтобы описывать их отдельно.
GRANT для объектов баз данных
Этот вариант команды GRANT предоставляет указанные права доступа к объекту базы данных одной или нескольким ролям. Эти права добавляются к уже имеющимся, если таковые есть.
Ключевое слово PUBLIC указывает, что права предоставляются всем ролям, включая те, которые могут быть созданы в будущем. PUBLIC можно представить как неявно определенную группу, которая всегда включает все роли. Каждая конкретная роль будет иметь сумму прав, предоставленных напрямую ей, любой роли, членом которой она является, PUBLIC.
Если указано WITH GRANT OPTION, получатель прав может в свою очередь передавать их другим. Без этого параметра получатель не может передавать права. Права с GRANT OPTION нельзя назначить PUBLIC.
Если указано GRANTED BY, то в качестве предоставляющей роли должна быть текущая роль. Этот параметр пока реализован только для совместимости с SQL-стандартом.
Нет необходимости предоставлять права владельцу объекта (обычно это пользователь, который его создал), так как владелец по умолчанию обладает всеми правами. Но владелец может добровольно отозвать у себя некоторые права ради безопасности.
Право на удаление объекта или изменение его определения не считается передаваемым правом, оно принадлежит владельцу объекта и не может быть передано или отозвано. Похожий эффект можно получить, предоставив или отозвав членство в роли, которой принадлежит объект. Владелец также неявно имеет право GRANT OPTION на все права объекта.
Возможные привилегии следующие:
SELECTINSERTUPDATEDELETETRUNCATEREFERENCESTRIGGERCREATECONNECTTEMPORARYEXECUTEUSAGESETALTER SYSTEM
Конкретные типы привилегий.
TEMP
Альтернативное написание для TEMPORARY.
ALL PRIVILEGES
Предоставление всех привилегий, доступных для типа объекта. Ключевое слово PRIVILEGES необязательно в PostgreSQL, хотя оно требуется строгим SQL.
Синтаксис FUNCTION работает для обычных функций, агрегатных и оконных, но не для процедур, для них используйте PROCEDURE. Также можно использовать ROUTINE для охвата всех этих типов.
Также можно выдать права на все объекты одного типа в одной или нескольких схемах. Эта возможность поддерживается только для таблиц, последовательностей, функций и процедур. ALL TABLES также включает представления и сторонние таблицы. ALL FUNCTIONS включает агрегатные и оконные функции, но не процедуры. ALL ROUTINES включает и процедуры.
GRANT для ролей
Этот вариант команды GRANT предоставляет членство в одной роли другим ролям. Членство в роли важно, так как передает все права этой роли ее участникам.
Если указано WITH ADMIN OPTION, участник может сам выдавать и отзывать членство в роли другим. Без этого параметра обычные пользователи не могут этого делать. Роль не считается имеющей WITH ADMIN OPTION по отношению к самой себе.
Суперпользователи могут выдавать или отзывать членство в любых ролях. Роли с привилегией CREATEROLE могут управлять членством в любых не суперпользовательских ролях.
Если указано GRANTED BY, то предоставление считается сделанным от имени указанной роли. Указывать GRANTED BY может только суперпользователь, за исключением случаев, когда имя роли совпадает с текущей ролью.
В отличие от прав доступа, членство в роли нельзя выдать PUBLIC. Также в этом варианте команды не разрешается использовать ключевое слово GROUP в определении роли (role_specification).
Примечания
Команда REVOKE используется для отзыва привилегий доступа.
Начиная с PostgreSQL 8.1, понятия пользователей и групп были объединены в один тип сущности, называемый ролью.
Поэтому больше нет необходимости использовать ключевое слово GROUP, чтобы различать, является ли получатель привилегий пользователем или группой. Ключевое слово GROUP все еще допускается в команде, но является шумовым словом (не влияет на поведение команды).
Пользователь может выполнять SELECT, INSERT и другие операции со столбцом, если у него есть соответствующая привилегия либо на конкретный столбец, либо на всю таблицу.
Если предоставить привилегию на уровне таблицы, а затем отозвать ее для одного столбца, это не приведет к ожидаемому результату:
глобальная привилегия на таблицу не отменяется операцией отзыва на уровне столбца.
Когда не владелец объекта пытается выполнить GRANT привилегий на этот объект, команда завершится с ошибкой, если у пользователя вообще нет привилегий на объект. Если же у него есть хотя бы одна привилегия, команда выполнится, но предоставит только те привилегии, по которым у пользователя есть привилегия GRANT OPTION.
Форма GRANT ALL PRIVILEGES выдаст предупреждение, если ни по одной из привилегий у пользователя нет никаких привилегий на этот объект.
Остальные формы команды GRANT выдадут предупреждение, если у пользователя нет права делегирования (GRANT OPTION) хотя бы по одной из явно указанных в команде привилегий. Теоретически эти утверждения применимы и к владельцу объекта, но поскольку владелец всегда рассматривается как имеющий все привилегии на объект, эти случаи на практике не встречаются.
Следует иметь в виду, что суперпользователи PostgreSQL имеют доступ ко всем объектам, независимо от настроек привилегий.
Это сравнимо с правами пользователя root в Unix-системах.
Как и с root, не рекомендуется выполнять действия от имени суперпользователя, если в этом нет крайней необходимости.
Если суперпользователь выполняет команду GRANT или REVOKE, она выполняется так, как если бы ее выполнил владелец соответствующего объекта. В частности, предоставленные таким образом привилегии будут отображаться как предоставленные владельцем объекта. Для членства в ролях — оно будет отображаться как предоставленное вышестоящей ролью, содержащей в себе других участников.
Команды GRANT и REVOKE могут выполняться не владельцем объекта, а ролью, которая является членом роли, владеющей объектом, или членом роли, обладающей привилегиями WITH GRANT OPTION на объект.
В этом случае предоставленные привилегии будут записаны как выданные той ролью, которая фактически владеет объектом или обладает привилегиями GRANT OPTION. Например, если таблица t1 принадлежит роли g1, а роль u1 является членом g1, тогда u1 может предоставить привилегии на t1 пользователю u2. Однако эти привилегии будут зарегистрированы как выданные от имени g1. Любой другой участник g1 сможет их в дальнейшем отозвать.
Если роль, выполняющая GRANT, косвенно обладает нужными привилегиями через несколько путей членства в других ролях, то не определено, от имени какой из ролей будет записано предоставление привилегии. В таких случаях наилучшей практикой является использовать SET ROLE, чтобы явно стать той ролью, от имени которой следует выполнять GRANT.
Предоставление прав на таблицу не распространяется автоматически на последовательности (SEQUENCE), используемые в этой таблице, включая те, что связаны с колонками SERIAL. Привилегии на последовательности нужно настраивать отдельно.
Примеры
Следующая команда разрешает всем добавлять записи в таблицу films:
GRANT INSERT ON films TO PUBLIC;
Эта команда дает пользователю manuel все права для представления kinds:
GRANT ALL PRIVILEGES ON kinds TO manuel;
Учтите, что если ее выполнит суперпользователь или владелец представления kinds, эта команда действительно даст субъекту все права, но если ее выполнит обычный пользователь, субъект получит только те права, которые даны этому пользователю с правом передачи.
Включение в роль admins пользователя joe:
GRANT admins TO joe;
Совместимость
Согласно стандарту SQL, ключевое слово PRIVILEGES в ALL PRIVILEGES является обязательным. Стандарт SQL не поддерживает установку привилегий более чем на один объект за одну команду.
PostgreSQL позволяет владельцу объекта отозвать свои обычные привилегии: например, владелец таблицы может сделать таблицу доступной только для чтения для себя, отозвав свои собственные привилегии INSERT, UPDATE, DELETE, и TRUNCATE. Это невозможно согласно стандарту SQL. Причина заключается в том, что PostgreSQL рассматривает привилегии владельца как предоставленные владельцем самому себе, поэтому они также могут их отозвать. В стандарте SQL привилегии владельца предоставляются предполагаемым объектом «_SYSTEM». Не являясь «_SYSTEM», владелец не может отозвать эти права.
Согласно стандарту SQL, параметры предоставления могут быть предоставлены PUBLIC. PostgreSQL поддерживает предоставление параметров предоставления только ролям.
Стандарт SQL допускает использование параметра GRANTED BY для указания только CURRENT_USER или CURRENT_ROLE. Другие варианты являются расширениями PostgreSQL.
В соответствии со стандартом SQL предоставляется привилегия USAGE на другие виды объектов: наборы символов, сопоставления, переводы.
В стандарте SQL последовательности имеют только одну USAGE привилегию, которая контролирует использование выражения NEXT VALUE FOR, эквивалентное функции nextval в PostgreSQL. Привилегии последовательностей SELECT и UPDATE являются расширениями PostgreSQL. Применение привилегий последовательности USAGE к функции currval также является расширением PostgreSQL (как и сама функция).
Привилегии для баз данных, табличных пространств, схем, языков и параметров конфигурации являются расширениями PostgreSQL.