Spec-Zone.ru › MySQL 9.2

15.7.1.6 Оператор GRANT

GRANT
    priv_type [(column_list)]
      [, priv_type [(column_list)]] ...
    ON [object_type] priv_level
    TO user_or_role [, user_or_role] ...
    [WITH GRANT OPTION]
    [AS user
        [WITH ROLE
            DEFAULT
          | NONE
          | ALL
          | ALL EXCEPT role [, role ] ...
          | role [, role ] ...
        ]
    ]
}

GRANT PROXY ON user_or_role
    TO user_or_role [, user_or_role] ...
    [WITH GRANT OPTION]

GRANT role [, role] ...
    TO user_or_role [, user_or_role] ...
    [WITH ADMIN OPTION]

object_type: {
    TABLE
  | EVENT
  | FUNCTION
  | LIBRARY
  | PROCEDURE
}

priv_level: {
    *
  | *.*
  | db_name.*
  | db_name.tbl_name
  | tbl_name
  | db_name.routine_name
}

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

Оператор GRANT назначает привилегии и роли пользователям и ролям MySQL. В операторе GRANT есть несколько аспектов, описанных в следующих разделах:

  • Общие сведения об операторе GRANT

  • Правила цитирования объектов

  • Имена учетных записей

  • Поддерживаемые MySQL привилегии

  • Глобальные привилегии

  • Привилегии для баз данных

  • Привилегии для таблиц

  • Привилегии для столбцов

  • Привилегии для хранимых процедур

  • Привилегии прокси-пользователей

  • Назначение ролей

  • Оператор AS и ограничения привилегий

  • Другие характеристики учетной записи

  • Версии оператора GRANT MySQL и Стандартного SQL

Общие сведения об операторе GRANT

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

  • Оператор GRANT не может сочетать предоставление привилегий и ролей в одном операторе. Оператор GRANT должен предоставлять либо привилегии, либо роли.

  • Оператор ON определяет, предоставляются ли привилегии или роли:

    • С помощью ON, оператор предоставляет привилегии.

    • Без ON, оператор предоставляет роли.

    • Разрешается назначать как привилегии, так и роли учетной записи, но необходимо использовать отдельные операторы GRANT каждый с синтаксисом, соответствующим предоставляемому объекту.

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

Для предоставления привилегии с помощью GRANT, необходимо иметь привилегию GRANT OPTION, а также привилегии, которые вы предоставляете. (В качестве альтернативы, если у вас есть привилегия UPDATE для таблиц предоставления в схеме системы mysql, вы можете предоставить любой учетной записи любые привилегии.) Если переменная системы read_only включена, оператор GRANT дополнительно требует привилегию CONNECTION_ADMIN (или устаревшую привилегию SUPER).

Оператор GRANT либо выполняется для всех указанных пользователей и ролей, либо откатывается и не имеет эффекта, если возникает какая-либо ошибка. Оператор записывается в двоичный журнал только в случае успешного выполнения для всех указанных пользователей и ролей.

Оператор REVOKE связан с оператором GRANT и позволяет администраторам удалять привилегии учетных записей. См. Раздел 15.7.1.8, «Оператор REVOKE».

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

GRANT ALL ON db1.* TO 'jeffrey'@'localhost';
GRANT 'role1', 'role2' TO 'user1'@'localhost', 'user2'@'localhost';
GRANT SELECT ON world.* TO 'role3';

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

Обычно администратор базы данных сначала использует CREATE USER для создания учетной записи и определения ее характеристик, не связанных с привилегиями, таких как пароль, использование защищенных соединений и ограничения доступа к ресурсам сервера, затем использует GRANT для определения ее привилегий. ALTER USER может использоваться для изменения характеристик учетных записей, не связанных с привилегиями. Например:

CREATE USER 'jeffrey'@'localhost' IDENTIFIED BY 'password';
GRANT ALL ON db1.* TO 'jeffrey'@'localhost';
GRANT SELECT ON db2.invoice TO 'jeffrey'@'localhost';
ALTER USER 'jeffrey'@'localhost' WITH MAX_QUERIES_PER_HOUR 90;

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

Важно

В некоторых случаях, оператор GRANT может быть записан в журналы сервера или на стороне клиента в файле истории, например, в ~/.mysql_history, что означает, что текстовые пароли могут быть прочитаны любым лицом с правами доступа к этой информации. Дополнительную информацию о ситуациях, когда это происходит для журналов сервера, и как это контролировать, см. в Разделе 8.1.2.3, «Пароли и протоколирование». Аналогичную информацию о протоколировании на стороне клиента см. в Разделе 6.5.1.3, «Протоколирование клиента mysql».

Оператор GRANT поддерживает имена хостов длиной до 255 символов. Имена пользователей могут быть длиной до 32 символов. Имена баз данных, таблиц, столбцов и процедур могут быть длиной до 64 символов.

Предупреждение

Не пытайтесь изменить допустимую длину имен пользователей, изменяя таблицу системы mysql.user. Это приводит к непредсказуемому поведению, которое может даже сделать невозможным вход пользователей в сервер MySQL. Никогда не изменяйте структуру таблиц в схеме системы mysql никаким образом, кроме описанного в Главе 3, «Модернизация MySQL».

Рекомендации по цитированию объектов

Некоторые объекты в операторах GRANT требуют цитирования, хотя во многих случаях это необязательно: имена учетных записей, ролей, баз данных, таблиц, столбцов и процедур. Например, если значение user_name или host_name в имени учетной записи допустимо как нецитируемый идентификатор, вы можете его не цитировать. Однако цитирование необходимо для задания user_name строки, содержащей специальные символы (например, -), или host_name строки, содержащей специальные символы или символы подстановки, такие как % (например, 'test-user'@'%.com'). Имя пользователя и имя хоста следует цитировать отдельно.

Для задания цитируемых значений:

  • Цитируйте имена баз данных, таблиц, столбцов и процедур как идентификаторы.

  • Цитируйте имена пользователей и имена хостов как идентификаторы или как строки.

  • Цитируйте пароли как строки.

Рекомендации по цитированию строк и идентификаторов см. в разделе 11.1.1 «Строковые литералы» и разделе 11.2 «Имена объектов схемы».

Важно

Использование символов подстановки % и _, как описано в следующих абзацах, устарело и может быть удалено в будущих версиях MySQL.

Символы подстановки _ и % разрешены при указании имен баз данных в операторах GRANT, предоставляющих привилегии на уровне базы данных (GRANT ... ON db_name.*). Это означает, что для использования символа _ в имени базы данных необходимо указать его с помощью символа экранирования \ как \_ в операторе GRANT, чтобы предотвратить доступ пользователя к дополнительным базам данных, соответствующим шаблону подстановки (например, GRANT ... ON `foo\_bar`.* TO ...).

Использование нескольких операторов GRANT, содержащих символы подстановки, может не иметь ожидаемого эффекта на операторы DML; при разрешении предоставления привилегий, включающих символы подстановки, MySQL учитывает только первое соответствующее предоставление привилегий. Другими словами, если у пользователя есть два предоставления привилегий на уровне базы данных, использующие символы подстановки, соответствующие той же базе данных, то применяется предоставление, созданное первым. Рассмотрим базу данных db и таблицу t, созданные с помощью операторов, показанных здесь:

mysql> CREATE DATABASE db;
Query OK, 1 row affected (0.01 sec)

mysql> CREATE TABLE db.t (c INT);
Query OK, 0 rows affected (0.01 sec)

mysql> INSERT INTO db.t VALUES ROW(1);
Query OK, 1 row affected (0.00 sec)

Далее (предполагая, что текущая учетная запись — это учетная запись MySQL root или другая учетная запись с необходимыми привилегиями), мы создаем пользователя u и затем выполняем два оператора GRANT, содержащих символы подстановки, следующим образом:

mysql> CREATE USER u;
Query OK, 0 rows affected (0.01 sec)

mysql> GRANT SELECT ON `d_`.* TO u;
Query OK, 0 rows affected (0.01 sec)

mysql> GRANT INSERT ON `d%`.* TO u;
Query OK, 0 rows affected (0.00 sec)

mysql> EXIT
Bye

Если мы завершим сеанс и затем снова войдем с помощью клиента mysql, на этот раз как u, мы увидим, что у этой учетной записи есть только привилегии, предоставленные первым соответствующим предоставлением, но не вторым:

$> mysql -uu -hlocalhost
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 10
Server version: 9.2.0-tr Source distribution

Copyright (c) 2000, 2023, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input
statement.

mysql> TABLE db.t;
+------+
| c    |
+------+
|    1 |
+------+
1 row in set (0.00 sec)

mysql> INSERT INTO db.t VALUES ROW(2);
ERROR 1142 (42000): INSERT command denied to user 'u'@'localhost' for table 't'

При назначении привилегий MySQL интерпретирует вхождения неэкранированных _ и % символов подстановки SQL в именах баз данных как буквальные символы в следующих ситуациях:

  • Когда имя базы данных не используется для предоставления привилегий на уровне базы данных, а в качестве квалификатора для предоставления привилегий другому объекту, такому как таблица или процедура (например, GRANT ... ON db_name.tbl_name).

  • Включение partial_revokes заставляет MySQL интерпретировать неэкранированные _ и % символы подстановки в именах баз данных как буквальные символы, точно так же, как если бы они были экранированы как \_ и \%. Поскольку это изменяет способ интерпретации MySQL привилегий, рекомендуется избегать неэкранированных символов подстановки в заданиях привилегий для установок, где partial_revokes может быть включено. Дополнительную информацию см. в разделе 8.2.12 «Ограничение привилегий с помощью частичных аннулирований».

Имена учетных записей

Значение user в операторе GRANT указывает на учетную запись MySQL, к которой применяется оператор. Для предоставления прав пользователям с произвольных хостов MySQL поддерживает указание значения user в форме 'user_name'@'host_name'.

Вы можете указывать символы подстановки в имени хоста. Например, 'user_name'@'%.example.com' относится к user_name для любого хоста в домене example.com, а 'user_name'@'198.51.100.%' относится к user_name для любого хоста в подсети класса C 198.51.100.

Простая форма 'user_name' является синонимом для 'user_name'@'%'.

Примечание

MySQL автоматически назначает все привилегии, предоставленные 'username'@'%', учетной записи 'username'@'localhost' также. Это поведение устарело и может быть удалено в будущих версиях MySQL.

MySQL не поддерживает символы подстановки в именах пользователей. Для ссылки на анонимного пользователя укажите учетную запись с пустым именем пользователя с помощью оператора GRANT:

GRANT ALL ON test.* TO ''@'localhost' ...;

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

Дополнительную информацию о значениях имени пользователя и имени хоста в именах учетных записей см. в разделе 8.2.4 «Указание имен учетных записей».

Предупреждение

Если вы разрешаете подключение локальных анонимных пользователей к серверу MySQL, вы также должны предоставить привилегии всем локальным пользователям как 'user_name'@'localhost'. В противном случае учетная запись анонимного пользователя для localhost в таблице системы mysql.user используется, когда именованные пользователи пытаются войти в систему MySQL с локальной машины. Подробнее см. в разделе 8.2.6 «Управление доступом, этап 1: Проверка подключения».

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

SELECT Host, User FROM mysql.user WHERE User='';

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

DROP USER ''@'localhost';
Поддерживаемые MySQL привилегии

В следующих таблицах обобщены допустимые статические и динамические типы привилегий, которые можно указать для команд GRANT и REVOKE, а также уровни, на которых можно предоставить каждую привилегию. Дополнительную информацию о каждой привилегии см. в разделе 8.2.2, «Привилегии, предоставляемые MySQL». Сведения о различиях между статическими и динамическими привилегиями см. в разделе «Статические и динамические привилегии».

Таблица 15.11 Допустимые статические привилегии для GRANT и REVOKE

Таблица 15.11 Допустимые статические привилегии для GRANT и REVOKE
Привилегия Значение и уровни предоставления
ALL [PRIVILEGES] Предоставление всех привилегий на указанном уровне доступа, за исключением GRANT OPTION и PROXY.
ALTER Разрешение использования ALTER TABLE. Уровни: глобальный, база данных, таблица.
ALTER ROUTINE Разрешение изменения или удаления хранимых процедур. Уровни: глобальный, база данных, процедура.
CREATE Разрешение создания баз данных и таблиц. Уровни: глобальный, база данных, таблица.
CREATE ROLE Разрешение создания ролей. Уровень: глобальный.
CREATE ROUTINE Разрешение создания хранимых процедур. Уровни: глобальный, база данных.
CREATE TABLESPACE Разрешение создания, изменения или удаления табличных пространств и групп файлов журнала. Уровень: глобальный.
CREATE TEMPORARY TABLES Разрешение использования CREATE TEMPORARY TABLE. Уровни: глобальный, база данных.
CREATE USER Разрешение использования CREATE USER, DROP USER, RENAME USER и REVOKE ALL PRIVILEGES. Уровень: глобальный.
CREATE VIEW Разрешение создания или изменения представлений. Уровни: глобальный, база данных, таблица.
DELETE Разрешение использования DELETE. Уровень: глобальный, база данных, таблица.
DROP Разрешение удаления баз данных, таблиц и представлений. Уровни: глобальный, база данных, таблица.
DROP ROLE Разрешение удаления ролей. Уровень: глобальный.
EVENT Разрешение использования событий для планировщика событий. Уровни: глобальный, база данных.
EXECUTE Разрешение пользователю выполнения хранимых процедур. Уровни: глобальный, база данных, процедура.
FILE Разрешение пользователю чтения или записи файлов. Уровень: глобальный.
FLUSH_PRIVILEGES Разрешение пользователю выполнения команд FLUSH PRIVILEGES. Уровень: глобальный.
GRANT OPTION Разрешение предоставления или удаления привилегий другим учетным записям. Уровни: глобальный, база данных, таблица, процедура, прокси.
INDEX Разрешение создания или удаления индексов. Уровни: глобальный, база данных, таблица.
INSERT Разрешение использования INSERT. Уровни: глобальный, база данных, таблица, столбец.
LOCK TABLES Разрешение использования LOCK TABLES для таблиц, для которых у вас есть привилегия SELECT. Уровни: глобальный, база данных.
OPTIMIZE_LOCAL_TABLE Разрешение использования OPTIMIZE LOCAL TABLE или OPTIMIZE NO_WRITE_TO_BINLOG TABLE. Уровни: глобальный, база данных, таблица.
PROCESS Разрешение пользователю просмотра всех процессов с помощью SHOW PROCESSLIST. Уровень: глобальный.
PROXY Разрешение использования пользовательского проксирования. Уровень: от пользователя к пользователю.
REFERENCES Разрешение создания внешних ключей. Уровни: глобальный, база данных, таблица, столбец.
RELOAD Разрешение использования операций FLUSH. Уровень: глобальный.
REPLICATION CLIENT Разрешение пользователю запроса о местоположении серверов источника или реплики. Уровень: глобальный.
REPLICATION SLAVE Разрешение репликам чтения событий двоичного журнала от источника. Уровень: глобальный.
SELECT Разрешение использования SELECT. Уровни: глобальный, база данных, таблица, столбец.
SHOW DATABASES Разрешение использования SHOW DATABASES для отображения всех баз данных. Уровень: глобальный.
SHOW VIEW Разрешение использования SHOW CREATE VIEW. Уровни: глобальный, база данных, таблица.
SHUTDOWN Разрешение использования mysqladmin shutdown. Уровень: глобальный.
SUPER Разрешение использования других административных операций, таких как CHANGE REPLICATION SOURCE TO, KILL, PURGE BINARY LOGS, SET GLOBAL и команда mysqladmin debug. Уровень: глобальный.
TRIGGER Разрешение операций с триггерами. Уровни: глобальный, база данных, таблица.
UPDATE Разрешение использования UPDATE. Уровни: глобальный, база данных, таблица, столбец.
USAGE Синоним для «без привилегий»

Таблица 15.12 Разрешенные динамические привилегии для GRANT и REVOKE

Таблица 15.12 Разрешенные динамические привилегии для GRANT и REVOKE
Привилегия Значение и уровни предоставления
APPLICATION_PASSWORD_ADMIN Включение двойной администрирования паролей. Уровень: глобальный.
AUDIT_ABORT_EXEMPT Разрешение запросов, заблокированных фильтром журнала аудита. Уровень: глобальный.
AUDIT_ADMIN Включение конфигурации журнала аудита. Уровень: глобальный.
AUTHENTICATION_POLICY_ADMIN Включение администрирования политики аутентификации. Уровень: глобальный.
BACKUP_ADMIN Включение администрирования резервного копирования. Уровень: глобальный.
BINLOG_ADMIN Включение управления двоичным журналом. Уровень: глобальный.
BINLOG_ENCRYPTION_ADMIN Включение активации и деактивации шифрования двоичного журнала. Уровень: глобальный.
CLONE_ADMIN Включение администрирования клонирования. Уровень: глобальный.
CONNECTION_ADMIN Включение управления ограничениями/ограничением подключений. Уровень: глобальный.
ENCRYPTION_KEY_ADMIN Включение вращения ключа InnoDB. Уровень: глобальный.
FIREWALL_ADMIN Включение администрирования правил брандмауэра для любого пользователя. Уровень: глобальный.
FIREWALL_EXEMPT Исключение пользователя из ограничений брандмауэра. Уровень: глобальный.
FIREWALL_USER Включение администрирования правил брандмауэра для самого себя. Уровень: глобальный.
FLUSH_OPTIMIZER_COSTS Включение перезагрузки стоимости оптимизатора. Уровень: глобальный.
FLUSH_STATUS Включение очистки индикатора состояния. Уровень: глобальный.
FLUSH_TABLES Включение очистки таблиц. Уровень: глобальный.
FLUSH_USER_RESOURCES Включение очистки ресурсов пользователя. Уровень: глобальный.
GROUP_REPLICATION_ADMIN Включение управления Group Replication. Уровень: глобальный.
INNODB_REDO_LOG_ARCHIVE Включение администрирования архивирования журнала редо. Уровень: глобальный.
INNODB_REDO_LOG_ENABLE Включение или отключение ведения журнала редо. Уровень: глобальный.
NDB_STORED_USER Включение совместного использования пользователя или роли между узлами SQL (NDB Cluster). Уровень: глобальный.
PASSWORDLESS_USER_ADMIN Включение администрирования учетных записей пользователей без пароля. Уровень: глобальный.
PERSIST_RO_VARIABLES_ADMIN Включение сохранения системных переменных только для чтения. Уровень: глобальный.
REPLICATION_APPLIER Выступать в роли PRIVILEGE_CHECKS_USER для канала репликации. Уровень: глобальный.
REPLICATION_SLAVE_ADMIN Включение обычного управления репликацией. Уровень: глобальный.
RESOURCE_GROUP_ADMIN Включение администрирования группы ресурсов. Уровень: глобальный.
RESOURCE_GROUP_USER Включение администрирования группы ресурсов. Уровень: глобальный.
ROLE_ADMIN Включение возможности предоставления или отзыва ролей, использование WITH ADMIN OPTION. Уровень: глобальный.
SESSION_VARIABLES_ADMIN Включение установки ограниченных системных переменных сеанса. Уровень: глобальный.
SHOW_ROUTINE Включение доступа к определениям хранимых процедур. Уровень: глобальный.
SKIP_QUERY_REWRITE Не переписывать запросы, выполняемые этим пользователем. Уровень: глобальный.
SYSTEM_USER Назначение учетной записи в качестве системной учетной записи. Уровень: глобальный.
SYSTEM_VARIABLES_ADMIN Включение изменения или сохранения глобальных системных переменных. Уровень: глобальный.
TABLE_ENCRYPTION_ADMIN Включение переопределения параметров шифрования по умолчанию. Уровень: глобальный.
TELEMETRY_LOG_ADMIN Включение конфигурации журнала телеметрии для HeatWave на AWS. Уровень: глобальный.
TP_CONNECTION_ADMIN Включение администрирования подключений пула потоков. Уровень: глобальный.
VERSION_TOKEN_ADMIN Включение использования функций маркеров версии. Уровень: глобальный.
XA_RECOVER_ADMIN Включение выполнения XA RECOVER. Уровень: глобальный.

Триггер связан с таблицей. Чтобы создать или удалить триггер, необходимо иметь привилегию TRIGGER для таблицы, а не для триггера.

В операторах GRANT привилегия ALL [PRIVILEGES] или PROXY должна быть указана самостоятельно и не может быть указана вместе с другими привилегиями. ALL [PRIVILEGES] означает все привилегии, доступные для уровня, на котором предоставляются привилегии, за исключением привилегий GRANT OPTION и PROXY.

Информация об учетных записях MySQL хранится в таблицах схемы mysql. Для получения дополнительной информации см. Раздел 8.2, «Управление доступом и учетными записями», в котором подробно описывается схема mysql и система управления доступом.

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

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

Для глобального, баз данных, таблиц и уровней процедур GRANT ALL назначаются только те привилегии, которые существуют на предоставляемом уровне. Например, GRANT ALL ON db_name.* - это оператор уровня базы данных, поэтому он не предоставляет какие-либо привилегии, доступные только на глобальном уровне, такие как FILE. Предоставление привилегии ALL не назначает привилегии GRANT OPTION или PROXY.

Пункт object_type, если он присутствует, следует указывать как TABLE, EVENT, FUNCTION, LIBRARY или PROCEDURE, когда следующий объект является таблицей, событием, хранимой функцией, JavaScript-библиотекой или хранимой процедурой.

Привилегии пользователя для базы данных, таблицы, столбца или процедуры формируются аддитивно как логическое OR привилегий учетной записи на каждом уровне привилегий, включая глобальный уровень. Невозможно запретить привилегию, предоставленную на более высоком уровне, отсутствием этой привилегии на более низком уровне. Например, данное утверждение предоставляет SELECT и INSERT привилегии глобально:

GRANT SELECT, INSERT ON *.* TO u1;

Глобально предоставленные привилегии применяются ко всем базам данных, таблицам и столбцам, даже если они не предоставлены на каком-либо из этих более низких уровней.

Возможно явно запретить привилегию, предоставленную на глобальном уровне, отозвав её для конкретных баз данных, если переменная системы partial_revokes включена:

GRANT SELECT, INSERT, UPDATE ON *.* TO u1;
REVOKE INSERT, UPDATE ON db1.* FROM u1;

Результатом предыдущих операторов является то, что SELECT применяется глобально ко всем таблицам, тогда как INSERT и UPDATE применяются глобально за исключением таблиц в db1. Доступ учетной записи к db1 — только для чтения.

Подробности процедуры проверки привилегий приведены в разделе 8.2.7, «Контроль доступа, этап 2: Проверка запроса».

Если вы используете привилегии для таблиц, столбцов или процедур хотя бы для одного пользователя, сервер проверяет привилегии для всех пользователей, и это немного замедляет MySQL. Аналогично, если вы ограничите количество запросов, обновлений или подключений для любых пользователей, сервер должен отслеживать эти значения.

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

Важно

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

Глобальные привилегии

Глобальные привилегии являются административными или применяются ко всем базам данных на данном сервере. Для назначения глобальных привилегий используйте синтаксис ON *.*:

GRANT ALL ON *.* TO 'someuser'@'somehost';
GRANT SELECT, INSERT ON *.* TO 'someuser'@'somehost';

CREATE TABLESPACE, CREATE USER, FILE, PROCESS, RELOAD, REPLICATION CLIENT, REPLICATION SLAVE, SHOW DATABASES, SHUTDOWN и SUPER статические привилегии являются административными и могут быть предоставлены только глобально.

Динамические привилегии также являются глобальными и могут быть предоставлены только глобально.

Другие привилегии могут быть предоставлены глобально или на более конкретных уровнях.

Эффект привилегии GRANT OPTION, предоставленной на глобальном уровне, отличается для статических и динамических привилегий:

  • GRANT OPTION, предоставленная для любой статической глобальной привилегии, применяется ко всем статическим глобальным привилегиям.

  • GRANT OPTION, предоставленная для любой динамической привилегии, применяется только к этой динамической привилегии.

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

MySQL хранит глобальные привилегии в таблице системы mysql.user.

Привилегии базы данных

Привилегии базы данных применяются ко всем объектам в данной базе данных. Для назначения привилегий на уровне базы данных используйте синтаксис ON db_name.*:

GRANT ALL ON mydb.* TO 'someuser'@'somehost';
GRANT SELECT, INSERT ON mydb.* TO 'someuser'@'somehost';

Если вы используете синтаксис ON * (вместо ON *.*), привилегии назначаются на уровне базы данных для базы данных по умолчанию. Возникает ошибка, если база данных по умолчанию отсутствует.

CREATE, DROP, EVENT, GRANT OPTION, LOCK TABLES и REFERENCES привилегии могут быть указаны на уровне базы данных. Привилегии для таблиц или процедур также могут быть указаны на уровне базы данных, в этом случае они применяются ко всем таблицам или процедурам в базе данных.

MySQL хранит привилегии базы данных в таблице системы mysql.db.

Привилегии таблиц

Привилегии таблиц применяются ко всем столбцам в данной таблице. Для назначения привилегий на уровне таблицы используйте синтаксис ON db_name.tbl_name:

GRANT ALL ON mydb.mytbl TO 'someuser'@'somehost';
GRANT SELECT, INSERT ON mydb.mytbl TO 'someuser'@'somehost';

Если вы укажете tbl_name вместо db_name.tbl_name, оператор применяется к tbl_name в базе данных по умолчанию. Возникает ошибка, если база данных по умолчанию отсутствует.

Допустимые значения priv_type на уровне таблицы — ALTER, CREATE VIEW, CREATE, DELETE, DROP, GRANT OPTION, INDEX, INSERT, REFERENCES, SELECT, SHOW VIEW, TRIGGER и UPDATE.

Привилегии на уровне таблицы применяются к базовым таблицам и представлениям. Они не применяются к таблицам, созданным с помощью CREATE TEMPORARY TABLE, даже если имена таблиц совпадают. Подробности о привилегиях для таблиц TEMPORARY см. в разделе 15.1.21.2, «Оператор CREATE TEMPORARY TABLE».

MySQL хранит привилегии таблиц в таблице системы mysql.tables_priv.

Привилегии столбцов

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

GRANT SELECT (col1), INSERT (col1, col2) ON mydb.mytbl TO 'someuser'@'somehost';

Допустимые значения priv_type для столбца (т. е. при использовании клаузы column_list) — INSERT, REFERENCES, SELECT и UPDATE.

MySQL хранит привилегии столбцов в таблице системы mysql.columns_priv.

END_OF_DOCUMENT_MARKER
Привилегии хранимых процедур

Привилегии ALTER ROUTINE, CREATE ROUTINE, EXECUTE и GRANT OPTION применяются к хранимым процедурам (процедурам и функциям). Их можно предоставлять на глобальном и уровне базы данных. За исключением CREATE ROUTINE, эти привилегии могут быть предоставлены на уровне процедуры для отдельных процедур.

GRANT CREATE ROUTINE ON mydb.* TO 'someuser'@'somehost';
GRANT EXECUTE ON PROCEDURE mydb.myproc TO 'someuser'@'somehost';

Разрешенные значения priv_type на уровне процедуры — ALTER ROUTINE, EXECUTE и GRANT OPTION. CREATE ROUTINE не является привилегией на уровне процедуры, поскольку для создания процедуры в первую очередь необходимо иметь привилегию на глобальном или уровне базы данных.

MySQL сохраняет привилегии на уровне процедур в таблице системы mysql.procs_priv.

Привилегии пользователя-прокси

Привилегия PROXY позволяет одному пользователю выступать в роли прокси для другого. Пользователь-прокси имитирует или принимает личность пользователя-прокси; то есть, он принимает привилегии пользователя-прокси.

GRANT PROXY ON 'localuser'@'localhost' TO 'externaluser'@'somehost';

При предоставлении привилегии PROXY, она должна быть единственной привилегией, указанной в команде GRANT, и единственным разрешенным параметром WITH является WITH GRANT OPTION.

Для использования прокси требуется, чтобы пользователь-прокси аутентифицировался через плагин, возвращающий имя пользователя-прокси серверу при подключении пользователя-прокси, и что пользователь-прокси обладает привилегией PROXY для пользователя-прокси. Подробнее и примеры см. в разделе 8.2.19, «Пользователи-прокси».

MySQL сохраняет привилегии прокси в таблице системы mysql.proxies_priv.

Предоставление ролей

Синтаксис GRANT без предложения ON предоставляет роли, а не отдельные привилегии. Роль — это именованный набор привилегий; см. раздел 8.2.10, «Использование ролей». Например:

GRANT 'role1', 'role2' TO 'user1'@'localhost', 'user2'@'localhost';

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

Предоставление роли не приводит к автоматическому её активации. Сведения об активации и деактивации ролей см. в разделе об активации ролей.

Для предоставления ролей требуются следующие привилегии:

  • Если у вас есть привилегия ROLE_ADMIN (или устаревшая привилегия SUPER), вы можете предоставлять или отзывать любые роли пользователям или ролям.

  • Если вам была предоставлена роль с помощью команды GRANT, которая включает предложение WITH ADMIN OPTION, вы сможете предоставлять эту роль другим пользователям или ролям, или отзывать её от других пользователей или ролей, при условии, что роль активна в момент последующего предоставления или отзыва. Это включает возможность использования WITH ADMIN OPTION.

  • Для предоставления роли с привилегией SYSTEM_USER требуется привилегия SYSTEM_USER.

Возможно создание циклических ссылок с помощью GRANT. Например:

CREATE USER 'u1', 'u2';
CREATE ROLE 'r1', 'r2';

GRANT 'u1' TO 'u1';   -- simple loop: u1 => u1
GRANT 'r1' TO 'r1';   -- simple loop: r1 => r1

GRANT 'r2' TO 'u2';
GRANT 'u2' TO 'r2';   -- mixed user/role loop: u2 => r2 => u2

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

END_OF_DOCUMENT_MARKER
Заказ AS и ограничения привилегий

GRANT может указывать дополнительную информацию о контексте привилегий для выполнения запроса, используя клаузу AS user [WITH ROLE]. Этот синтаксис виден на уровне SQL, но его основная цель заключается в обеспечении единообразной репликации на всех узлах ограничений привилегий правообладателя, введенных частичными отзывами, путем отображения этих ограничений в бинарном журнале. Сведения о частичных отзывах см. в Разделе 8.2.12, «Ограничение привилегий с помощью частичных отзывов».

При указании клаузы AS user выполнение запроса учитывает любые ограничения привилегий, связанные с указанным пользователем, включая все роли, указанные в WITH ROLE, если они присутствуют. В результате фактические привилегии, предоставленные запросом, могут быть уменьшены по сравнению с указанными.

Эти условия применимы к клаузе AS user:

  • AS действует только тогда, когда у указанного user есть ограничения привилегий (что подразумевает, что системная переменная partial_revokes включена).

  • Если указаны WITH ROLE, все указанные роли должны быть предоставлены указанному user.

  • Указанный user должен быть учетной записью MySQL, указанной как 'user_name'@'host_name', CURRENT_USER или CURRENT_USER(). Текущий пользователь может быть указан вместе с WITH ROLE в том случае, если выполняющему пользователю требуется, чтобы GRANT выполнялся с набором примененных ролей, которые могут отличаться от активных ролей в текущем сеансе.

  • AS нельзя использовать для получения привилегий, которыми не обладает пользователь, выполняющий запрос GRANT. Выполняющему пользователю должны быть предоставлены, как минимум, привилегии, которые должны быть предоставлены, но клауза AS может только ограничивать предоставляемые привилегии, а не расширять их.

  • В отношении предоставляемых привилегий AS не может указать комбинацию пользователь/роль, которая обладает большими привилегиями (меньшими ограничениями), чем пользователь, выполняющий запрос GRANT запроса. Комбинация пользователь/роль AS может обладать большими привилегиями, чем выполняющий пользователь, но только в том случае, если запрос не предоставляет эти дополнительные привилегии.

  • AS поддерживается только для предоставления глобальных привилегий (ON *.*).

  • AS не поддерживается для PROXY разрешений.

Следующий пример иллюстрирует эффект клаузы AS. Создайте пользователя u1, который имеет некоторые глобальные привилегии, а также ограничения на эти привилегии:

CREATE USER u1;
GRANT SELECT, INSERT, UPDATE, DELETE ON *.* TO u1;
REVOKE INSERT, UPDATE ON schema1.* FROM u1;
REVOKE SELECT ON schema2.* FROM u1;

Также создайте роль r1, которая снимает некоторые ограничения на привилегии, и предоставьте роль пользователю u1:

CREATE ROLE r1;
GRANT INSERT ON schema1.* TO r1;
GRANT SELECT ON schema2.* TO r1;
GRANT r1 TO u1;

Теперь, используя учетную запись, которая не имеет собственных ограничений привилегий, предоставьте нескольким пользователям один и тот же набор глобальных привилегий, но каждому с разными ограничениями, наложенными клаузой AS, и проверьте, какие привилегии фактически предоставляются.

  • Запрос GRANT здесь не содержит клаузы AS, поэтому предоставляемые привилегии точно соответствуют указанным:

    mysql> CREATE USER u2;
    mysql> GRANT SELECT, INSERT, UPDATE ON *.* TO u2;
    mysql> SHOW GRANTS FOR u2;
    +-------------------------------------------------+
    | Grants for u2@%                                 |
    +-------------------------------------------------+
    | GRANT SELECT, INSERT, UPDATE ON *.* TO `u2`@`%` |
    +-------------------------------------------------+
    
  • Запрос GRANT здесь содержит клаузу AS, поэтому предоставляемые привилегии соответствуют указанным, но с ограничениями из u1:

    mysql> CREATE USER u3;
    mysql> GRANT SELECT, INSERT, UPDATE ON *.* TO u3 AS u1;
    mysql> SHOW GRANTS FOR u3;
    +----------------------------------------------------+
    | Grants for u3@%                                    |
    +----------------------------------------------------+
    | GRANT SELECT, INSERT, UPDATE ON *.* TO `u3`@`%`    |
    | REVOKE INSERT, UPDATE ON `schema1`.* FROM `u3`@`%` |
    | REVOKE SELECT ON `schema2`.* FROM `u3`@`%`         |
    +----------------------------------------------------+
    

    Как упоминалось ранее, клауза AS может только добавлять ограничения привилегий; она не может расширять привилегии. Таким образом, хотя у u1 есть привилегия DELETE, она не включена в предоставляемые привилегии, потому что запрос не указывает на предоставление привилегии DELETE.

  • Клауза AS для запроса GRANT здесь делает роль r1 активной для пользователя u1. Эта роль снимает некоторые ограничения на u1. Следовательно, предоставляемые привилегии имеют некоторые ограничения, но не так много, как для предыдущего запроса GRANT:

    mysql> CREATE USER u4;
    mysql> GRANT SELECT, INSERT, UPDATE ON *.* TO u4 AS u1 WITH ROLE r1;
    mysql> SHOW GRANTS FOR u4;
    +-------------------------------------------------+
    | Grants for u4@%                                 |
    +-------------------------------------------------+
    | GRANT SELECT, INSERT, UPDATE ON *.* TO `u4`@`%` |
    | REVOKE UPDATE ON `schema1`.* FROM `u4`@`%`      |
    +-------------------------------------------------+
    

Если запрос GRANT содержит клаузу AS user, ограничения привилегий пользователя, выполняющего запрос, игнорируются (а не применяются так, как они применялись бы без клаузы AS).

Другие характеристики учетной записи

Необязательная клауза WITH используется для того, чтобы пользователь мог предоставлять привилегии другим пользователям. Клауза WITH GRANT OPTION предоставляет пользователю возможность предоставлять другим пользователям любые привилегии, которые у него есть на указанном уровне привилегий.

Чтобы предоставить привилегию GRANT OPTION учетной записи, не изменяя при этом её привилегии, выполните следующее:

GRANT USAGE ON *.* TO 'someuser'@'somehost' WITH GRANT OPTION;

Будьте внимательны, кому вы предоставляете привилегию GRANT OPTION, потому что два пользователя с разными привилегиями могут иметь возможность объединить привилегии!

Вы не можете предоставить другому пользователю привилегию, которой не обладаете сами; привилегия GRANT OPTION позволяет назначать только те привилегии, которыми обладаете сами.

Имейте в виду, что при предоставлении пользователю привилегии GRANT OPTION на определённом уровне привилегий, любые привилегии, которыми пользователь обладает (или которые могут быть ему предоставлены в будущем) на этом уровне, также могут быть предоставлены этим пользователем другим пользователям. Предположим, что вы предоставляете пользователю привилегию INSERT на базе данных. Если затем вы предоставляете привилегию SELECT на базе данных и указываете WITH GRANT OPTION, этот пользователь может предоставить другим пользователям не только привилегию SELECT, но и INSERT. Если затем вы предоставляете пользователю привилегию UPDATE на базе данных, пользователь может предоставить INSERT, SELECT и UPDATE.

Для неадминистративного пользователя не следует предоставлять привилегию ALTER глобально или для схемы системы mysql. Если вы это сделаете, пользователь может попытаться обойти систему привилегий, переименовав таблицы!

Дополнительную информацию о рисках безопасности, связанных с определёнными привилегиями, см. в Разделе 8.2.2, «Привилегии, предоставляемые MySQL».

END_OF_DOCUMENT_MARKER
Версии GRANT MySQL и стандартного SQL

Основные различия между версиями GRANT MySQL и стандартного SQL заключаются в следующем:

  • MySQL связывает права с комбинацией имени хоста и имени пользователя, а не только с именем пользователя.

  • Стандартный SQL не имеет глобальных или уровневых прав на базе данных, а также не поддерживает все типы прав, которые поддерживает MySQL.

  • MySQL не поддерживает стандартное SQL-право UNDER.

  • Права стандартного SQL структурированы иерархически. Если вы удалите пользователя, все предоставленные ему права будут отозваны. Это также верно в MySQL, если вы используете DROP USER. См. Раздел 15.7.1.5, «Команда DROP USER».

  • В стандартном SQL при удалении таблицы все права на эту таблицу отзываются. При отзыве права в стандартном SQL отзываются и все права, предоставленные на основе этого права. В MySQL права могут быть удалены командами DROP USER или REVOKE.

  • В MySQL можно иметь право INSERT только для некоторых столбцов таблицы. В этом случае вы всё ещё можете выполнять команды INSERT на таблице, при условии, что вы вставляете значения только для тех столбцов, для которых у вас есть право INSERT. Пропущенные столбцы устанавливаются в свои неявные значения по умолчанию, если режим строгого SQL не включен. В режиме строгого SQL команда отклоняется, если у какого-либо из пропущенных столбцов нет значения по умолчанию. (Стандартный SQL требует наличия права INSERT на все столбцы). Для получения информации о режиме строгого SQL и неявных значениях по умолчанию см. Раздел 7.1.11, «Серверные режимы SQL» и Раздел 13.6, «Значения по умолчанию для типов данных».

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

Spec-Zone.ru

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