Spec-Zone.ru › MySQL 8.4

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
  | FUNCTION
  | 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.22, «Заявление 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: 8.4.4-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 Включить управление групповой репликацией. Уровень: глобальный.
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, FUNCTION или PROCEDURE, когда следующий объект является таблицей, хранимой функцией или хранимой процедурой.

Привилегии, которыми обладает пользователь для базы данных, таблицы, столбца или процедуры, формируются аддитивно как логическое 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, даже если имена таблиц совпадают. Подробности о разрешениях на временные таблицы см. в разделе 15.1.20.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.

Разрешения на хранимые процедуры

Разрешения 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.

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

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

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

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

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

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

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

Пункт 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 привилегии”.

MySQL и стандартные версии SQL для GRANT

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

  • В 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 требуется привилегия INSERT для всех столбцов.) Сведения о строгом режиме SQL и неявных значениях по умолчанию см. в Разделе 7.1.11, “Режим SQL сервера” и Разделе 13.6, “Значения по умолчанию типов данных”.

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

Spec-Zone.ru

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