仅从MySQL上具有所有权限的用户处撤消删除



我有一个用户拥有MySQL 8:中特定数据库的所有权限

GRANT ALL PRIVILEGES ON `mydatabase`.* TO `foo`@`localhost`

我可以用SHOW GRANTS FOR 'foo'@'localhost';检查拨款,我得到:

+-------------------------------------------------------------+
| Grants for foo@localhost                                    |
+-------------------------------------------------------------+
| GRANT USAGE ON *.* TO `foo`@`localhost`                     |
| GRANT ALL PRIVILEGES ON `mydatabase`.* TO `foo`@`localhost` |
+-------------------------------------------------------------+

现在我需要删除特定表上的DELETE授权,所以我尝试了:

REVOKE DELETE ON `mydatabase`.`mytable` FROM 'foo'@'localhost';

但我得到以下错误:

ERROR 1147 (42000): There is no such grant defined for user 'foo' on host 'localhost' on table 'mytable'

如何删除删除授权?我必须一个接一个地添加所有授权(它们是哪些?(,然后删除删除授权?

GRANT将相应的行添加到特权表中。

REVOKE从该表中删除具有指定权限的行,而不是在删除该权限的情况下添加另一行。因此,您只能撤消表中存在的特权。精确地

您可以:

  1. 添加单独的权限列表,所有权限都包含在all privileges中,数据库级别的DELETE权限除外
  2. 在除mytable之外的所有表上添加DELETE权限
  3. 删除所有特权

这太复杂了。但这是正确的。


或者,您可以简化解决方案,不使用特权系统(当然这不是好的做法(,并使用相应的触发器禁止在编程级别上删除:

CREATE TRIGGER forbid_delete_for_user
BEFORE DELETE 
ON mytable
FOR EACH ROW
BEGIN
IF LOCATE(USER(), 'foo@localhost,bar@localhost') THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'Deletion from 'mytable' not allowed for current user.';
END IF;
END

但您必须记住,级联外键操作不会激活触发器。因此,用户仍然可以找到从该表中删除行的方法。

相关内容

  • 没有找到相关文章

最新更新