REVOKE#
REVOKE
REVOKE — удаление прав доступа
Синтаксис
REVOKE [ GRANT OPTION FOR ] { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER } [, ...] | ALL [ PRIVILEGES ] } ON { [ TABLE ]table_name
[, ...] | ALL TABLES IN SCHEMAschema_name
[, ...] } FROMrole_specification
[, ...] [ GRANTED BYrole_specification
] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { { SELECT | INSERT | UPDATE | REFERENCES } (column_name
[, ...] ) [, ...] | ALL [ PRIVILEGES ] (column_name
[, ...] ) } ON [ TABLE ]table_name
[, ...] FROMrole_specification
[, ...] [ GRANTED BYrole_specification
] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { { USAGE | SELECT | UPDATE } [, ...] | ALL [ PRIVILEGES ] } ON { SEQUENCEsequence_name
[, ...] | ALL SEQUENCES IN SCHEMAschema_name
[, ...] } FROMrole_specification
[, ...] [ GRANTED BYrole_specification
] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { { CREATE | CONNECT | TEMPORARY | TEMP } [, ...] | ALL [ PRIVILEGES ] } ON DATABASEdatabase_name
[, ...] FROMrole_specification
[, ...] [ GRANTED BYrole_specification
] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { USAGE | ALL [ PRIVILEGES ] } ON DOMAINdomain_name
[, ...] FROMrole_specification
[, ...] [ GRANTED BYrole_specification
] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { USAGE | ALL [ PRIVILEGES ] } ON FOREIGN DATA WRAPPERfdw_name
[, ...] FROMrole_specification
[, ...] [ GRANTED BYrole_specification
] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { USAGE | ALL [ PRIVILEGES ] } ON FOREIGN SERVERserver_name
[, ...] FROMrole_specification
[, ...] [ GRANTED BYrole_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 SCHEMAschema_name
[, ...] } FROMrole_specification
[, ...] [ GRANTED BYrole_specification
] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { USAGE | ALL [ PRIVILEGES ] } ON LANGUAGElang_name
[, ...] FROMrole_specification
[, ...] [ GRANTED BYrole_specification
] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { { SELECT | UPDATE } [, ...] | ALL [ PRIVILEGES ] } ON LARGE OBJECTloid
[, ...] FROMrole_specification
[, ...] [ GRANTED BYrole_specification
] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { { SET | ALTER SYSTEM } [, ...] | ALL [ PRIVILEGES ] } ON PARAMETERconfiguration_parameter
[, ...] FROMrole_specification
[, ...] [ GRANTED BYrole_specification
] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { { CREATE | USAGE } [, ...] | ALL [ PRIVILEGES ] } ON SCHEMAschema_name
[, ...] FROMrole_specification
[, ...] [ GRANTED BYrole_specification
] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { CREATE | ALL [ PRIVILEGES ] } ON TABLESPACEtablespace_name
[, ...] FROMrole_specification
[, ...] [ GRANTED BYrole_specification
] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { USAGE | ALL [ PRIVILEGES ] } ON TYPEtype_name
[, ...] FROMrole_specification
[, ...] [ GRANTED BYrole_specification
] [ CASCADE | RESTRICT ] REVOKE [ { ADMIN | INHERIT | SET } OPTION FOR ]role_name
[, ...] FROMrole_specification
[, ...] [ GRANTED BYrole_specification
] [ CASCADE | RESTRICT ] whererole_specification
can be: [ GROUP ]role_name
| PUBLIC | CURRENT_ROLE | CURRENT_USER | SESSION_USER
Описание
Команда REVOKE
отзывает ранее предоставленные
привилегии у одной или нескольких ролей. Ключевое слово
PUBLIC
относится к неявно определенной группе
всех ролей.
См. описание команды GRANT
для понимания типов привилегий.
Обратите внимание, что любая конкретная роль будет иметь сумму
привилегий, предоставленных ей напрямую, привилегий, предоставленных любой роли, которой
она в настоящее время является членом, и привилегий, предоставленных
PUBLIC
. Таким образом, например, отзыв привилегии SELECT
от PUBLIC
не обязательно означает, что все роли
потеряли привилегию SELECT
на объекте: те, у кого она предоставлена
напрямую или через другую роль, все еще будут иметь ее. Аналогично, отзыв
привилегии SELECT
у пользователя может не предотвратить использование
им этой привилегии, если у PUBLIC
или другой роли-члена
остались права SELECT
.
Если указана опция GRANT OPTION FOR
, то отзывается только опция предоставления привилегии, а не сама привилегия.
В противном случае отзываются и привилегия, и опция предоставления.
Если у пользователя есть привилегия с опцией предоставления прав и он предоставил ее другим пользователям, то привилегии, удерживаемые этими другими пользователями, называются зависимыми привилегиями. Если привилегия или опция предоставления прав, удерживаемые первым пользователем, отзываются, и существуют зависимые привилегии, то эти зависимые привилегии также отзываются, если указана опция CASCADE
; если она не указана, действие отзыва не выполнится. Этот рекурсивный отзыв влияет только на привилегии, которые были предоставлены через цепочку пользователей, которая может быть прослежена до пользователя, являющегося объектом данной команды REVOKE
. Таким образом, затронутые пользователи могут сохранить привилегию, если она также была предоставлена через других пользователей.
Когда отзываются привилегии для таблицы, соответствующие привилегии на столбцы (если они есть) автоматически отзываются для каждого столбца таблицы. С другой стороны, если роли были предоставлены привилегии на таблицу, то отзыв привилегий отдельных столбцов не будет иметь никакого эффекта.
При отзыве членства в роли, GRANT OPTION
вместо этого называется ADMIN OPTION
, но поведение аналогично.
Обратите внимание, что в выпусках до Tantor BE 16 зависимые привилегии не отслеживались для предоставления членства в роли,
и поэтому CASCADE
не имел эффекта для членства в роли.
Это больше не так.
Также обратите внимание, что эта форма команды не
позволяет использовать слово GROUP
в role_specification
.
Точно так же, как ADMIN OPTION
может быть удалена из существующего
предоставления роли, также возможно отозвать INHERIT OPTION
или SET OPTION
. Это эквивалентно установке значения
соответствующей опции в FALSE
.
Примечания
Пользователь может отозвать только привилегии, которые были предоставлены непосредственно этим пользователем. Например, если пользователь A предоставил привилегию с опцией предоставления пользователю B, а пользователь B в свою очередь предоставил ее пользователю C, то пользователь A не может отозвать привилегию напрямую у пользователя C. Вместо этого пользователь A может отозвать опцию предоставления у пользователя B и использовать опцию CASCADE
, чтобы привилегия была отозвана у пользователя C. В другом примере, если и A, и B предоставили одну и ту же привилегию пользователю C, A может отозвать свое собственное предоставление, но не предоставление B, поэтому C по-прежнему будет иметь эффективную привилегию.
Когда не владелец объекта пытается выполнить команду REVOKE
для отзыва привилегий на объекте, команда не выполнится, если у пользователя вообще нет привилегий на объекте. Если хотя бы одна привилегия доступна, команда будет выполняться, но будут отозваны только те привилегии, для которых у пользователя есть опция предоставления. Формы REVOKE ALL PRIVILEGES
выдадут предупреждающее сообщение, если нет опций предоставления, в то время как другие формы выдадут предупреждающее сообщение, если нет опций предоставления для любой из привилегий, явно указанных в команде. (В принципе, эти утверждения также применимы к владельцу объекта, но поскольку владелец всегда считается имеющим все опции предоставления, такие случаи никогда не могут возникнуть).
Если суперпользователь решает выполнить команду GRANT
или REVOKE
,
команда выполняется так, как если бы она была выдана
владельцем затронутого объекта. (Поскольку роли не имеют владельцев, в случае
GRANT
членства в роли, команда выполняется так, как если бы она была выдана суперпользователем начальной загрузки.)
Поскольку все привилегии в конечном итоге исходят
от владельца объекта (возможно, косвенно через цепочки опций предоставления),
суперпользователь может отозвать все привилегии, но это может
потребовать использования CASCADE
, как указано выше.
REVOKE
также может быть выполнена ролью, которая не является владельцем объекта, но является членом роли, которая является владельцем объекта, или является членом роли, которая имеет привилегии WITH GRANT OPTION
на объект. В этом случае команда выполняется так, как если бы она была выпущена содержащей ролью, которая фактически является владельцем объекта или имеет привилегии WITH GRANT OPTION
. Например, если таблица t1
принадлежит роли g1
, членом которой является роль u1
, то u1
может отозвать привилегии на t1
, которые записаны как предоставленные g1
. Это включает предоставления, сделанные u1
, а также другими членами роли g1
.
Если роль, выполняющая команду REVOKE
, обладает привилегиями косвенно через несколько путей членства в ролях, не определено, какая из ролей будет использована для выполнения команды. В таких случаях рекомендуется использовать команду SET ROLE
для становления конкретной ролью, от имени которой нужно выполнить команду REVOKE
. Не выполнение этого действия может привести к отзыву привилегий, отличных от задуманных, или вообще не привести к отзыву ничего.
См. Раздел 5.7 для получения дополнительной информации о конкретных типах привилегий, а также о том, как проверить привилегии объектов.
Примеры
Отменить привилегию на вставку для общедоступного пользователя на таблицу 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
требуется согласно стандарту, но Tantor BE
по умолчанию использует RESTRICT
.