REVOKE
Отзывает права доступа.
Синтаксис
REVOKE [ GRANT OPTION FOR ]
{ { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER }
[, ...] | ALL [ PRIVILEGES ] }
ON { [ TABLE ] <table_name> [, ...]
| ALL TABLES IN SCHEMA <schema_name> [, ...] }
FROM { [ GROUP ] <role_name> | PUBLIC } [, ...]
[ CASCADE | RESTRICT ]
REVOKE [ GRANT OPTION FOR ]
{ { SELECT | INSERT | UPDATE | REFERENCES } ( <column_name> [, ...] )
[, ...] | ALL [ PRIVILEGES ] ( <column_name> [, ...] ) }
ON [ TABLE ] <table_name> [, ...]
FROM { [ GROUP ] <role_name> | PUBLIC } [, ...]
[ CASCADE | RESTRICT ]
REVOKE [ GRANT OPTION FOR ]
{ { USAGE | SELECT | UPDATE }
[, ...] | ALL [ PRIVILEGES ] }
ON { SEQUENCE <sequence_name> [, ...]
| ALL SEQUENCES IN SCHEMA <schema_name> [, ...] }
FROM { [ GROUP ] <role_name> | PUBLIC } [, ...]
[ CASCADE | RESTRICT ]
REVOKE [ GRANT OPTION FOR ]
{ { CREATE | CONNECT | TEMPORARY | TEMP } [, ...] | ALL [ PRIVILEGES ] }
ON DATABASE <database_name> [, ...]
FROM { [ GROUP ] <role_name> | PUBLIC } [, ...]
[ CASCADE | RESTRICT ]
REVOKE [ GRANT OPTION FOR ]
{ USAGE | ALL [ PRIVILEGES ] }
ON DOMAIN <domain_name> [, ...]
FROM { [ GROUP ] <role_name> | PUBLIC } [, ...]
[ CASCADE | RESTRICT ]
REVOKE [ GRANT OPTION FOR ]
{ USAGE | ALL [ PRIVILEGES ] }
ON FOREIGN DATA WRAPPER <fdw_name> [, ...]
FROM { [ GROUP ] <role_name> | PUBLIC } [, ...]
[ CASCADE | RESTRICT ]
REVOKE [ GRANT OPTION FOR ]
{ USAGE | ALL [ PRIVILEGES ] }
ON FOREIGN SERVER <server_name> [, ...]
FROM { [ GROUP ] <role_name> | PUBLIC } [, ...]
[ CASCADE | RESTRICT ]
REVOKE [ GRANT OPTION FOR ]
{ EXECUTE | ALL [ PRIVILEGES ] }
ON { FUNCTION <function_name> ( [ [ <argmode> ] [ <arg_name> ] <arg_type> [, ...] ] ) [, ...]
| ALL FUNCTIONS IN SCHEMA <schema_name> [, ...] }
FROM { [ GROUP ] <role_name> | PUBLIC } [, ...]
[ CASCADE | RESTRICT ]
REVOKE [ GRANT OPTION FOR ]
{ USAGE | ALL [ PRIVILEGES ] }
ON LANGUAGE <lang_name> [, ...]
FROM { [ GROUP ] <role_name> | PUBLIC } [, ...]
[ CASCADE | RESTRICT ]
REVOKE [ GRANT OPTION FOR ]
{ { SELECT | UPDATE } [, ...] | ALL [ PRIVILEGES ] }
ON LARGE OBJECT <loid> [, ...]
FROM { [ GROUP ] <role_name> | PUBLIC } [, ...]
[ CASCADE | RESTRICT ]
REVOKE [ GRANT OPTION FOR ]
{ { CREATE | USAGE } [, ...] | ALL [ PRIVILEGES ] }
ON SCHEMA <schema_name> [, ...]
FROM { [ GROUP ] <role_name> | PUBLIC } [, ...]
[ CASCADE | RESTRICT ]
REVOKE [ GRANT OPTION FOR ]
{ CREATE | ALL [ PRIVILEGES ] }
ON TABLESPACE <tablespace_name> [, ...]
FROM { [ GROUP ] <role_name> | PUBLIC } [, ...]
[ CASCADE | RESTRICT ]
REVOKE [ GRANT OPTION FOR ]
{ USAGE | ALL [ PRIVILEGES ] }
ON TYPE <type_name> [, ...]
FROM { [ GROUP ] <role_name> | PUBLIC } [, ...]
[ CASCADE | RESTRICT ]
REVOKE [ ADMIN OPTION FOR ]
<role_name> [, ...] FROM <role_name> [, ...]
[ CASCADE | RESTRICT ]
Описание
REVOKE отзывает ранее предоставленные привилегии у одной или нескольких ролей. Ключевое слово PUBLIC обозначает неявно определенную группу всех ролей.
Различные типы привилегий подробно рассматриваются в описании команды GRANT.
Обратите внимание, что любая конкретная роль будет обладать совокупностью привилегий, предоставленных непосредственно ей, привилегий, предоставленных любой роли, членом которой она в данный момент является, а также привилегий, предоставленных роли PUBLIC. Таким образом, например, отзыв привилегии SELECT у роли PUBLIC не обязательно означает, что все роли потеряли привилегию SELECT для данного объекта: она сохранится у тех ролей, которым она была предоставлена напрямую или через другую роль. Аналогично, отзыв привилегии SELECT у пользователя может не повлиять на его возможность использовать SELECT, если роль PUBLIC или другая роль, в которую он включен, имеет привилегию SELECT.
Если указан GRANT OPTION FOR, то отзывается только право предоставления привилегии, а не сама привилегия. В противном случае отзываются и привилегия, и право предоставлять ее.
Если роль обладает привилегией с правом передачи и предоставила ее другим ролям, то привилегии, которыми теперь обладают эти роли, называются зависимыми привилегиями. Если привилегия или право предоставления отзываются у первой роли и существуют зависимые привилегии, то эти зависимые привилегии также отзываются, если указан параметр CASCADE; в противном случае операция завершится ошибкой. Этот рекурсивный отзыв затрагивает только привилегии, предоставленные через цепочку ролей, которую можно проследить до роли, являющейся объектом команды REVOKE. Таким образом, роли могут в итоге сохранить привилегию, если она также была предоставлена через другие роли.
Когда отзываются права доступа к таблице, также автоматически отзываются соответствующие привилегии (если такие есть) для каждого столбца таблицы. С другой стороны, если роли были предоставлены привилегии на таблицу, то отзыв тех же привилегий на уровне отдельных столбцов не будет иметь никакого эффекта.
Когда отменяется членство в роли, GRANT OPTION меняется на ADMIN OPTION, но поведение остается аналогичным.
Примечания
Пользователь может отозвать только те привилегии, которые были предоставлены непосредственно этим пользователем. Например, если пользователь A предоставил привилегию с правом предоставления пользователю B, а пользователь B, в свою очередь, предоставил ее пользователю C, то пользователь A не может отозвать привилегию непосредственно у C. Вместо этого пользователь A может отозвать право предоставления у пользователя B и использовать опцию CASCADE, чтобы привилегия была отозвана у пользователя C. Или, например, если и A, и B предоставили одну и ту же привилегию C, A может отозвать свою собственную привилегию, но не привилегию B, поэтому C по-прежнему будет обладать этой привилегией.
Когда пользователь, не являющийся владельцем объекта, пытается отозвать привилегии на этот объект, команда завершится ошибкой, если у пользователя нет никаких привилегий на этот объект. Если же есть какие-либо привилегии, команда будет выполнена, но пользователь сможет отозвать только те привилегии, которые даны ему с правом их предоставления. Формы REVOKE ALL PRIVILEGES будут выдавать предупреждение, если права распоряжения отсутствуют, а другие формы будут выдавать предупреждения, если отсутствуют права распоряжения именно привилегиями, указанными в команде. В принципе, эти утверждения применимы и к владельцу объекта, но поскольку владелец всегда считается обладающим всеми правами распоряжения, такие ситуации невозможны.
Если команду GRANT или REVOKE выполняет суперпользователь, эта команда выполняется так, как если бы ее выполнял владелец соответствующего объекта. Поскольку все привилегии в конечном итоге исходят от владельца объекта (возможно, косвенно через цепочки опций предоставления), суперпользователь может отозвать все привилегии, но для этого может потребоваться использование CASCADE, как описано выше.
Команда REVOKE также может быть выполнена ролью, которая не является владельцем затронутого объекта, но является членом роли, владеющей объектом, или членом роли, обладающей привилегиями WITH GRANT OPTION для этого объекта. В этом случае команда выполняется так, как если бы ее выполняла роль, которая фактически владеет объектом или обладает привилегиями WITH GRANT OPTION. Например, если таблица t1 принадлежит роли g1, членом которой является роль u1, то u1 может отозвать привилегии на t1, которые записаны как предоставленные ролью g1. В том числе это могут быть привилегии, предоставленные как ролью u1, так и другими членами роли g1.
Если роль, выполняющая команду REVOKE, получила привилегии косвенно через несколько путей членства ролей, то не определено, какая именно роль будет использоваться для выполнения команды. В таких случаях рекомендуется использовать команду SET ROLE, чтобы переключиться на роль, от имени которой нужно выполнить команду REVOKE. Если этого не сделать, могут быть отозваны не те привилегии, что планировалось, либо отозвать привилегии вообще не удастся.
Используйте метакоманду \dp в psql, чтобы получить информацию о существующих правах доступа к таблицам и столбцам. Существуют и другие метакоманды \d, которые можно использовать для отображения прав доступа к объектам, не являющимся таблицами.
Примеры
Отзыв привилегии на вставку данных в таблицу films у группы PUBLIC:
REVOKE INSERT ON films FROM PUBLIC;
Отзыв у пользователя sally всех привилегий для представления topten:
REVOKE ALL PRIVILEGES ON topten FROM sally;
Обратите внимание, что это фактически означает отзыв всех привилегий, предоставленных текущей ролью (если это не суперпользователь).
Отмена членства пользователя joe в роли admins:
REVOKE admins FROM joe;
Совместимость
Замечания по совместимости, приведенные для команды GRANT, применимы к REVOKE. Согласно стандарту, ключевое слово RESTRICT или CASCADE является обязательным, но Greengage DB по умолчанию предполагает использование RESTRICT.