2011-12-12 78 views
3

假设我们要测试的MySQL数据库的一些特权之前执行一些程序(程序记录到MySQL之前daemonizes本身,所以我们不能很容易地检查记录是否会成功)。MySQL的测试权限

解析SHOW GRANTS输出是一种折磨,特别是与所有这些转义,%等

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

SELECT容易测试,但对于像DELETE这样的操作,INSERT? 说我们有INSERT权限,但没有删除,这样将水木清华是不是一个解决方案。 我们可以插入和删除“VOID”只是为了测试特权?

+0

SELECT * FROM information_schema.user_privileges WHERE GRANTEE LIKE '%what_ever_your_user_is%' – cristian

回答

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

+0

为用户授予INSERT和CREATE权限后,不幸的是,SELECT * FROM只有约USAGE权限information_schema.user_privileges报告,而SHOW GRANTS显示,使用,INSERT和CREATE特权。 – sknaumov

+0

最后,我不得不从information_schema.schema_privileges选择,但有同样的问题:如果GRANT是鱿鱼''%*做,那么我将不得不解析%等等,而我想简单的解决方案再检查一下是否用户'sknaumov'@'localhost'对'squidtest'数据库有一定的特权。 – sknaumov

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是丑陋的,但只要你不使用单引号或@您的用户名的迹象,你应该罚款。我认为。