微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

仅撤销对 MySQL 具有所有权限的用户的删除

如何解决仅撤销对 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. 添加单独的权限列表,除数据库级别的 DELETE 权限外,所有权限都包含在 ALL PRIVILEGES 中
  2. 对除 mytable 之外的所有表添加 DELETE 权限
  3. 删除所有 PRIVILEGES 权限

这太复杂了。但正确。


或者你可以简化解决方案,不使用权限系统(当然这不是一个好习惯),并禁止在编程层面使用相应的触发器进行删除:

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。