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
Заявление 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'@'%'' также. Это поведение устарело и может быть удалено в будущих версиях MySQL.username'@'localhost'
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
| Привилегия | Значение и уровни предоставления |
|---|---|
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
| Привилегия | Значение и предоставляемые уровни |
|---|---|
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.
Привилегии прокси-пользователя
Привилегия 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
. Этот синтаксис виден на уровне SQL, хотя его основная цель — обеспечить единообразную репликацию на всех узлах ограничений привилегий доверенного лица, накладываемых частичными отзывами, заставляя эти ограничения появляться в двоичном журнале. Подробности о частичных отзывах см. в разделе 8.2.12 «Ограничение привилегий с помощью частичных отзывов». user [WITH ROLE]
Когда указан пункт AS , при выполнении оператора учитываются любые ограничения привилегий, связанные с указанным пользователем, включая все роли, указанные с помощью userWITH 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 , ограничения привилегий пользователя, выполняющего оператор, игнорируются (а не применяются так, как они были бы в отсутствие пункта userAS).
Другие характеристики учётной записи
Необязательная 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.