有没有办法在MySQL中的TRUNCATE或DROP TABLE上有效地进行GRANT?

时间:2016-03-25 20:25:06

标签: mysql sql permissions

我最近在MySQL 5.5.x中试过这个:

GRANT
    SELECT, INSERT, UPDATE, DELETE, TRUNCATE ON crawler.*
    TO 'my_user'@'localhost' WITH GRANT OPTION;

这会导致错误:

  

错误1064(42000):您的SQL语法有错误;检查与您的MySQL服务器版本相对应的手册,以便在#TRACATE ON crawler附近使用正确的语法。*   TO' my_user' @' localhost' WITH GRANT OPTION'在第2行

在添加TRUNCATE之前,这已经过去了,所以经过一些研究后我发现MySQL不支持这种做法。

原因是TRUNCATE被归类为DDL操作,因此内部不使用DELETE,它使用DROP。好吧,所以我想限制这个用户删除表(如果发生安全漏洞,至少恶意用户必须确定表的名称并单独丢弃它们。)

然而,事实证明我需要授予此用户DROP权限,这允许用户也删除整个数据库。鉴于没有a grant for individual tables,还有另一种方法吗?我想我可以把它转移到另一个用户不同的进程,但对于这么小的问题感觉有点麻烦。

目前,我会坚持DELETE,即使它很慢! (在我的笔记本电脑上,删除1.6M小行需要约55秒,而截断相同的时间则需要几分之一秒)。但是,如果有更快更安全的替代方案,我会全力以赴。

1 个答案:

答案 0 :(得分:7)

要将特定数据库中特定表的DROP特权授予MySQL中的特定用户,可以使用这样的GRANT语句。 (这假设表fi存在于数据库fee中,这是您希望用户'fo'@'%'能够TRUNCATE的表:

  GRANT DROP ON TABLE fee.fi TO 'fo'@'%'

要查看用户是否有权截断该特定表:

  SHOW GRANTS FOR 'fo'@'%' ;

以用户'fo'@'%'连接到test:

  TRUNCATE TABLE fee.fi ;

(显然,用户也有权使用DROP相同的表。但这只是它在MySQL中的方式。)

作为替代方案,允许用户仅对该特定表执行 TRUNCATE操作,而不在表上授予用户DROP权限...

创建一个执行TRUNCATE fee.fi;的存储过程(可能需要动态执行,因为它是DDL。)需要使用DEFINER权限创建过程,并创建由具有所需权限的用户。

然后,您可以向用户授予对该过程的执行权:

  GRANT EXECUTE ON fee.truncate_table_fee_fi TO 'fo'@'%';

然后用户'fo'@'%'可以

  CALL fee.truncate_table_fee_fi