Spec-Zone.ru › MySQL 9.2

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.23, «Оператор SHOW GRANTS».

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

Spec-Zone.ru

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