Перейти к основному содержимому

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 имеет два основных варианта:

  1. Предоставление прав доступа к объекту базы данных (таблице, столбцу, представлению, сторонней таблице, последовательности, базе данных, внешнему источнику данных, внешнему серверу, функции, процедуре, процедурному языку, большому объекту, параметру конфигурации, схеме, табличному пространству или типу).
  2. Предоставление членства в роли.

Эти варианты во многом похожи, но различия между ними достаточно значимы, чтобы описывать их отдельно.

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.

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

REVOKE, ALTER DEFAULT PRIVILEGES