【问题标题】:How to "subtract" privileges in MySQL如何在 MySQL 中“减去”权限
【发布时间】:2011-12-29 05:33:58
【问题描述】:

我想撤销表“事务”的 2 列的更新权限。 我希望用户拥有对所有其他表和数据的所有访问权限。

mysql> REVOKE UPDATE (system, consumer) ON ledger.transact FROM 'foo'@'localhost';
ERROR 1147 (42000): There is no such grant defined for user 'foo' on host 'localhost' on table 'transaction'

上述方法似乎不起作用。

【问题讨论】:

  • 我认为没有“负面权限”,所以这行不通。您必须明确授予他对所有其他表的权限,并忽略您要限制的那些。

标签: mysql sql privileges


【解决方案1】:

我同意 Thilo 的观点 - 只有在您之前授予过这些列权限时,您才能撤销这些权限。您不能在更高级别(例如表格)上授予,然后在更详细的级别上撤销。我认为这在mysql参考手册MySql 5.1第12.7.1.3章中有描述:

"形成数据库、表、列或例程的权限 附加地作为每个特权的逻辑或 特权级别。例如,如果用户有一个全局 SELECT 特权,该特权不能因缺席而被拒绝 数据库、表或列级别的权限。”

Devart 已经描述了如何获得选择性特权。

【讨论】:

    【解决方案2】:

    Starting with MySQL 8.0.16,你终于可以减去权限了,虽然目前只能从全局授权中(例如,你还不能为个别列做),但值得注意的是:

    从 MySQL 8.0.16 开始,如果启用了 partial_revokes 系统变量,则可以通过为特定数据库撤销在全局级别授予的权限来显式拒绝授予的权限:

    GRANT SELECT, INSERT, UPDATE ON *.* TO u1;
    REVOKE INSERT, UPDATE ON db1.* FROM u1;
    

    partial_revokes 系统变量必须为此设置:

    启用此变量可以部分撤销权限。具体来说,对于在全局级别具有权限的用户,partial_revokes 可以撤销特定模式的权限,同时保留其他模式的权限。例如,可以限制具有全局 UPDATE 权限的用户在 mysql 系统模式上行使此权限。 (或者,换一种说法,用户可以对除 mysql 架构之外的所有架构行使 UPDATE 权限。)从这个意义上说,用户的全局 UPDATE 权限被部分撤销。

    【讨论】:

      【解决方案3】:

      首先 - 删除所有权限(在数据库、表、列级别)。

      1. 向每个表授予 UPDATE(...和其他)权限,“transact”除外。
      2. 向表“transact”中的指定字段授予 UPDATE 权限。

      【讨论】:

        【解决方案4】:

        我猜'ledger.transact' 是你的表?它应该像这样工作:

        REVOKE UPDATE ON ledger.transact FROM 'foo'@'localhost';
        

        查看here 以了解 mysql 中使用的 revoke 语法。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-02-17
          • 2018-01-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-12-01
          • 2014-09-05
          相关资源
          最近更新 更多