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