【问题标题】:MySQL test privilegesMySQL 测试权限
【发布时间】:2012-01-18 06:37:30
【问题描述】:

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

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

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

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

【问题讨论】:

  • select * from information_schema.user_privileges WHERE GRANTEE LIKE '%what_ever_your_user_is%'

标签: mysql privileges


【解决方案1】:

如果直接从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

【讨论】:

  • 不幸的是,在授予用户 INSERT 和 CREATE 权限后,select * from information_schema.user_privileges 报告仅关于 USAGE 权限,而 SHOW GRANTS 显示 USAGE、INSERT 和 CREATE 权限。
  • 最终我必须从 information_schema.schema_privileges 中进行选择,但存在同样的问题:如果对squid%.* 进行了 GRANT,那么我将不得不解析 % 等等,而我想要检查用户'sknaumov'@'localhost'是否对squidtest数据库具有一定权限的简单解决方案。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-18
    • 2016-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多