Мне нужно выбрать всех пользователей с любыми привилегиями для базы данных (например, базы данных "mysql" ). Какие-либо предложения? Спасибо.
Показывать пользователей с любыми привилегиями для базы данных. MySQL
Ответ 1
Посмотрите в базе данных mysql
(фактический db с именем mysql
внутри сервера mysql, чтобы быть понятным). Там три таблицы (db
, tables_priv
и columns_priv
), где хранятся хранилища db/table/column:
SELECT 'db', User, Host
FROM db
WHERE Db='mydatabase'
UNION
SELECT 'table', User, Host
FROM tables_priv
WHERE Db='mydatabase'
UNION
SELECT 'col', User, Host
FROM columns_priv
WHERE Db='mydatabase'
должен показать вам, что вам нужно.
Ответ 2
Хороший обзор всех пользователей и их приблизительные привилегии. Если есть пароль, это будет с помощью строки encrytped; если нет, это поле пустое. Выбор - это очень общий принцип; insert позволяет манипулировать таблицами в базе данных; shutdown позволяет существенно изменить систему и может использоваться только root; возможность предоставления разрешений отделена от других.
SELECT user, host, password, select_priv, insert_priv, shutdown_priv, grant_priv
FROM mysql.user
Просмотр разрешений для отдельных баз данных.
SELECT user, host, db, select_priv, insert_priv, grant_priv FROM mysql.db
Ответ 3
-
привилегии базы данных хранятся в
mysql.db
-
привилегии таблицы хранятся в
mysql.tables_priv
-
привилегии столбца хранятся в
mysql.columns_priv
-
обычные привилегии хранятся в
mysql.proc_privs
Вы можете определить процедуру хранилища для перечисления привилегий:
delimiter //
CREATE PROCEDURE list_privileges (IN db_name CHAR(50))
BEGIN
SELECT concat(Db,'.', '*') as 'what', User, Host, '...' as 'perms'
FROM mysql.db
WHERE Db=db_name
UNION
SELECT concat(Db,'.', Table_name), User, Host, table_priv
FROM mysql.tables_priv
WHERE Db=db_name and table_priv != ''
UNION
SELECT concat(Db,'.', Table_name, '(', Column_name,')'), User, Host, Column_priv
FROM mysql.columns_priv
WHERE Db=db_name
UNION
SELECT concat(Db,'.', Routine_name, '()'), User, Host, Proc_priv
FROM mysql.procs_priv
WHERE Db=db_name;
END//
delimiter ;
Пример:
mysql> call list_privileges("testlink2");
+-----------------------------+-----------+-----------+---------+
| what | User | Host | perms |
+-----------------------------+-----------+-----------+---------+
| testlink2.* | testlink2 | % | ... |
| testlink2.* | testlink2 | localhost | ... |
| testlink2.executions | testlink2 | % | Select |
| testlink2.users(id) | testlink2 | % | Select |
| testlink2.list_privileges() | testlink2 | % | Execute |
+-----------------------------+-----------+-----------+---------+
5 rows in set (0.00 sec)
Query OK, 0 rows affected (0.00 sec)