gpt4 book ai didi

mysql - 有没有办法在 MySQL 的 TRUNCATE 或 DROP TABLE 上有效地 GRANT?

转载 作者:可可西里 更新时间:2023-11-01 06:43:39 31 4
gpt4 key购买 nike

我最近在 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 被归类为 DDL 操作,因此它在内部不使用 DELETE,它使用 DROP。好吧,所以我想限制该用户删除表(如果发生安全漏洞,至少恶意用户必须确定表的名称并单独删除它们)。

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

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

最佳答案

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

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

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

  SHOW GRANTS FOR 'fo'@'%' ;

并以用户身份连接'fo'@'%'测试:

  TRUNCATE TABLE fee.fi ;

(显然,用户也有删除同一张表的权限。但这就是它在 MySQL 中的方式。)


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

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

然后您可以将过程的执行权授予用户:

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

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

  CALL fee.truncate_table_fee_fi 

关于mysql - 有没有办法在 MySQL 的 TRUNCATE 或 DROP TABLE 上有效地 GRANT?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36227470/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com