REVOKE
REVOKE — отозвать права доступа
Синтаксис
REVOKE [ GRANT OPTION FOR ] { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER } [, ...] | ALL [ PRIVILEGES ] } ON { [ TABLE ]имя_таблицы
[, ...] | ALL TABLES IN SCHEMAимя_схемы
[, ...] } FROMуказание_роли
[, ...] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { { SELECT | INSERT | UPDATE | REFERENCES } (имя_столбца
[, ...] ) [, ...] | ALL [ PRIVILEGES ] (имя_столбца
[, ...] ) } ON [ TABLE ]имя_таблицы
[, ...] FROMуказание_роли
[, ...] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { { USAGE | SELECT | UPDATE } [, ...] | ALL [ PRIVILEGES ] } ON { SEQUENCEимя_последовательности
[, ...] | ALL SEQUENCES IN SCHEMAимя_схемы
[, ...] } FROMуказание_роли
[, ...] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { { CREATE | CONNECT | TEMPORARY | TEMP } [, ...] | ALL [ PRIVILEGES ] } ON DATABASEимя_бд
[, ...] FROMуказание_роли
[, ...] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { USAGE | ALL [ PRIVILEGES ] } ON DOMAINимя_домена
[, ...] FROMуказание_роли
[, ...] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { USAGE | ALL [ PRIVILEGES ] } ON FOREIGN DATA WRAPPERимя_обёртки_сторонних_данных
[, ...] FROMуказание_роли
[, ...] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { USAGE | ALL [ PRIVILEGES ] } ON FOREIGN SERVERимя_сервера
[, ...] FROMуказание_роли
[, ...] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { EXECUTE | ALL [ PRIVILEGES ] } ON { { FUNCTION | PROCEDURE | ROUTINE }имя_функции
[ ( [ [режим_аргумента
] [имя_аргумента
]тип_аргумента
[, ...] ] ) ] [, ...] | ALL { FUNCTIONS | PROCEDURES | ROUTINES } IN SCHEMAимя_схемы
[, ...] } FROMуказание_роли
[, ...] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { USAGE | ALL [ PRIVILEGES ] } ON LANGUAGEимя_языка
[, ...] FROMуказание_роли
[, ...] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { { SELECT | UPDATE } [, ...] | ALL [ PRIVILEGES ] } ON LARGE OBJECToid_БО
[, ...] FROMуказание_роли
[, ...] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { { CREATE | USAGE } [, ...] | ALL [ PRIVILEGES ] } ON SCHEMAимя_схемы
[, ...] FROMуказание_роли
[, ...] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { CREATE | ALL [ PRIVILEGES ] } ON TABLESPACEтабл_пространство
[, ...] FROMуказание_роли
[, ...] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { USAGE | ALL [ PRIVILEGES ] } ON TYPEимя_типа
[, ...] FROMуказание_роли
[, ...] [ CASCADE | RESTRICT ] REVOKE [ ADMIN OPTION FOR ]имя_роли
[, ...] FROMуказание_роли
[, ...] [ GRANTED BYуказание_роли
] [ CASCADE | RESTRICT ] Здесьуказание_роли
: [ GROUP ]имя_роли
| PUBLIC | CURRENT_USER | SESSION_USER
Описание
Команда REVOKE
лишает одну или несколько ролей прав, назначенных ранее. Ключевое слово PUBLIC
обозначает неявно определённую группу всех ролей.
Различные типы прав подробно рассматриваются в описании команды GRANT.
Заметьте, что любая конкретная роль получает в сумме права, данные непосредственно ей, права, данные любой роли, в которую она включена, а также права, данные группе PUBLIC
. Поэтому, например, лишение PUBLIC
права SELECT
не обязательно будет означать, что все роли лишатся права SELECT
для данного объекта: оно сохранится у тех ролей, которым оно дано непосредственно или косвенно, через другую роль. Подобным образом, лишение права SELECT
какого-либо пользователя может не повлиять на его возможность пользоваться правом SELECT
, если это право дано группе PUBLIC
или другой роли, в которую он включён.
Если указано GRANT OPTION FOR
, отзывается только право передачи права, но не само право. Без этого указания отзывается и право, и право распоряжаться им.
Если пользователь обладает правом с правом передачи и он дал его другим пользователям, последнее право считается зависимым. Когда первый пользователь лишается самого права или права передачи и существуют зависимые права, эти зависимые права также отзываются, если дополнительно указано CASCADE
; в противном случае операция завершается ошибкой. Это рекурсивное лишение прав затрагивает только права, полученные через цепочку пользователей, которую можно проследить до пользователя, являющегося субъектом команды REVOKE
. Таким образом, пользователи могут в итоге сохранить это право, если оно было также получено через других пользователей.
Когда отзывается право доступа к таблице, с ним вместе автоматически отзываются соответствующие права для каждого столбца таблицы (если такие права заданы). С другой стороны, если роли были даны права для таблицы, лишение роли таких же прав на уровне отдельных столбцов ни на что не влияет.
Когда пользователь лишается членства в роли, указание GRANT OPTION
меняется на ADMIN OPTION
, но в остальном поведение не отличается. Эта форма команды также принимает указание GRANTED BY
, но в настоящее время оно игнорируется (проверяется лишь существование заданной в нём роли). Заметьте также, что эта форма команды не принимает избыточное слово GROUP
в указании_роли
.
Замечания
Для просмотра прав, назначенных для существующих таблиц и столбцов, можно воспользоваться командой \dp
в psql. Формат её вывода рассматривается в описании GRANT. Для других, не табличных объектов предусмотрены другие команды \d
, которые могут показывать в том числе и назначенные для них права.
Пользователь может отзывать только те права, которые он дал другому непосредственно. Если, например, пользователь A дал право с правом передачи пользователю B, а пользователь B, в свою очередь, дал это право пользователю C, то пользователь A не сможет лишить этого права непосредственно C. Вместо этого, пользователь A может лишить права передачи права пользователя B и использовать параметр CASCADE
, чтобы этого права по цепочке лишился пользователь C. Или же, например, если и A, и B дали одно и то же право C, то A сможет отозвать право, которое дал он, но не пользователь B, так что в результате C всё равно будет иметь это право.
Если отозвать право доступа к объекту (с помощью REVOKE
) попытается не владелец объекта, команда завершится ошибкой, если пользователь не имеет никаких прав для этого объекта. Если же пользователь имеет какие-то права, команда будет выполняться, но пользователь сможет отозвать только те права, которые даны ему с правом распоряжения ими. Формы 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
. Если этого не сделать, могут быть отозваны не те права, что планировалось, либо отозвать права вообще не удастся.
Примеры
Лишение группы 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
по умолчанию.