我最近在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秒,而截断相同的时间则需要几分之一秒)。但是,如果有更快更安全的替代方案,我会全力以赴。
答案 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