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