我最近在MySQL 5.5.x中尝试了这个:
GRANT
SELECT, INSERT, UPDATE, DELETE, TRUNCATE ON crawler.*
TO 'my_user'@'localhost' WITH GRANT OPTION;
这会导致一个错误:
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'TRUNCATE ON crawler.* TO 'my_user'@'localhost' WITH GRANT OPTION' at line 2
在我添加TRUNCATE之前,这个命令可以正常工作,经过一番研究,我发现MySQL不支持TRUNCATE。
原因是TRUNCATE被归类为DDL操作,因此它不使用DELETE内部,而是使用DROP。好的,所以我想限制这个用户删除表(在安全漏洞的情况下,至少恶意用户需要确定表的名称并单独删除它们)。
然而,事实证明我需要授予该用户
DROP
权限,这将使用户也能够删除整个数据库。鉴于没有 单独表的授权,还有其他方法可以做到这一点吗?我想我可以将其移交给具有不同用户的另一个进程,但对于这样一个小问题来说,感觉有点繁琐。
目前,我将坚持使用 DELETE
,即使它非常缓慢!(在我的笔记本电脑上,删除 160 万行小数据需要约 55 秒,而截断相同数据只需几分之一秒)。但是,如果有更快速和安全的替代方案,我会听取建议。
GRANT DROP
影响单个表 - 我会试一下的!谢谢你。 (我想我已经习惯了ON fee.*
,以至于我忘记了*
可以与单个表名交换)。 - halferroot
)的身份删除数据库,该用户在mysql.user
表中具有Drop_priv=Y
。我认为这相当于GRANT/REVOKE语句中的**on *.*
。我不认为grant drop on fee.*
**会赋予用户删除数据库fee的权限,但我从未尝试/测试过。(显然,它将使用户有权清空数据库,删除数据库中的所有对象。) - spencer7593