MySQL测试权限

时间:2011-12-12 08:05:25

标签: mysql privileges

让我们假设我们必须在执行某些程序之前测试MySQL数据库的某些特权(程序在登录MySQL之前守护自身,因此我们无法轻易检查日志记录是否成功)。

解析SHOW GRANTS输出是一种折磨,尤其是所有这些逃逸,%等等。

是否有一种简单的方法来测试用户权限(连接用户可以使用的方式,而不是root用户)?

SELECT很容易测试,但是像DELETE,INSERT这样的操作呢? 假设我们有INSERT权限,但没有DELETE,所以INSERTING smth不是解决方案。 我们可以INSERT和DELETE“VOID”来测试权限吗?

2 个答案:

答案 0 :(得分:0)

如果直接从information_schema中选择它怎么样?

select * from information_schema.user_privileges;

现在要解析结果集,你可以使用客户端或管道它来sed创建一个csv文件,即

mysql -uroot -p -e "select * from information_schema.user_privileges" | sed 's/\t/","/g;s/^/"/;s/$/"/;s/\n//g' > grants.csv

参考文献: http://dev.mysql.com/doc/refman/5.0/en/user-privileges-table.html

答案 1 :(得分:0)

可以在不同级别(用户级别,架构级别,表级别甚至列级别)授予权限。下面的查询结合了这些(列级别除外),并显示每个表(或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周围添加引号的方式很难看,但只要您不在用户名中使用单引号或@符号,就应该没问题。我想。