15.7.1.6 Оператор GRANT
GRANT
priv_type [(column_list)]
[, priv_type [(column_list)]] ...
ON [object_type] priv_level
TO user_or_role [, user_or_role] ...
[WITH GRANT OPTION]
[AS user
[WITH ROLE
DEFAULT
| NONE
| ALL
| ALL EXCEPT role [, role ] ...
| role [, role ] ...
]
]
}
GRANT PROXY ON user_or_role
TO user_or_role [, user_or_role] ...
[WITH GRANT OPTION]
GRANT role [, role] ...
TO user_or_role [, user_or_role] ...
[WITH ADMIN OPTION]
object_type: {
TABLE
| EVENT
| FUNCTION
| LIBRARY
| PROCEDURE
}
priv_level: {
*
| *.*
| db_name.*
| db_name.tbl_name
| tbl_name
| db_name.routine_name
}
user_or_role: {
user (see Section 8.2.4, “Specifying Account Names”)
| role (see Section 8.2.5, “Specifying Role Names”)
}
Оператор GRANT назначает привилегии и роли пользователям и ролям MySQL. В операторе GRANT есть несколько аспектов, описанных в следующих разделах:
Общие сведения об операторе GRANT
Оператор GRANT позволяет системным администраторам предоставлять привилегии и роли, которые могут быть назначены учетным записям и ролям. Применяются следующие ограничения синтаксиса:
Оператор
GRANTне может сочетать предоставление привилегий и ролей в одном операторе. ОператорGRANTдолжен предоставлять либо привилегии, либо роли.-
Оператор
ONопределяет, предоставляются ли привилегии или роли:С помощью
ON, оператор предоставляет привилегии.Без
ON, оператор предоставляет роли.Разрешается назначать как привилегии, так и роли учетной записи, но необходимо использовать отдельные операторы
GRANTкаждый с синтаксисом, соответствующим предоставляемому объекту.
Дополнительную информацию о ролях см. в Разделе 8.2.10, «Использование ролей».
Для предоставления привилегии с помощью GRANT, необходимо иметь привилегию GRANT OPTION, а также привилегии, которые вы предоставляете. (В качестве альтернативы, если у вас есть привилегия UPDATE для таблиц предоставления в схеме системы mysql, вы можете предоставить любой учетной записи любые привилегии.) Если переменная системы read_only включена, оператор GRANT дополнительно требует привилегию CONNECTION_ADMIN (или устаревшую привилегию SUPER).
Оператор GRANT либо выполняется для всех указанных пользователей и ролей, либо откатывается и не имеет эффекта, если возникает какая-либо ошибка. Оператор записывается в двоичный журнал только в случае успешного выполнения для всех указанных пользователей и ролей.
Оператор REVOKE связан с оператором GRANT и позволяет администраторам удалять привилегии учетных записей. См. Раздел 15.7.1.8, «Оператор REVOKE».
Каждое имя учетной записи использует формат, описанный в Разделе 8.2.4, «Указание имен учетных записей». Каждое имя роли использует формат, описанный в Разделе 8.2.5, «Указание имен ролей». Например:
GRANT ALL ON db1.* TO 'jeffrey'@'localhost';
GRANT 'role1', 'role2' TO 'user1'@'localhost', 'user2'@'localhost';
GRANT SELECT ON world.* TO 'role3';
Часть имени учетной записи или роли, если она опущена, по умолчанию равна '%'.
Обычно администратор базы данных сначала использует CREATE USER для создания учетной записи и определения ее характеристик, не связанных с привилегиями, таких как пароль, использование защищенных соединений и ограничения доступа к ресурсам сервера, затем использует GRANT для определения ее привилегий. ALTER USER может использоваться для изменения характеристик учетных записей, не связанных с привилегиями. Например:
CREATE USER 'jeffrey'@'localhost' IDENTIFIED BY 'password';
GRANT ALL ON db1.* TO 'jeffrey'@'localhost';
GRANT SELECT ON db2.invoice TO 'jeffrey'@'localhost';
ALTER USER 'jeffrey'@'localhost' WITH MAX_QUERIES_PER_HOUR 90;
Из программы mysql, оператор GRANT отвечает Query OK, 0 rows affected при успешном выполнении. Для определения привилегий, полученных в результате операции, используйте SHOW GRANTS. См. Раздел 15.7.7.23, «Оператор SHOW GRANTS».
В некоторых случаях, оператор GRANT может быть записан в журналы сервера или на стороне клиента в файле истории, например, в ~/.mysql_history, что означает, что текстовые пароли могут быть прочитаны любым лицом с правами доступа к этой информации. Дополнительную информацию о ситуациях, когда это происходит для журналов сервера, и как это контролировать, см. в Разделе 8.1.2.3, «Пароли и протоколирование». Аналогичную информацию о протоколировании на стороне клиента см. в Разделе 6.5.1.3, «Протоколирование клиента mysql».
Оператор GRANT поддерживает имена хостов длиной до 255 символов. Имена пользователей могут быть длиной до 32 символов. Имена баз данных, таблиц, столбцов и процедур могут быть длиной до 64 символов.
Не пытайтесь изменить допустимую длину имен пользователей, изменяя таблицу системы mysql.user. Это приводит к непредсказуемому поведению, которое может даже сделать невозможным вход пользователей в сервер MySQL. Никогда не изменяйте структуру таблиц в схеме системы mysql никаким образом, кроме описанного в Главе 3, «Модернизация MySQL».
Рекомендации по цитированию объектов
Некоторые объекты в операторах GRANT требуют цитирования, хотя во многих случаях это необязательно: имена учетных записей, ролей, баз данных, таблиц, столбцов и процедур. Например, если значение user_name или host_name в имени учетной записи допустимо как нецитируемый идентификатор, вы можете его не цитировать. Однако цитирование необходимо для задания user_name строки, содержащей специальные символы (например, -), или host_name строки, содержащей специальные символы или символы подстановки, такие как % (например, 'test-user'@'%.com'). Имя пользователя и имя хоста следует цитировать отдельно.
Для задания цитируемых значений:
Цитируйте имена баз данных, таблиц, столбцов и процедур как идентификаторы.
Цитируйте имена пользователей и имена хостов как идентификаторы или как строки.
Цитируйте пароли как строки.
Рекомендации по цитированию строк и идентификаторов см. в разделе 11.1.1 «Строковые литералы» и разделе 11.2 «Имена объектов схемы».
Использование символов подстановки % и _, как описано в следующих абзацах, устарело и может быть удалено в будущих версиях MySQL.
Символы подстановки _ и % разрешены при указании имен баз данных в операторах GRANT, предоставляющих привилегии на уровне базы данных (GRANT ... ON
). Это означает, что для использования символа db_name.*_ в имени базы данных необходимо указать его с помощью символа экранирования \ как \_ в операторе GRANT, чтобы предотвратить доступ пользователя к дополнительным базам данных, соответствующим шаблону подстановки (например, GRANT ... ON `foo\_bar`.* TO ...).
Использование нескольких операторов GRANT, содержащих символы подстановки, может не иметь ожидаемого эффекта на операторы DML; при разрешении предоставления привилегий, включающих символы подстановки, MySQL учитывает только первое соответствующее предоставление привилегий. Другими словами, если у пользователя есть два предоставления привилегий на уровне базы данных, использующие символы подстановки, соответствующие той же базе данных, то применяется предоставление, созданное первым. Рассмотрим базу данных db и таблицу t, созданные с помощью операторов, показанных здесь:
mysql> CREATE DATABASE db;
Query OK, 1 row affected (0.01 sec)
mysql> CREATE TABLE db.t (c INT);
Query OK, 0 rows affected (0.01 sec)
mysql> INSERT INTO db.t VALUES ROW(1);
Query OK, 1 row affected (0.00 sec)
Далее (предполагая, что текущая учетная запись — это учетная запись MySQL root или другая учетная запись с необходимыми привилегиями), мы создаем пользователя u и затем выполняем два оператора GRANT, содержащих символы подстановки, следующим образом:
mysql> CREATE USER u;
Query OK, 0 rows affected (0.01 sec)
mysql> GRANT SELECT ON `d_`.* TO u;
Query OK, 0 rows affected (0.01 sec)
mysql> GRANT INSERT ON `d%`.* TO u;
Query OK, 0 rows affected (0.00 sec)
mysql> EXIT
Bye
Если мы завершим сеанс и затем снова войдем с помощью клиента mysql, на этот раз как u, мы увидим, что у этой учетной записи есть только привилегии, предоставленные первым соответствующим предоставлением, но не вторым:
$> mysql -uu -hlocalhost
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 10
Server version: 9.2.0-tr Source distribution
Copyright (c) 2000, 2023, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input
statement.
mysql> TABLE db.t;
+------+
| c |
+------+
| 1 |
+------+
1 row in set (0.00 sec)
mysql> INSERT INTO db.t VALUES ROW(2);
ERROR 1142 (42000): INSERT command denied to user 'u'@'localhost' for table 't'
При назначении привилегий MySQL интерпретирует вхождения неэкранированных _ и % символов подстановки SQL в именах баз данных как буквальные символы в следующих ситуациях:
Когда имя базы данных не используется для предоставления привилегий на уровне базы данных, а в качестве квалификатора для предоставления привилегий другому объекту, такому как таблица или процедура (например,
GRANT ... ON).db_name.tbl_nameВключение
partial_revokesзаставляет MySQL интерпретировать неэкранированные_и%символы подстановки в именах баз данных как буквальные символы, точно так же, как если бы они были экранированы как\_и\%. Поскольку это изменяет способ интерпретации MySQL привилегий, рекомендуется избегать неэкранированных символов подстановки в заданиях привилегий для установок, гдеpartial_revokesможет быть включено. Дополнительную информацию см. в разделе 8.2.12 «Ограничение привилегий с помощью частичных аннулирований».
Имена учетных записей
Значение user в операторе GRANT указывает на учетную запись MySQL, к которой применяется оператор. Для предоставления прав пользователям с произвольных хостов MySQL поддерживает указание значения user в форме '.user_name'@'host_name'
Вы можете указывать символы подстановки в имени хоста. Например, ' относится к user_name'@'%.example.com'user_name для любого хоста в домене example.com, а ' относится к user_name'@'198.51.100.%'user_name для любого хоста в подсети класса C 198.51.100.
Простая форма ' является синонимом для user_name''.user_name'@'%'
MySQL автоматически назначает все привилегии, предоставленные ', учетной записи username'@'%'' также. Это поведение устарело и может быть удалено в будущих версиях 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 | Включение управления Group Replication. Уровень: глобальный. |
INNODB_REDO_LOG_ARCHIVE | Включение администрирования архивирования журнала редо. Уровень: глобальный. |
INNODB_REDO_LOG_ENABLE | Включение или отключение ведения журнала редо. Уровень: глобальный. |
NDB_STORED_USER | Включение совместного использования пользователя или роли между узлами SQL (NDB Cluster). Уровень: глобальный. |
PASSWORDLESS_USER_ADMIN | Включение администрирования учетных записей пользователей без пароля. Уровень: глобальный. |
PERSIST_RO_VARIABLES_ADMIN | Включение сохранения системных переменных только для чтения. Уровень: глобальный. |
REPLICATION_APPLIER | Выступать в роли PRIVILEGE_CHECKS_USER для канала репликации. Уровень: глобальный. |
REPLICATION_SLAVE_ADMIN | Включение обычного управления репликацией. Уровень: глобальный. |
RESOURCE_GROUP_ADMIN | Включение администрирования группы ресурсов. Уровень: глобальный. |
RESOURCE_GROUP_USER | Включение администрирования группы ресурсов. Уровень: глобальный. |
ROLE_ADMIN | Включение возможности предоставления или отзыва ролей, использование WITH ADMIN
OPTION. Уровень: глобальный. |
SESSION_VARIABLES_ADMIN | Включение установки ограниченных системных переменных сеанса. Уровень: глобальный. |
SHOW_ROUTINE | Включение доступа к определениям хранимых процедур. Уровень: глобальный. |
SKIP_QUERY_REWRITE | Не переписывать запросы, выполняемые этим пользователем. Уровень: глобальный. |
SYSTEM_USER | Назначение учетной записи в качестве системной учетной записи. Уровень: глобальный. |
SYSTEM_VARIABLES_ADMIN | Включение изменения или сохранения глобальных системных переменных. Уровень: глобальный. |
TABLE_ENCRYPTION_ADMIN | Включение переопределения параметров шифрования по умолчанию. Уровень: глобальный. |
TELEMETRY_LOG_ADMIN | Включение конфигурации журнала телеметрии для HeatWave на AWS. Уровень: глобальный. |
TP_CONNECTION_ADMIN | Включение администрирования подключений пула потоков. Уровень: глобальный. |
VERSION_TOKEN_ADMIN | Включение использования функций маркеров версии. Уровень: глобальный. |
XA_RECOVER_ADMIN | Включение выполнения XA
RECOVER. Уровень: глобальный. |
Триггер связан с таблицей. Чтобы создать или удалить триггер, необходимо иметь привилегию TRIGGER для таблицы, а не для триггера.
В операторах GRANT привилегия ALL
[PRIVILEGES] или PROXY должна быть указана самостоятельно и не может быть указана вместе с другими привилегиями. ALL
[PRIVILEGES] означает все привилегии, доступные для уровня, на котором предоставляются привилегии, за исключением привилегий GRANT OPTION и PROXY.
Информация об учетных записях MySQL хранится в таблицах схемы mysql. Для получения дополнительной информации см. Раздел 8.2, «Управление доступом и учетными записями», в котором подробно описывается схема mysql и система управления доступом.
Если таблицы грантов содержат строки привилегий, которые содержат имена баз данных или таблиц с разным регистром, а системная переменная lower_case_table_names установлена в ненулевое значение, REVOKE нельзя использовать для отзыва этих привилегий. В таких случаях необходимо напрямую управлять таблицами грантов. (GRANT не создает таких строк, когда lower_case_table_names установлено, но такие строки могли быть созданы до установки этой переменной. Настройка lower_case_table_names может быть настроена только при запуске сервера.)
Привилегии могут предоставляться на нескольких уровнях в зависимости от синтаксиса, используемого для пункта ON. Для REVOKE тот же синтаксис ON определяет, какие привилегии необходимо удалить.
Для глобального, баз данных, таблиц и уровней процедур GRANT ALL назначаются только те привилегии, которые существуют на предоставляемом уровне. Например, GRANT ALL ON
- это оператор уровня базы данных, поэтому он не предоставляет какие-либо привилегии, доступные только на глобальном уровне, такие как db_name.*FILE. Предоставление привилегии ALL не назначает привилегии GRANT OPTION или PROXY.
Пункт object_type, если он присутствует, следует указывать как TABLE, EVENT, FUNCTION, LIBRARY или PROCEDURE, когда следующий объект является таблицей, событием, хранимой функцией, JavaScript-библиотекой или хранимой процедурой.
Привилегии пользователя для базы данных, таблицы, столбца или процедуры формируются аддитивно как логическое OR привилегий учетной записи на каждом уровне привилегий, включая глобальный уровень. Невозможно запретить привилегию, предоставленную на более высоком уровне, отсутствием этой привилегии на более низком уровне. Например, данное утверждение предоставляет SELECT и INSERT привилегии глобально:
GRANT SELECT, INSERT ON *.* TO u1;
Глобально предоставленные привилегии применяются ко всем базам данных, таблицам и столбцам, даже если они не предоставлены на каком-либо из этих более низких уровней.
Возможно явно запретить привилегию, предоставленную на глобальном уровне, отозвав её для конкретных баз данных, если переменная системы partial_revokes включена:
GRANT SELECT, INSERT, UPDATE ON *.* TO u1;
REVOKE INSERT, UPDATE ON db1.* FROM u1;
Результатом предыдущих операторов является то, что SELECT применяется глобально ко всем таблицам, тогда как INSERT и UPDATE применяются глобально за исключением таблиц в db1. Доступ учетной записи к db1 — только для чтения.
Подробности процедуры проверки привилегий приведены в разделе 8.2.7, «Контроль доступа, этап 2: Проверка запроса».
Если вы используете привилегии для таблиц, столбцов или процедур хотя бы для одного пользователя, сервер проверяет привилегии для всех пользователей, и это немного замедляет MySQL. Аналогично, если вы ограничите количество запросов, обновлений или подключений для любых пользователей, сервер должен отслеживать эти значения.
MySQL позволяет предоставлять привилегии для баз данных или таблиц, которые еще не существуют. Для таблиц предоставляемые привилегии должны включать привилегию CREATE. Это поведение задано по умолчанию и предназначено для того, чтобы администратор базы данных мог подготовить учетные записи пользователей и привилегии для баз данных или таблиц, которые будут созданы позже.
MySQL не автоматически отзывает привилегии при удалении базы данных или таблицы. Однако при удалении процедуры все привилегии, предоставленные для этой процедуры, отзываются.
Глобальные привилегии
Глобальные привилегии являются административными или применяются ко всем базам данных на данном сервере. Для назначения глобальных привилегий используйте синтаксис ON *.*:
GRANT ALL ON *.* TO 'someuser'@'somehost';
GRANT SELECT, INSERT ON *.* TO 'someuser'@'somehost';
CREATE TABLESPACE, CREATE USER, FILE, PROCESS, RELOAD, REPLICATION CLIENT, REPLICATION SLAVE, SHOW DATABASES, SHUTDOWN и SUPER статические привилегии являются административными и могут быть предоставлены только глобально.
Динамические привилегии также являются глобальными и могут быть предоставлены только глобально.
Другие привилегии могут быть предоставлены глобально или на более конкретных уровнях.
Эффект привилегии GRANT OPTION, предоставленной на глобальном уровне, отличается для статических и динамических привилегий:
GRANT OPTION, предоставленная для любой статической глобальной привилегии, применяется ко всем статическим глобальным привилегиям.GRANT OPTION, предоставленная для любой динамической привилегии, применяется только к этой динамической привилегии.
GRANT ALL на глобальном уровне предоставляет все статические глобальные привилегии и все в настоящее время зарегистрированные динамические привилегии. Динамическая привилегия, зарегистрированная после выполнения оператора GRANT, не предоставляется ретроактивно ни одной учетной записи.
MySQL хранит глобальные привилегии в таблице системы mysql.user.
Привилегии базы данных
Привилегии базы данных применяются ко всем объектам в данной базе данных. Для назначения привилегий на уровне базы данных используйте синтаксис ON
: db_name.*
GRANT ALL ON mydb.* TO 'someuser'@'somehost';
GRANT SELECT, INSERT ON mydb.* TO 'someuser'@'somehost';
Если вы используете синтаксис ON * (вместо ON *.*), привилегии назначаются на уровне базы данных для базы данных по умолчанию. Возникает ошибка, если база данных по умолчанию отсутствует.
CREATE, DROP, EVENT, GRANT OPTION, LOCK TABLES и REFERENCES привилегии могут быть указаны на уровне базы данных. Привилегии для таблиц или процедур также могут быть указаны на уровне базы данных, в этом случае они применяются ко всем таблицам или процедурам в базе данных.
MySQL хранит привилегии базы данных в таблице системы mysql.db.
Привилегии таблиц
Привилегии таблиц применяются ко всем столбцам в данной таблице. Для назначения привилегий на уровне таблицы используйте синтаксис ON
: db_name.tbl_name
GRANT ALL ON mydb.mytbl TO 'someuser'@'somehost';
GRANT SELECT, INSERT ON mydb.mytbl TO 'someuser'@'somehost';
Если вы укажете tbl_name вместо db_name.tbl_name, оператор применяется к tbl_name в базе данных по умолчанию. Возникает ошибка, если база данных по умолчанию отсутствует.
Допустимые значения priv_type на уровне таблицы — ALTER, CREATE VIEW, CREATE, DELETE, DROP, GRANT OPTION, INDEX, INSERT, REFERENCES, SELECT, SHOW VIEW, TRIGGER и UPDATE.
Привилегии на уровне таблицы применяются к базовым таблицам и представлениям. Они не применяются к таблицам, созданным с помощью CREATE
TEMPORARY TABLE, даже если имена таблиц совпадают. Подробности о привилегиях для таблиц TEMPORARY см. в разделе 15.1.21.2, «Оператор CREATE TEMPORARY TABLE».
MySQL хранит привилегии таблиц в таблице системы mysql.tables_priv.
Привилегии столбцов
Привилегии столбцов применяются к отдельным столбцам в данной таблице. Каждая привилегия, предоставляемая на уровне столбца, должна быть за ней следовать столбец или столбцы, заключённые в скобки.
GRANT SELECT (col1), INSERT (col1, col2) ON mydb.mytbl TO 'someuser'@'somehost';
Допустимые значения priv_type для столбца (т. е. при использовании клаузы column_list) — INSERT, REFERENCES, SELECT и UPDATE.
MySQL хранит привилегии столбцов в таблице системы mysql.columns_priv.
Привилегии хранимых процедур
Привилегии ALTER ROUTINE, CREATE ROUTINE, EXECUTE и GRANT OPTION применяются к хранимым процедурам (процедурам и функциям). Их можно предоставлять на глобальном и уровне базы данных. За исключением CREATE ROUTINE, эти привилегии могут быть предоставлены на уровне процедуры для отдельных процедур.
GRANT CREATE ROUTINE ON mydb.* TO 'someuser'@'somehost';
GRANT EXECUTE ON PROCEDURE mydb.myproc TO 'someuser'@'somehost';
Разрешенные значения priv_type на уровне процедуры — ALTER
ROUTINE, EXECUTE и GRANT OPTION. CREATE ROUTINE не является привилегией на уровне процедуры, поскольку для создания процедуры в первую очередь необходимо иметь привилегию на глобальном или уровне базы данных.
MySQL сохраняет привилегии на уровне процедур в таблице системы mysql.procs_priv.
Привилегии пользователя-прокси
Привилегия PROXY позволяет одному пользователю выступать в роли прокси для другого. Пользователь-прокси имитирует или принимает личность пользователя-прокси; то есть, он принимает привилегии пользователя-прокси.
GRANT PROXY ON 'localuser'@'localhost' TO 'externaluser'@'somehost';
При предоставлении привилегии PROXY, она должна быть единственной привилегией, указанной в команде GRANT, и единственным разрешенным параметром WITH является WITH
GRANT OPTION.
Для использования прокси требуется, чтобы пользователь-прокси аутентифицировался через плагин, возвращающий имя пользователя-прокси серверу при подключении пользователя-прокси, и что пользователь-прокси обладает привилегией PROXY для пользователя-прокси. Подробнее и примеры см. в разделе 8.2.19, «Пользователи-прокси».
MySQL сохраняет привилегии прокси в таблице системы mysql.proxies_priv.
Предоставление ролей
Синтаксис GRANT без предложения ON предоставляет роли, а не отдельные привилегии. Роль — это именованный набор привилегий; см. раздел 8.2.10, «Использование ролей». Например:
GRANT 'role1', 'role2' TO 'user1'@'localhost', 'user2'@'localhost';
Каждая предоставляемая роль должна существовать, а также каждая учетная запись пользователя или роль, которой она должна быть предоставлена. Роли не могут быть предоставлены анонимным пользователям.
Предоставление роли не приводит к автоматическому её активации. Сведения об активации и деактивации ролей см. в разделе об активации ролей.
Для предоставления ролей требуются следующие привилегии:
Если у вас есть привилегия
ROLE_ADMIN(или устаревшая привилегияSUPER), вы можете предоставлять или отзывать любые роли пользователям или ролям.Если вам была предоставлена роль с помощью команды
GRANT, которая включает предложениеWITH ADMIN OPTION, вы сможете предоставлять эту роль другим пользователям или ролям, или отзывать её от других пользователей или ролей, при условии, что роль активна в момент последующего предоставления или отзыва. Это включает возможность использованияWITH ADMIN OPTION.Для предоставления роли с привилегией
SYSTEM_USERтребуется привилегияSYSTEM_USER.
Возможно создание циклических ссылок с помощью GRANT. Например:
CREATE USER 'u1', 'u2';
CREATE ROLE 'r1', 'r2';
GRANT 'u1' TO 'u1'; -- simple loop: u1 => u1
GRANT 'r1' TO 'r1'; -- simple loop: r1 => r1
GRANT 'r2' TO 'u2';
GRANT 'u2' TO 'r2'; -- mixed user/role loop: u2 => r2 => u2
Циклические ссылки на предоставление разрешены, но не добавляют новые привилегии или роли получателю, поскольку пользователь или роль уже обладают соответствующими привилегиями и ролями.
Заказ 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».
Версии GRANT MySQL и стандартного SQL
Основные различия между версиями GRANT MySQL и стандартного SQL заключаются в следующем:
MySQL связывает права с комбинацией имени хоста и имени пользователя, а не только с именем пользователя.
Стандартный SQL не имеет глобальных или уровневых прав на базе данных, а также не поддерживает все типы прав, которые поддерживает MySQL.
MySQL не поддерживает стандартное SQL-право
UNDER.Права стандартного SQL структурированы иерархически. Если вы удалите пользователя, все предоставленные ему права будут отозваны. Это также верно в MySQL, если вы используете
DROP USER. См. Раздел 15.7.1.5, «Команда DROP USER».В стандартном SQL при удалении таблицы все права на эту таблицу отзываются. При отзыве права в стандартном SQL отзываются и все права, предоставленные на основе этого права. В MySQL права могут быть удалены командами
DROP USERилиREVOKE.В MySQL можно иметь право
INSERTтолько для некоторых столбцов таблицы. В этом случае вы всё ещё можете выполнять командыINSERTна таблице, при условии, что вы вставляете значения только для тех столбцов, для которых у вас есть правоINSERT. Пропущенные столбцы устанавливаются в свои неявные значения по умолчанию, если режим строгого SQL не включен. В режиме строгого SQL команда отклоняется, если у какого-либо из пропущенных столбцов нет значения по умолчанию. (Стандартный SQL требует наличия праваINSERTна все столбцы). Для получения информации о режиме строгого SQL и неявных значениях по умолчанию см. Раздел 7.1.11, «Серверные режимы SQL» и Раздел 13.6, «Значения по умолчанию для типов данных».
© 2025 Oracle
Licensed under the GPLv2 License.