15.7.7.23 Заявление 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.14, «Заявление 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 (или любой эквивалентный синтаксис) используется в контексте definer, например, внутри хранимой процедуры, которая выполняется с привилегиями definer, а не invoker, отображаемые привилегии будут принадлежать definer, а не invoker.
В MySQL 9.2 по сравнению с предыдущими сериями 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.