15.7.7.22 Заявление SHOW GRANTS
SHOW GRANTS
[FOR user_or_role
[USING role [, role] ...]]
user_or_role: {
user (see Section 8.2.4, “Specifying Account Names”)
| role (see Section 8.2.5, “Specifying Role Names”.
}
Это заявление отображает привилегии и роли, назначенные пользователю или роли MySQL, в виде GRANT утверждений, которые необходимо выполнить для дублирования назначений привилегий и ролей.
Чтобы отобразить информацию, не связанную с привилегиями, для учетных записей MySQL, используйте SHOW CREATE USER заявление. См. Раздел 15.7.7.13, «Заявление SHOW CREATE USER».
SHOW GRANTS требует привилегии SELECT для схемы системы mysql, за исключением отображения привилегий и ролей для текущего пользователя.
Для указания учетной записи или роли для SHOW
GRANTS используйте тот же формат, что и для GRANT заявления (например, 'jeffrey'@'localhost'):
mysql> SHOW GRANTS FOR 'jeffrey'@'localhost';
+------------------------------------------------------------------+
| Grants for jeffrey@localhost |
+------------------------------------------------------------------+
| GRANT USAGE ON *.* TO `jeffrey`@`localhost` |
| GRANT SELECT, INSERT, UPDATE ON `db1`.* TO `jeffrey`@`localhost` |
+------------------------------------------------------------------+
Часть хоста, если она опущена, по умолчанию равна '%'. Дополнительную информацию об указании имен учетных записей и ролей см. в разделе 8.2.4, «Указание имен учетных записей» и разделе 8.2.5, «Указание имен ролей».
Чтобы отобразить привилегии, предоставленные текущему пользователю (учетной записи, которую вы используете для подключения к серверу), вы можете использовать любое из следующих заявлений:
SHOW GRANTS;
SHOW GRANTS FOR CURRENT_USER;
SHOW GRANTS FOR CURRENT_USER();
Если SHOW GRANTS FOR CURRENT_USER (или любой эквивалентный синтаксис) используется в контексте определенного, например, в хранимой процедуре, которая выполняется с привилегиями определенного, а не вызывающего, отображаемые привилегии являются привилегиями определенного, а не вызывающего.
В MySQL 8.4 по сравнению с предыдущими версиями SHOW GRANTS больше не отображает ALL PRIVILEGES в выводе глобальных привилегий, поскольку значение ALL PRIVILEGES на глобальном уровне зависит от того, какие динамические привилегии определены. Вместо этого SHOW GRANTS явно перечисляет каждую предоставленную глобальную привилегию:
mysql> SHOW GRANTS FOR 'root'@'localhost';
+---------------------------------------------------------------------+
| Grants for root@localhost |
+---------------------------------------------------------------------+
| GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, |
| SHUTDOWN, PROCESS, FILE, REFERENCES, INDEX, ALTER, SHOW DATABASES, |
| SUPER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, REPLICATION |
| SLAVE, REPLICATION CLIENT, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, |
| ALTER ROUTINE, CREATE USER, EVENT, TRIGGER, CREATE TABLESPACE, |
| CREATE ROLE, DROP ROLE ON *.* TO `root`@`localhost` WITH GRANT |
| OPTION |
| GRANT PROXY ON ''@'' TO `root`@`localhost` WITH GRANT OPTION |
+---------------------------------------------------------------------+
Приложения, обрабатывающие вывод SHOW
GRANTS, должны быть соответствующим образом скорректированы.
На глобальном уровне GRANT OPTION применяется ко всем предоставленным статическим глобальным привилегиям, если они предоставлены для любой из них, но применяется индивидуально к предоставленным динамическим привилегиям. SHOW GRANTS отображает глобальные привилегии таким образом:
Одна строка, перечисляющая все предоставленные статические привилегии, если они есть, включая
WITH GRANT OPTION, если это необходимо.Одна строка, перечисляющая все предоставленные динамические привилегии, для которых предоставлена
GRANT OPTION, если они есть, включаяWITH GRANT OPTION.Одна строка, перечисляющая все предоставленные динамические привилегии, для которых
GRANT OPTIONне предоставлена, если они есть, безWITH GRANT OPTION.
С необязательной USING частью, SHOW GRANTS позволяет вам изучить привилегии, связанные с ролями для пользователя. Каждая роль, указанная в USING части, должна быть предоставлена пользователю.
Предположим, что пользователю u1 назначены роли r1 и r2, как показано ниже:
CREATE ROLE 'r1', 'r2';
GRANT SELECT ON db1.* TO 'r1';
GRANT INSERT, UPDATE, DELETE ON db1.* TO 'r2';
CREATE USER 'u1'@'localhost' IDENTIFIED BY 'u1pass';
GRANT 'r1', 'r2' TO 'u1'@'localhost';
SHOW GRANTS без USING отображает предоставленные роли:
mysql> SHOW GRANTS FOR 'u1'@'localhost';
+---------------------------------------------+
| Grants for u1@localhost |
+---------------------------------------------+
| GRANT USAGE ON *.* TO `u1`@`localhost` |
| GRANT `r1`@`%`,`r2`@`%` TO `u1`@`localhost` |
+---------------------------------------------+
Добавление USING части заставляет заявление также отображать привилегии, связанные с каждой ролью, указанной в этой части:
mysql> SHOW GRANTS FOR 'u1'@'localhost' USING 'r1';
+---------------------------------------------+
| Grants for u1@localhost |
+---------------------------------------------+
| GRANT USAGE ON *.* TO `u1`@`localhost` |
| GRANT SELECT ON `db1`.* TO `u1`@`localhost` |
| GRANT `r1`@`%`,`r2`@`%` TO `u1`@`localhost` |
+---------------------------------------------+
mysql> SHOW GRANTS FOR 'u1'@'localhost' USING 'r2';
+-------------------------------------------------------------+
| Grants for u1@localhost |
+-------------------------------------------------------------+
| GRANT USAGE ON *.* TO `u1`@`localhost` |
| GRANT INSERT, UPDATE, DELETE ON `db1`.* TO `u1`@`localhost` |
| GRANT `r1`@`%`,`r2`@`%` TO `u1`@`localhost` |
+-------------------------------------------------------------+
mysql> SHOW GRANTS FOR 'u1'@'localhost' USING 'r1', 'r2';
+---------------------------------------------------------------------+
| Grants for u1@localhost |
+---------------------------------------------------------------------+
| GRANT USAGE ON *.* TO `u1`@`localhost` |
| GRANT SELECT, INSERT, UPDATE, DELETE ON `db1`.* TO `u1`@`localhost` |
| GRANT `r1`@`%`,`r2`@`%` TO `u1`@`localhost` |
+---------------------------------------------------------------------+
Привилегия, предоставленная учетной записи, всегда активна, но роль — нет. Активные роли для учетной записи могут отличаться в разных и внутри сессий, в зависимости от значения системной переменной activate_all_roles_on_login, роли по умолчанию учетной записи и от того, было ли выполнено SET ROLE в сессии.
MySQL поддерживает частичное отмена глобальных привилегий, так что глобальная привилегия может быть ограничена по применению к конкретным схемам (см. раздел 8.2.12, «Ограничение привилегий с помощью частичных отмены»). Для указания того, какие глобальные привилегии схемы были отменены для определённых схем, вывод SHOW GRANTS включает REVOKE утверждения:
mysql> SET PERSIST partial_revokes = ON;
mysql> CREATE USER u1;
mysql> GRANT SELECT, INSERT, DELETE ON *.* TO u1;
mysql> REVOKE SELECT, INSERT ON mysql.* FROM u1;
mysql> REVOKE DELETE ON world.* FROM u1;
mysql> SHOW GRANTS FOR u1;
+--------------------------------------------------+
| Grants for u1@% |
+--------------------------------------------------+
| GRANT SELECT, INSERT, DELETE ON *.* TO `u1`@`%` |
| REVOKE SELECT, INSERT ON `mysql`.* FROM `u1`@`%` |
| REVOKE DELETE ON `world`.* FROM `u1`@`%` |
+--------------------------------------------------+
SHOW GRANTS не отображает привилегии, доступные для указанной учетной записи, но предоставленные другой учетной записи. Например, если существует анонимная учетная запись, указанная учетная запись может использовать её привилегии, но SHOW GRANTS их не отображает.
SHOW GRANTS отображает обязательные роли, указанные в значении системной переменной mandatory_roles следующим образом:
SHOW GRANTSбезFORчасти отображает привилегии для текущего пользователя и включает обязательные роли.SHOW GRANTS FORотображает привилегии для указанного пользователя и не включает обязательные роли.user
Это поведение полезно для приложений, которые используют вывод SHOW
GRANTS FOR для определения, какие привилегии явно предоставлены указанному пользователю. Если бы этот вывод включал обязательные роли, было бы трудно отличить роли, предоставленные явно пользователю, от обязательных ролей.user
Для текущего пользователя приложения могут определить привилегии с или без обязательных ролей, используя SHOW
GRANTS или SHOW GRANTS FOR
CURRENT_USER, соответственно.
© 2025 Oracle
Licensed under the GPLv2 License.