Тестовые привилегии MySQL - PullRequest
       14

Тестовые привилегии MySQL

3 голосов
/ 12 декабря 2011

Предположим, что мы должны протестировать некоторые привилегии базы данных MySQL, прежде чем выполнять какую-либо программу (программа демонизирует себя перед входом в MySQL, поэтому мы не можем легко проверить, будет ли регистрация успешной).

Разбор вывода SHOW GRANTS - это пытка, особенно со всеми этими побегами,% и т. Д.

Есть ли простой способ проверить пользовательские привилегии (способ, которым может пользоваться подключенный пользователь, а не root)?

SELECT легко проверить, но как насчет таких операций, как DELETE, INSERT? Скажем, у нас есть привилегия INSERT, но нет DELETE, поэтому INSERTING smth не является решением. Можем ли мы ВСТАВИТЬ и УДАЛИТЬ «VOID» только для проверки привилегий?

Ответы [ 2 ]

0 голосов
/ 26 марта 2014

Привилегии могут быть предоставлены на различном уровне (уровень пользователя, уровень схемы, уровень таблицы и даже уровень столбца).Приведенный ниже запрос объединяет их (кроме уровня столбца) и показывает комбинированные привилегии для таблицы (или VIEW).

SELECT TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE, GRANTEE
 , GROUP_CONCAT(DISTINCT PRIVILEGE_TYPE ORDER BY PRIVILEGE_TYPE) PRIVILEGE_TYPES
FROM (
 SELECT TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE, GRANTEE, PRIVILEGE_TYPE
  FROM information_schema.TABLES
  INNER JOIN information_schema.user_privileges USING (TABLE_CATALOG)
  WHERE NOT TABLE_SCHEMA IN ('information_schema', 'performance_schema')
   AND GRANTEE=CONCAT("'", REPLACE(CURRENT_USER(), '@', "'@'"), "'")
 UNION ALL
 SELECT TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE, GRANTEE, PRIVILEGE_TYPE
  FROM information_schema.TABLES
  INNER JOIN information_schema.schema_privileges USING (TABLE_CATALOG, TABLE_SCHEMA)
  WHERE NOT TABLE_SCHEMA IN ('information_schema', 'performance_schema')
   AND GRANTEE=CONCAT("'", REPLACE(CURRENT_USER(), '@', "'@'"), "'")
 UNION ALL
 SELECT TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE, GRANTEE, PRIVILEGE_TYPE
  FROM information_schema.TABLES
  INNER JOIN information_schema.table_privileges USING (TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME)
  WHERE NOT TABLE_SCHEMA IN ('information_schema', 'performance_schema')
   AND GRANTEE=CONCAT("'", REPLACE(CURRENT_USER(), '@', "'@'"), "'")
) u
 GROUP BY TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE, GRANTEE
;

Обратите внимание, что способ, которым я помещаю кавычки вокруг CURRENT_USER, уродлив, но покане используйте одинарные кавычки или знаки @ в именах пользователей, все будет в порядке.Я думаю.

0 голосов
/ 12 декабря 2011

Как насчет того, если вы выберете его непосредственно из информационной_схемы?

select * from information_schema.user_privileges;

Теперь, чтобы проанализировать набор результатов, вы можете использовать клиент или передать его в sed для создания файла CSV, т.е.1008 *

...