【问题标题】:Revoke only delete from user with all privileges on MySQL仅撤销对 MySQL 具有所有权限的用户的删除
【发布时间】:2021-05-07 07:53:20
【问题描述】:

我有一个用户拥有 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'

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

【问题讨论】:

    标签: mysql database sql-grant


    【解决方案1】:

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

    REVOKE 从该表中删除具有指定权限的行,而不是添加具有删除权限的另一行。因此,您只能撤销表中存在的那些特权。没错。

    你可以:

    1. 添加单独的权限列表,所有权限都包含在 ALL PRIVILEGES 中,但数据库级别的 DELETE 权限除外
    2. 对除mytable 之外的所有表添加DELETE 权限
    3. 移除 ALL 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
    

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

    【讨论】:

      猜你喜欢
      • 2011-07-14
      • 2020-02-16
      • 2018-09-29
      • 2018-06-12
      • 1970-01-01
      • 2015-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多