Spec-Zone.ru › MySQL 8.4

15.7.1.8 Заявление REVOKE

REVOKE [IF EXISTS]
    priv_type [(column_list)]
      [, priv_type [(column_list)]] ...
    ON [object_type] priv_level
    FROM user_or_role [, user_or_role] ...
    [IGNORE UNKNOWN USER]

REVOKE [IF EXISTS] ALL [PRIVILEGES], GRANT OPTION
    FROM user_or_role [, user_or_role] ...
    [IGNORE UNKNOWN USER]

REVOKE [IF EXISTS] PROXY ON user_or_role
    FROM user_or_role [, user_or_role] ...
    [IGNORE UNKNOWN USER]

REVOKE [IF EXISTS] role [, role ] ...
    FROM user_or_role [, user_or_role ] ...
    [IGNORE UNKNOWN USER]

user_or_role: {
    user (see Section 8.2.4, “Specifying Account Names”)
  | role (see Section 8.2.5, “Specifying Role Names”
}

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

Для получения подробностей о уровнях существования привилегий, допустимых значениях priv_type, priv_level и object_type, а также синтаксисе для указания пользователей и паролей, см. Раздел 15.7.1.6, «Заявление GRANT».

Для получения информации о ролях см. Раздел 8.2.10, «Использование ролей».

При включении системной переменной read_only, для использования заявления REVOKE требуется привилегия CONNECTION_ADMIN или привилегия (или устаревшая привилегия SUPER), помимо любых других требуемых привилегий, описанных в дальнейшем.

Все формы, показанные для REVOKE, поддерживают опцию IF EXISTS, а также опцию IGNORE UNKNOWN USER. Без этих изменений, REVOKE либо выполняется для всех указанных пользователей и ролей, либо отменяется и не имеет никакого эффекта, если возникает любая ошибка; заявление записывается в двоичный журнал только в случае успешного выполнения для всех указанных пользователей и ролей. Точные последствия IF EXISTS и IGNORE UNKNOWN USER обсуждаются позднее в этом разделе.

Каждое имя учетной записи использует формат, описанный в Разделе 8.2.4, «Указание имён учетных записей». Каждое имя роли использует формат, описанный в Разделе 8.2.5, «Указание имён ролей». Например:

REVOKE INSERT ON *.* FROM 'jeffrey'@'localhost';
REVOKE 'role1', 'role2' FROM 'user1'@'localhost', 'user2'@'localhost';
REVOKE SELECT ON world.* FROM 'role3';

Часть имени учетной записи или роли, если она опущена, по умолчанию равна '%'.

Для использования первого синтаксиса REVOKE вам необходима привилегия GRANT OPTION, а также привилегии, которые вы хотите отозвать.

Чтобы отозвать все привилегии от пользователя, используйте одно из следующих заявлений; любое из этих заявлений удаляет все глобальные, баз данных, таблицы, колонки и привилегии процедур для указанных пользователей или ролей:

REVOKE ALL PRIVILEGES, GRANT OPTION
  FROM user_or_role [, user_or_role] ...

REVOKE ALL ON *.*
  FROM user_or_role [, user_or_role] ...

Ни одно из только что показанных заявлений не отзывает никаких ролей.

Для использования этих заявлений REVOKE вам необходима глобальная привилегия CREATE USER или привилегия UPDATE для схемы системы mysql.

Синтаксис, при котором ключевое слово REVOKE следует за одним или несколькими именами ролей, принимает предложение FROM, указывающее одного или нескольких пользователей или ролей, у которых необходимо отозвать роли.

Опции IF EXISTS и IGNORE UNKNOWN USER имеют эффекты, указанные здесь:

  • IF EXISTS означает, что если целевой пользователь или роль существуют, но такая привилегия или роль не найдена, присваиваемая целевому объекту по какой-либо причине, поднимается предупреждение вместо ошибки; если ни одна привилегия или роль, указанная в заявлении, не назначена целевому объекту, заявление не имеет никакого (другого) эффекта. В противном случае, REVOKE выполняется нормально; если пользователь не существует, заявление вызывает ошибку.

    Пример: Учитывая таблицу t1 в базе данных test, мы выполняем следующие заявления с указанными результатами.

    mysql> CREATE USER jerry@localhost;
    Query OK, 0 rows affected (0.01 sec)
    
    mysql> REVOKE SELECT ON test.t1 FROM jerry@localhost;
    ERROR 1147 (42000): There is no such grant defined for user 'jerry' on host
    'localhost' on table 't1'
    mysql> REVOKE IF EXISTS SELECT ON test.t1 FROM jerry@localhost;
    Query OK, 0 rows affected, 1 warning (0.00 sec)
    
    mysql> SHOW WARNINGS\G
    *************************** 1. row ***************************
      Level: Warning
       Code: 1147
    Message: There is no such grant defined for user 'jerry' on host 'localhost' on
    table 't1'
    1 row in set (0.00 sec)
    

    IF EXISTS приводит к тому, что ошибка понижается до предупреждения, даже если привилегия или роль, указанная в заявлении, не существует, или заявление пытается назначить её на неправильном уровне.

  • Если заявление REVOKE включает IGNORE UNKNOWN USER, то заявление поднимает предупреждение для любого целевого пользователя или роли, указанного в заявлении, но не найденного; если ни один целевой объект, указанный в заявлении, не существует, REVOKE выполняется успешно, но фактически не имеет никакого эффекта. В противном случае заявление выполняется как обычно, а попытка отозвать привилегию, не назначенную целевому объекту по любой причине, вызывает ошибку, как ожидалось.

    Пример (продолжение предыдущего примера):

    mysql> DROP USER IF EXISTS jerry@localhost;
    Query OK, 0 rows affected (0.01 sec)
    
    mysql> REVOKE SELECT ON test.t1 FROM jerry@localhost;
    ERROR 1147 (42000): There is no such grant defined for user 'jerry' on host
    'localhost' on table 't1'
    mysql> REVOKE SELECT ON test.t1 FROM jerry@localhost IGNORE UNKNOWN USER;
    Query OK, 0 rows affected, 1 warning (0.01 sec)
    
    mysql> SHOW WARNINGS\G
    *************************** 1. row ***************************
      Level: Warning
       Code: 3162
    Message: Authorization ID jerry does not exist.
    1 row in set (0.00 sec)
    
  • Сочетание IF EXISTS и IGNORE UNKNOWN USER означает, что REVOKE никогда не вызывает ошибку для неизвестного целевого пользователя или роли или для неназначенной или недоступной привилегии, и само заявление в таких случаях выполняется успешно; роли или привилегии удаляются из существующих целевых пользователей или ролей, когда это возможно, а любые невозможные отзыва вызывают предупреждение и выполняются как NOOP.

    Пример (ещё раз продолжая пример в предыдущем пункте):

    # No such user, no such role
    mysql> DROP ROLE IF EXISTS Bogus;
    Query OK, 0 rows affected, 1 warning (0.02 sec)
    
    mysql> SHOW WARNINGS;
    +-------+------+----------------------------------------------+
    | Level | Code | Message                                      |
    +-------+------+----------------------------------------------+
    | Note  | 3162 | Authorization ID 'Bogus'@'%' does not exist. |
    +-------+------+----------------------------------------------+
    1 row in set (0.00 sec)
    
    # This statement attempts to revoke a nonexistent role from a nonexistent user
    mysql> REVOKE Bogus ON test FROM jerry@localhost;
    ERROR 3619 (HY000): Illegal privilege level specified for test
    
    # The same, with IF EXISTS
    mysql> REVOKE IF EXISTS Bogus ON test FROM jerry@localhost;
    ERROR 1147 (42000): There is no such grant defined for user 'jerry' on host
    'localhost' on table 'test'
    
    # The same, with IGNORE UNKNOWN USER
    mysql> REVOKE Bogus ON test FROM jerry@localhost IGNORE UNKNOWN USER;
    ERROR 3619 (HY000): Illegal privilege level specified for test
    
    # The same, with both options
    mysql> REVOKE IF EXISTS Bogus ON test FROM jerry@localhost IGNORE UNKNOWN USER;
    Query OK, 0 rows affected, 2 warnings (0.01 sec)
    
    mysql> SHOW WARNINGS;
    +---------+------+--------------------------------------------+
    | Level   | Code | Message                                    |
    +---------+------+--------------------------------------------+
    | Warning | 3619 | Illegal privilege level specified for test |
    | Warning | 3162 | Authorization ID jerry does not exist.     |
    +---------+------+--------------------------------------------+
    2 rows in set (0.00 sec)
    

Роли, указанные в значении системной переменной mandatory_roles, не могут быть отозваны. При совместном использовании IF EXISTS и IGNORE UNKNOWN USER в заявлении, пытающемся удалить обязательную привилегию, ошибка, обычно возникающая при попытке сделать это, понижается до предупреждения; заявление выполняется успешно, но не вносит никаких изменений.

Отозванная роль немедленно влияет на любую учетную запись пользователя, от которой она была отозвана, так что в любой текущей сессии для учетной записи её привилегии корректируются для следующего выполняемого заявления.

Отозывание роли отзывает саму роль, а не привилегии, которые она представляет. Предположим, что учетной записи предоставлена роль, включающая данную привилегию, и также предоставлена привилегия явно или через другую роль, которая включает привилегию. В этом случае учетная запись по-прежнему обладает этой привилегией, если первая роль отозвана. Например, если учетной записи предоставлены две роли, каждая из которых включает SELECT, учетная запись по-прежнему может выполнять выбор после отзыва любой роли.

REVOKE ALL ON *.* (на глобальном уровне) отзывает все предоставленные статические глобальные привилегии и все предоставленные динамические привилегии.

Отозванная привилегия, которая предоставлена, но не известна серверу, отзывается с предупреждением. Эта ситуация может возникнуть для динамических привилегий. Например, динамическая привилегия может быть предоставлена, пока компонент, её регистрирующий, установлен, но если этот компонент впоследствии будет удалён, привилегия перестанет быть зарегистрированной, хотя учетные записи, которые обладают привилегией, всё ещё обладают ею и её можно отозвать у них.

REVOKE удаляет привилегии, но не удаляет строки из системной таблицы mysql.user. Чтобы полностью удалить учетную запись пользователя, используйте DROP USER. См. Раздел 15.7.1.5, «Заявление DROP USER».

Если таблицы разрешений содержат строки привилегий, которые содержат имена баз данных или таблиц с разным регистром, а системная переменная lower_case_table_names установлена в ненулевое значение, REVOKE не может быть использована для отзыва этих привилегий. В таких случаях необходимо напрямую манипулировать таблицами разрешений. (GRANT не создаёт таких строк, когда lower_case_table_names установлена, но такие строки могли быть созданы до установки переменной. Настройка lower_case_table_names может быть сконфигурирована только при инициализации сервера.)

При успешном выполнении из программы mysql, REVOKE отвечает Query OK, 0 rows affected. Для определения оставшихся привилегий после операции используйте SHOW GRANTS. См. Раздел 15.7.7.22, «Заявление SHOW GRANTS».

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-8.4-en/revoke.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API