REVOKE

REVOKE — отозвать права доступа


Синтаксис

REVOKE [ GRANT OPTION FOR ]
    { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER }
    [, ...] | ALL [ PRIVILEGES ] }
    ON { [ TABLE ] имя_таблицы [, ...]
         | ALL TABLES IN SCHEMA имя_схемы [, ...] }
    FROM описание_роли [, ...]
    [ GRANTED BY описание_роли ]
    [ CASCADE | RESTRICT ]

REVOKE [ GRANT OPTION FOR ]
    { { SELECT | INSERT | UPDATE | REFERENCES } ( имя_столбца [, ...] )
    [, ...] | ALL [ PRIVILEGES ] ( имя_столбца [, ...] ) }
    ON [ TABLE ] имя_таблицы [, ...]
    FROM описание_роли [, ...]
    [ GRANTED BY описание_роли ]
    [ CASCADE | RESTRICT ]

REVOKE [ GRANT OPTION FOR ]
    { { USAGE | SELECT | UPDATE }
    [, ...] | ALL [ PRIVILEGES ] }
    ON { SEQUENCE имя_последовательности [, ...]
         | ALL SEQUENCES IN SCHEMA имя_схемы [, ...] }
    FROM описание_роли [, ...]
    [ GRANTED BY описание_роли ]
    [ CASCADE | RESTRICT ]

REVOKE [ GRANT OPTION FOR ]
    { { CREATE | CONNECT | TEMPORARY | TEMP } [, ...] | ALL [ PRIVILEGES ] }
    ON DATABASE имя_базы_данных [, ...]
    FROM описание_роли [, ...]
    [ GRANTED BY описание_роли ]
    [ CASCADE | RESTRICT ]

REVOKE [ GRANT OPTION FOR ]
    { USAGE | ALL [ PRIVILEGES ] }
    ON DOMAIN имя_домена [, ...]
    FROM описание_роли [, ...]
    [ GRANTED BY описание_роли ]
    [ CASCADE | RESTRICT ]

REVOKE [ GRANT OPTION FOR ]
    { USAGE | ALL [ PRIVILEGES ] }
    ON FOREIGN DATA WRAPPER имя_обертки_сторонних_данных [, ...]
    FROM описание_роли [, ...]
    [ GRANTED BY описание_роли ]
    [ CASCADE | RESTRICT ]

REVOKE [ GRANT OPTION FOR ]
    { USAGE | ALL [ PRIVILEGES ] }
    ON FOREIGN SERVER имя_сервера [, ...]
    FROM описание_роли [, ...]
    [ GRANTED BY описание_роли ]
    [ CASCADE | RESTRICT ]

REVOKE [ GRANT OPTION FOR ]
    { EXECUTE | ALL [ PRIVILEGES ] }
    ON { { FUNCTION | PROCEDURE | ROUTINE } имя_функции [ ( [ [ режим_аргумента ] [ имя_аргумента ] тип_аргумента [, ...] ] ) ] [, ...]
         | ALL { FUNCTIONS | PROCEDURES | ROUTINES } IN SCHEMA имя_схемы [, ...] }
    FROM описание_роли [, ...]
    [ GRANTED BY описание_роли ]
    [ CASCADE | RESTRICT ]

REVOKE [ GRANT OPTION FOR ]
    { USAGE | ALL [ PRIVILEGES ] }
    ON LANGUAGE имя_языка [, ...]
    FROM описание_роли [, ...]
    [ GRANTED BY описание_роли ]
    [ CASCADE | RESTRICT ]

REVOKE [ GRANT OPTION FOR ]
    { { SELECT | UPDATE } [, ...] | ALL [ PRIVILEGES ] }
    ON LARGE OBJECT oid_большого_объекта [, ...]
    FROM описание_роли [, ...]
    [ GRANTED BY описание_роли ]
    [ CASCADE | RESTRICT ]

REVOKE [ GRANT OPTION FOR ]
    { { CREATE | USAGE } [, ...] | ALL [ PRIVILEGES ] }
    ON SCHEMA имя_схемы [, ...]
    FROM описание_роли [, ...]
    [ GRANTED BY описание_роли ]
    [ CASCADE | RESTRICT ]

REVOKE [ GRANT OPTION FOR ]
    { CREATE | ALL [ PRIVILEGES ] }
    ON TABLESPACE имя_табличного_пространства [, ...]
    FROM описание_роли [, ...]
    [ GRANTED BY описание_роли ]
    [ CASCADE | RESTRICT ]

REVOKE [ GRANT OPTION FOR ]
    { USAGE | ALL [ PRIVILEGES ] }
    ON TYPE имя_типа [, ...]
    FROM описание_роли [, ...]
    [ GRANTED BY описание_роли ]
    [ CASCADE | RESTRICT ]

REVOKE [ ADMIN OPTION FOR ]
    имя_роли [, ...] FROM описание_роли [, ...]
    [ GRANTED BY описание_роли ]
    [ CASCADE | RESTRICT ]

где описанием_роли может быть:

    [ GROUP ] имя_роли
  | PUBLIC
  | CURRENT_ROLE
  | CURRENT_USER
  | SESSION_USER

Описание

Команда REVOKE отзывает ранее предоставленные права у одной или нескольких ролей. Ключевое слово PUBLIC обозначает неявно определенную группу всех ролей.

Определение типов прав см. в описании команды GRANT.

Обратите внимание, что любая конкретная роль будет иметь сумму прав, предоставленных непосредственно ей, прав, предоставленных любой роли, членом которой она в настоящее время является, и прав, предоставленных группе PUBLIC. Таким образом, например, отзыв у роли PUBLIC права SELECT не обязательно означает, что все роли потеряют права SELECT для данного объекта: те, кто получил это право непосредственно или через другую роль, все равно будут иметь его. Аналогично удаление у пользователя права SELECT может не повлиять на его возможность пользоваться этим правом, если оно выдано группе PUBLIC или другой роли, членом которой является этот пользователь.

Если указано GRANT OPTION FOR, отзывается только возможность передачи права, а не само это право. В противном случае будут отменены и право, и возможность передачи.

Если пользователь имеет право с возможностью передачи и предоставил его другим пользователям, то такие права называются зависимыми. Если при отзыве у первого пользователя самого права или возможности его передачи указано CASCADE, то зависимые права (если таковые существуют) тоже отзываются; в противном случае операция отзыва завершается ошибкой. Этот рекурсивный отзыв прав влияет только на права, предоставленные через цепочку пользователей, которая отслеживается до пользователя, являющегося субъектом этой команды REVOKE. Таким образом, затронутые пользователи в итоге могут сохранить это право, если оно было также получено через других пользователей.

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

При отзыве членства в роли указание GRANT OPTION меняется на ADMIN OPTION, но поведение очень похоже. Эта форма команды также принимает указание GRANTED BY, но в настоящее время оно игнорируется (за исключением проверки на существование указанной в нем роли). Также обратите внимание, что эта форма команды не принимает пропускаемое слово GROUP в описании_роли.


Примечания

Пользователь может отозвать только те права, которые предоставил непосредственно он сам. Если, например, пользователь A предоставил право с возможностью передачи пользователю B, а пользователь B в свою очередь предоставил его пользователю C, то пользователь A не может отозвать право непосредственно у пользователя C. Вместо этого пользователь A может отозвать возможность передачи у пользователя B и применить параметр CASCADE, чтобы это право в свою очередь было отозвано у пользователя C. Другой пример: если и A, и B предоставили одно и то же право C, A может отозвать только то право, которое предоставил он сам, но не В, поэтому в итоге 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, но QHB предполагает RESTRICT по умолчанию.


См. также

GRANT, ALTER DEFAULT PRIVILEGES