撤销 MySQL 权限时发生表不存在的情况。

4

我创建了一个具有表级别权限的mysql用户。

这张表在一段时间后被删除,但是mysql.table_priv中的权限仍然存在。

是否有一种方法(也许是存储过程)可以删除所有引用不存在表的mysql.table priv中的条目?

以下是重现它的方法:

CREATE DATABASE test;
USE test;
CREATE TABLE test (Col1 INT(10));
GRANT SELECT ON test.test TO test@'%' IDENTIFIED BY 'test';
DROP TABLE test;


SELECT * FROM mysql.tables_priv WHERE user = 'test'; # 1 row

问候 Andre

2个回答

3

您可以使用以下查询查找不存在的表上用户的所有权限:

SELECT tables_priv.* FROM mysql.tables_priv 
 LEFT JOIN information_schema.tables ON (db=table_schema AND tables_priv.table_name=tables.table_name) 
WHERE tables.table_schema IS NULL;

之后您可以使用 DELETE 命令来移除权限:

DELETE mysql.tables_priv FROM mysql.tables_priv 
 LEFT JOIN information_schema.tables 
  ON (db=table_schema AND tables_priv.table_name=tables.table_name) 
 WHERE tables.table_schema IS NULL;
FLUSH PRIVILEGES;

我希望不必强调,但请极度小心使用。


1
如果可以删除用户,您可以使用

DROP USER test

如果不能删除用户,则需要自己从 mysql.tables_priv 中删除相应的条目。您需要具备正确的权限才能执行此操作。并且在更改后不要忘记刷新权限。
DELETE FROM mysql.tables_priv 
WHERE Table_name LIKE "test" 
  AND User Like "test" 
  AND Host LIKE "%"
  AND Table_priv LIKE "Select";

FLUSH PRIVILEGES;

或者,您可以使用 REVOKE命令:

REVOKE
  priv_type [(column_list)]
  [, priv_type [(column_list)]] ...
ON [object_type] priv_level
FROM user [, user] ...

请注意那个表格!

我想保留用户,因此不考虑删除用户(DROP USER)选项。我有大约1000个MySQL用户,不知道上个月删除了哪些表。 - Andre
我明白了。那么你可能需要一个清理它的函数或过程。 - luksch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接