GRANT
Эта страница переведена при помощи нейросети GigaChat.
GRANT
- определение привилегий доступа.
Синтаксис
GRANT { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER | MAINTAIN }
[, ...] | 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 | INHERIT | SET } { OPTION | TRUE | FALSE } ]
[ 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
на все права объекта.
Возможные привилегии следующие:
SELECT
INSERT
UPDATE
DELETE
TRUNCATE
REFERENCES
TRIGGER
CREATE
CONNECT
TEMPORARY
EXECUTE
USAGE
SET
ALTER SYSTEM
MAINTAIN
- Конкретные типы привилегий.
TEMP
- Альтернативное написание для
TEMPORARY
.
ALL PRIVILEGES
- Предоставление всех привилегий, доступных для типа объекта. Ключевое слово
PRIVILEGES
необязательно в PostgreSQL, хотя оно требуется строгим SQL.
Синтаксис FUNCTION
работает для обычных функций, агрегатных и оконных, но не для процедур, для них используйте PROCEDURE
. Также можно использовать ROUTINE
для охвата всех этих типов.
Также можно выдать права на все объекты одного типа в одной или нескольких схемах. Эта возможность поддерживается только для таблиц, последовательностей, функций и процедур. ALL TABLES
также включает представления и сторонние таблицы. ALL FUNCTIONS
включает агрегатные и оконные функции, но не процедуры. ALL ROUTINES
включает и процедуры.
GRANT для ролей
Этот вариант команды GRANT
предоставляет членство в роли одному или нескольким другим ролям, а также изменение опций членства SET
, INHERIT
, и ADMIN
. Членство в роли важно, потому что оно потенциально позволяет доступ к привилегиям, предоставленным роли каждому из ее членов, и потенциально также способность вносить изменения в саму роль. Однако фактические разрешения зависят от параметров, связанных с предоставлением. Чтобы изменить параметры существующего членства, просто укажите членство с обновленными значениями параметров.
Каждый из описанных ниже вариантов может быть установлен либо в значение TRUE
, либо в значение FALSE
. Ключ OPTION
принимается как синоним ключа TRUE
, поэтому WITH ADMIN OPTION
является синонимом WITH ADMIN TRUE
. При изменении существующей принадлежности пропуск опции приводит к сохранению текущего значения.
Опция ADMIN
позволяет участнику, в свою очередь, предоставлять членство в роли другим пользователям и отменять членство в роли. Без опции администратора обычные пользователи не смогут делать это. Роль не считается обладающей WITH ADMIN OPTION
сама по себе. Суперпользователи базы данных могут предоставлять или отменять членство в любой роли любому пользователю. Этот параметр по умолчанию равен FALSE
.
Параметр INHERIT
управляет статусом наследования нового членства. Если он установлен в значение TRUE
, это заставляет нового члена наследовать от предоставленной роли. Если установлено значение FALSE
, новый участник не наследует. Если при создании новой роли-члена этот параметр явно не указан, по умолчанию используется атрибут наследования нового участника.
Если параметр SET
установлен в значение TRUE
, это позволяет участнику сменить роль на предоставленную с помощью команды SET ROLE
. Если роль косвенно принадлежит другой роли, она может использовать SET ROLE
для смены на эту роль только в том случае, если существует цепочка грантов, каждый из которых имеет SET TRUE
. По умолчанию этот параметр принимает значение TRUE
.
Чтобы создать объект, принадлежащий другой роли, или передать право собственности на существующий объект другой роли, нужно иметь возможность SET ROLE
к этой роли, иначе команды вроде ALTER ... OWNER TO
или CREATE DATABASE ... OWNER
завершатся неудачей. Тем не менее пользователь, унаследовавший привилегии роли, но не имеющий возможности SET ROLE
к ней, может получить полный доступ к роли, манипулируя существующими объектами, принадлежащими этой роли (например, он может переопределить существующую функцию, чтобы действовать как троянский конь). Поэтому, если привилегии роли должны наследоваться, но не должны быть доступны через SET ROLE
, эта роль не должна владеть никакими SQL-объектами.
Если указано GRANTED BY
, предоставление записывается как выполненное указанной ролью. Пользователь может приписать предоставление другому пользователю только в том случае, если он обладает привилегиями этого пользователя. Записанная роль выдающая права должна обладать ADMIN OPTION
на целевую роль, за исключением случая, когда это начальный суперпользователь. Когда предоставление записывается как сделанное другой ролью, отличной от суперпользователя начальной загрузки, оно зависит от продолжения владения ролью выдающей права ADMIN OPTION
на роль. Таким образом, если ADMIN OPTION
отозвана, зависимые предоставления также должны быть отозваны.
В отличие от случаев с привилегиями, членство в роли не может быть предоставлено 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.