13.7.1.4 Оператор GRANT
GRANT
priv_type [(column_list)]
[, priv_type [(column_list)]] ...
ON [object_type] priv_level
TO user [auth_option] [, user [auth_option]] ...
[REQUIRE {NONE | tls_option [[AND] tls_option] ...}]
[WITH {GRANT OPTION | resource_option} ...]
GRANT PROXY ON user
TO user [, user] ...
[WITH GRANT OPTION]
object_type: {
TABLE
| FUNCTION
| PROCEDURE
}
priv_level: {
*
| *.*
| db_name.*
| db_name.tbl_name
| tbl_name
| db_name.routine_name
}
user:
(see Section 6.2.4, “Specifying Account Names”)
auth_option: {
IDENTIFIED BY 'auth_string'
| IDENTIFIED WITH auth_plugin
| IDENTIFIED WITH auth_plugin BY 'auth_string'
| IDENTIFIED WITH auth_plugin AS 'auth_string'
| IDENTIFIED BY PASSWORD 'auth_string'
}
tls_option: {
SSL
| X509
| CIPHER 'cipher'
| ISSUER 'issuer'
| SUBJECT 'subject'
}
resource_option: {
| MAX_QUERIES_PER_HOUR count
| MAX_UPDATES_PER_HOUR count
| MAX_CONNECTIONS_PER_HOUR count
| MAX_USER_CONNECTIONS count
}
Оператор GRANT предоставляет привилегии пользователям MySQL. Оператор GRANT имеет несколько аспектов, описанных в следующих разделах:
Общие сведения об операторе GRANT
Оператор GRANT предоставляет привилегии пользователям MySQL.
Для предоставления привилегии с помощью GRANT, у вас должна быть привилегия GRANT OPTION, а также те привилегии, которые вы предоставляете. (В качестве альтернативы, если у вас есть привилегия UPDATE для таблиц в системе mysql, вы можете предоставить любые привилегии любой учетной записи.) Когда системная переменная read_only включена, GRANT дополнительно требует привилегию SUPER.
Оператор REVOKE связан с GRANT и позволяет администраторам отзывать привилегии учетных записей. См. Раздел 13.7.1.6, «Оператор REVOKE».
Каждое имя учетной записи использует формат, описанный в Разделе 6.2.4, «Указание имён учетных записей». Например:
GRANT ALL ON db1.* TO 'jeffrey'@'localhost';
Часть имени хоста учетной записи, если она опущена, по умолчанию устанавливается в '%'.
Обычно администратор базы данных сначала использует 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;
Приведённые примеры не включают в себя IDENTIFIED предложение. Предполагается, что вы устанавливаете пароли с помощью CREATE USER во время создания учетной записи, чтобы избежать создания небезопасных учетных записей.
Если учетная запись, указанная в операторе GRANT, ещё не существует, GRANT может создать её при соблюдении условий, описанных далее в обсуждении SQL-режима NO_AUTO_CREATE_USER. Также можно использовать GRANT для указания характеристик учетной записи, не связанных с привилегиями, таких как использование защищённых соединений и ограничений доступа к ресурсам сервера.
Однако использование GRANT для создания учетных записей или определения характеристик, не связанных с привилегиями, устарело в MySQL 5.7. Вместо этого выполните эти действия с помощью CREATE USER или ALTER USER.
Из программы mysql, GRANT отвечает с Query OK, 0 rows affected при успешном выполнении. Для определения привилегий, полученных в результате операции, используйте SHOW GRANTS. См. Раздел 13.7.5.21, «Оператор SHOW GRANTS».
В некоторых случаях GRANT может быть записан в журналы сервера или на стороне клиента в файле истории, таком как ~/.mysql_history, что означает, что текстовые пароли могут быть прочитаны любым пользователем с правами доступа к этой информации. Для получения информации о условиях, при которых это происходит для журналов сервера, и о том, как его контролировать, см. Раздел 6.1.2.3, «Пароли и регистрация». Для аналогичной информации о регистрации на стороне клиента см. Раздел 4.5.1.3, «Регистрация клиента mysql».
GRANT поддерживает имена хостов длиной до 60 символов. Имена пользователей могут быть длиной до 32 символов. Имена баз данных, таблиц, столбцов и процедур могут иметь длину до 64 символов.
Не пытайтесь изменить допустимую длину имён пользователей, изменяя таблицу системы mysql.user. Это приведёт к непредсказуемому поведению, которое может даже сделать невозможным вход пользователей в сервер MySQL. Никогда не изменяйте структуру таблиц в системе mysql ни каким образом, кроме описанного в Разделе 2.10, «Обновление MySQL».
Рекомендации по цитированию объектов
Некоторые объекты в операторах GRANT подлежат цитированию, хотя в многих случаях это необязательно: имена учетной записи, базы данных, таблицы, столбца и процедуры. Например, если значение user_name или host_name в имени учетной записи допустимо как нецитируемый идентификатор, вам не нужно его цитировать. Однако кавычки необходимы для указания user_name строки, содержащей специальные символы (такие как -), или host_name строки, содержащей специальные символы или символы подстановки, такие как % (например, 'test-user'@'%.com'). Имя пользователя и имя хоста следует цитировать отдельно.
Для указания цитируемых значений:
Цитируйте имена базы данных, таблицы, столбца и процедуры в качестве идентификаторов.
Цитируйте имена пользователей и хостов в качестве идентификаторов или строк.
Цитируйте пароли как строки.
Рекомендации по цитированию строк и идентификаторов см. в разделе 9.1.1 «Строковые литералы» и разделе 9.2 «Имена объектов схемы».
Символы подстановки _ и % разрешены при указании имен баз данных в операторах 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: 5.7.48-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'
Когда имя базы данных не используется для предоставления прав на уровне базы данных, а используется в качестве квалификатора для предоставления прав на какой-либо другой объект, например, таблицу или процедуру (например, GRANT ... ON
), MySQL интерпретирует символы подстановки как буквальные символы.db_name.tbl_name
Поддерживаемые MySQL привилегии
В следующей таблице обобщены разрешенные типы привилегий, которые могут быть указаны для команд GRANT и REVOKE, а также уровни, на которых каждая привилегия может быть предоставлена. Дополнительную информацию о каждой привилегии см. в разделе 6.2.2 «Привилегии, предоставляемые MySQL».
Таблица 13.8 Разрешенные привилегии для GRANT и REVOKE
| Привилегия | Значение и уровни предоставления |
|---|---|
ALL [PRIVILEGES] | Предоставление всех привилегий на указанном уровне доступа за исключением GRANT OPTION и PROXY. |
ALTER | Разрешение использования ALTER TABLE. Уровни: глобальный, база данных, таблица. |
ALTER ROUTINE | Разрешение изменения или удаления хранимых процедур. Уровни: глобальный, база данных, процедура. |
CREATE | Разрешение создания баз данных и таблиц. Уровни: глобальный, база данных, таблица. |
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 | Разрешение удаления баз данных, таблиц и представлений. Уровни: глобальный, база данных, таблица. |
EVENT | Разрешение использования событий для планировщика событий. Уровни: глобальный, база данных. |
EXECUTE | Разрешение пользователю выполнять хранимые процедуры. Уровни: глобальный, база данных, процедура. |
FILE | Разрешение пользователю читать или записывать файлы на сервере. Уровень: глобальный. |
GRANT OPTION | Разрешение предоставления или удаления привилегий другим пользователям. Уровни: глобальный, база данных, таблица, процедура, прокси. |
INDEX | Разрешение создания или удаления индексов. Уровни: глобальный, база данных, таблица. |
INSERT | Разрешение использования INSERT. Уровни: глобальный, база данных, таблица, столбец. |
LOCK TABLES | Разрешение использования LOCK TABLES для таблиц, для которых у вас есть привилегия SELECT. Уровни: глобальный, база данных. |
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 MASTER TO, KILL, PURGE BINARY LOGS, SET
GLOBAL и команда mysqladmin debug. Уровень: глобальный. |
TRIGGER | Разрешение операций с триггерами. Уровни: глобальный, база данных, таблица. |
UPDATE | Разрешение использования UPDATE. Уровни: глобальный, база данных, таблица, столбец. |
USAGE | Синоним для «“нет привилегий”» |
Триггер связан с таблицей. Чтобы создать или удалить триггер, вам необходимо иметь привилегию TRIGGER для таблицы, а не для триггера.
В командах GRANT, привилегия ALL
[PRIVILEGES] или PROXY должна быть указана отдельно и не может быть указана вместе с другими привилегиями. ALL
[PRIVILEGES] означает все доступные привилегии для уровня, на котором предоставляются привилегии, за исключением привилегий GRANT OPTION и PROXY.
USAGE может быть указано для создания пользователя без привилегий или для указания пунктов REQUIRE или WITH для учетной записи без изменения ее существующих привилегий. (Однако использование GRANT для определения характеристик без привилегий устарело.)
Информация об учетных записях MySQL хранится в таблицах базы данных системы mysql. Дополнительные сведения см. в разделе 6.2 «Управление доступом и учетными записями», который подробно описывает базу данных системы mysql и систему управления доступом.
Если таблицы предоставления прав содержат строки привилегий, которые содержат имена баз данных или таблиц со смешанным регистром, и системная переменная lower_case_table_names установлена в ненулевое значение, REVOKE не может использоваться для отзыва этих привилегий. Необходимо напрямую обращаться к таблицам предоставления прав. (GRANT не создает таких строк, когда 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;
Глобально предоставленные привилегии применяются ко всем базам данных, таблицам и столбцам, даже если они не предоставлены на этих более низких уровнях.
Подробности процедуры проверки привилегий представлены в разделе 6.2.6, «Контроль доступа, этап 2: Проверка запросов».
Если вы используете привилегии таблиц, столбцов или процедур для хотя бы одного пользователя, сервер проверяет привилегии таблиц, столбцов и процедур для всех пользователей, и это немного замедляет MySQL. Аналогично, если вы ограничите количество запросов, обновлений или подключений для любых пользователей, сервер должен отслеживать эти значения.
MySQL позволяет предоставить привилегии на базах данных или таблицах, которые не существуют. Для таблиц предоставляемые привилегии должны включать привилегию CREATE. Это поведение является заданным по умолчанию и предназначено для того, чтобы администратор базы данных мог подготовить учетные записи пользователей и привилегии для баз данных или таблиц, которые будут созданы в более позднее время.
MySQL не автоматически отзывает какие-либо привилегии при удалении базы данных или таблицы. Однако, если вы удаляете процедуру, любые привилегии на уровне процедур, предоставленные для этой процедуры, отзываются.
Имена учетных записей и пароли
Значение 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 не поддерживает подстановочные знаки в именах пользователей. Для ссылки на анонимного пользователя укажите учетную запись с пустым именем пользователя с помощью оператора GRANT:
GRANT ALL ON test.* TO ''@'localhost' ...;
В этом случае любой пользователь, подключающийся с локального хоста с правильным паролем для анонимного пользователя, получает доступ с привилегиями, связанными с анонимной учетной записью.
Дополнительную информацию об именах пользователей и хостов в именах учетных записей см. в разделе 6.2.4, «Указание имен учетных записей».
Если вы разрешаете локальным анонимным пользователям подключаться к серверу MySQL, вам также следует предоставить привилегии всем локальным пользователям как '. В противном случае анонимная учетная запись для user_name'@'localhost'localhost в таблице системы mysql.user используется, когда названные пользователи пытаются войти в систему MySQL с локальной машины. Подробнее см. в разделе 6.2.5, «Контроль доступа, этап 1: Проверка подключения».
Чтобы определить, относится ли эта проблема к вам, выполните следующий запрос, который выводит список всех анонимных пользователей:
SELECT Host, User FROM mysql.user WHERE User='';
Чтобы избежать описанной выше проблемы, удалите локальную учетную запись анонимного пользователя с помощью следующего оператора:
DROP USER ''@'localhost';
Для синтаксиса GRANT, который разрешает указание значения auth_option после значения user, auth_option начинается с IDENTIFIED и указывает, как учетная запись проходит аутентификацию, задавая плагин аутентификации учетной записи, данные для аутентификации (например, пароль) или то и другое. Синтаксис оператора auth_option такой же, как и для оператора CREATE USER. Подробнее см. в разделе 13.7.1.2, «Оператор CREATE USER».
Использование оператора GRANT для определения характеристик аутентификации учетных записей устарело в MySQL 5.7. Вместо этого установите или измените характеристики аутентификации с помощью оператора CREATE USER или ALTER USER. Ожидается, что эта функция оператора GRANT будет удалена в будущих версиях MySQL.
Когда IDENTIFIED присутствует, и у вас есть глобальная привилегия предоставления прав (GRANT
OPTION), любой указанный пароль становится новым паролем для учетной записи, даже если учетная запись уже существует и у нее есть пароль. Без IDENTIFIED пароль учетной записи остается неизменным.
Глобальные привилегии
Глобальные привилегии — это административные привилегии или привилегии, применимые ко всем базам данных на данном сервере. Для назначения глобальных привилегий используйте синтаксис 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, предоставленная на глобальном уровне для любой глобальной привилегии, относится ко всем глобальным привилегиям.
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 см. в разделе 13.1.18.2 «CREATE TEMPORARY TABLE Statement».
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, клауза REQUIRE не может быть задана, и единственный разрешенный параметр WITH — WITH
GRANT OPTION.
Для использования прокси требуется, чтобы пользователь-прокси аутентифицировался через плагин, возвращающий имя пользователя-прокси на сервер при подключении пользователя-прокси, и чтобы пользователь-прокси обладал привилегией PROXY для пользователя-прокси. Подробности и примеры см. в разделе 6.2.14 «Пользователи-прокси».
MySQL хранит привилегии прокси в системной таблице mysql.proxies_priv.
Неявное создание учётной записи
Если учётная запись, указанная в операторе GRANT, не существует, действие зависит от режима SQL NO_AUTO_CREATE_USER:
Если
NO_AUTO_CREATE_USERне включён, операторGRANTсоздаёт учётную запись. Это очень небезопасно, если вы не зададите непустой пароль с помощьюIDENTIFIED BY.Если
NO_AUTO_CREATE_USERвключён, операторGRANTзавершается с ошибкой и не создаёт учётную запись, если вы не зададите непустой пароль с помощьюIDENTIFIED BYили не укажите плагин аутентификации с помощьюIDENTIFIED WITH.
Если учётная запись уже существует, IDENTIFIED
WITH запрещено, так как она предназначена только для создания новых учётных записей.
Другие характеристики учётной записи
MySQL может проверять атрибуты сертификатов X.509 помимо обычной аутентификации, основанной на имени пользователя и учетных данных. Дополнительную информацию об использовании SSL с MySQL см. в разделе 6.3, «Использование защищённых соединений».
Необязательная фраза REQUIRE определяет параметры SSL для учётной записи MySQL. Синтаксис аналогичен синтаксису для инструкции CREATE USER. Подробности см. в разделе 13.7.1.2, «Выполнение инструкции CREATE USER».
Использование инструкции GRANT для определения характеристик SSL учётной записи устарело в MySQL 5.7. Вместо этого используйте CREATE
USER или ALTER USER. Ожидается, что эта возможность инструкции GRANT будет удалена в будущих выпусках MySQL.
Необязательная фраза 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. В противном случае пользователь может попытаться обойти систему привилегий путём переименования таблиц!
Дополнительную информацию о рисках безопасности, связанных с определёнными привилегиями, см. в разделе 6.2.2, «Предоставляемые MySQL привилегии».
Возможно ограничить использование ресурсов сервера для учётной записи, как описано в разделе 6.2.16, «Установка лимитов ресурсов учётной записи». Для этого используйте фразу WITH, которая определяет одно или несколько значений resource_option. Неуказанные ограничения сохраняют свои текущие значения. Синтаксис аналогичен синтаксису для инструкции CREATE
USER. Подробности см. в разделе 13.7.1.2, «Выполнение инструкции CREATE USER».
Использование инструкции GRANT для определения лимитов ресурсов учётной записи устарело в MySQL 5.7. Вместо этого используйте CREATE USER или ALTER USER. Ожидается, что эта возможность инструкции GRANT будет удалена в будущих выпусках MySQL.
Версии GRANT в MySQL и стандартном SQL
Основные различия между версиями инструкции GRANT в MySQL и стандартном SQL:
MySQL связывает привилегии с комбинацией имени хоста и имени пользователя, а не только с именем пользователя.
Стандартный SQL не имеет глобальных или баз данных-уровневых привилегий и не поддерживает все типы привилегий, которые поддерживает MySQL.
MySQL не поддерживает привилегию стандартного SQL
UNDER.Привилегии стандартного SQL организованы иерархически. Если вы удаляете пользователя, все предоставленные ему привилегии отзываются. Это также верно в MySQL, если вы используете
DROP USER. См. раздел 13.7.1.3, «Выполнение инструкции DROP USER».В стандартном SQL, когда вы удаляете таблицу, все привилегии для таблицы отзываются. В стандартном SQL, когда вы отзываете привилегию, все привилегии, предоставленные на основе этой привилегии, также отзываются. В MySQL привилегии можно удалить с помощью инструкций
DROP USERилиREVOKE.В MySQL возможно иметь привилегию
INSERTтолько для некоторых столбцов в таблице. В этом случае вы всё ещё можете выполнять инструкцииINSERTдля таблицы, при условии, что вы вставляете значения только для тех столбцов, для которых у вас есть привилегияINSERT. Пропущенные столбцы устанавливаются в их неявные значения по умолчанию, если режим строгого SQL не включён. В строгом режиме инструкция отклоняется, если для каких-либо пропущенных столбцов нет значения по умолчанию. (Стандартный SQL требует наличия привилегииINSERTдля всех столбцов.) Для получения информации о режиме строгого SQL и неявных значениях по умолчанию см. раздел 5.1.10, «Режимы SQL сервера» и раздел 11.6, «Значения по умолчанию типов данных».
© 2025 Oracle
Licensed under the GPLv2 License.