【问题标题】:Grant user access to limited number of tables in MySQL授予用户对 MySQL 中有限数量表的访问权限
【发布时间】:2011-12-03 16:53:23
【问题描述】:

我正在运行一些测试,并试图查看是否可以创建一个只能访问我的数据库中的 1 或 2 个表的用户。有谁知道这是怎么做到的?我下面的代码失败了:

GRANT SELECT ON testdb.fruits, testdb.sports TO joe@localhost IDENTIFIED BY 'pass';

错误表明我的语法有错误。

【问题讨论】:

    标签: mysql


    【解决方案1】:

    将它们作为两个单独的 GRANT 语句运行:

    GRANT SELECT ON testdb.fruits TO joe@localhost IDENTIFIED BY 'pass';
    GRANT SELECT ON testdb.sports TO joe@localhost IDENTIFIED BY 'pass';
    

    The MySQL GRANT syntax 只允许priv_level 位置的一个对象:,尽管它可以使用* 作为通配符:

    GRANT
        priv_type [(column_list)]
          [, priv_type [(column_list)]] ...
        ON [object_type] priv_level
        TO user_specification [, user_specification] ...
        [REQUIRE {NONE | ssl_option [[AND] ssl_option] ...}]
        [WITH with_option ...]
    
    object_type:
        TABLE
      | FUNCTION
      | PROCEDURE
    
    priv_level:
        *
      | *.*
      | db_name.*
      | db_name.tbl_name
      | tbl_name
      | db_name.routine_name
    

    下面的部分似乎不适用于 MySQL 5.5How to "subtract" privileges in MySQL 说明原因。

    要在所有表上授予 SELECT 然后有选择地撤销,您可以这样做:

    GRANT SELECT ON testdb.* TO joe@localhost IDENTIFIED BY 'pass';
    REVOKE ALL PRIVILEGES ON testdb.tblname FROM joe@localhost;
    

    不过,这似乎是一种奇怪的方法,我想我会单独授予而不是单独撤销。

    【讨论】:

    • 有趣。 MySQL 也可以删除对特定表的访问吗?这样我就可以分配testdb.*,然后删除对我不希望他们访问的表的访问。
    • @enchance 是的,见上面的补充。
    • GRANT SELECT ON testdb.* TO joe@localhost IDENTIFIED BY 'pass';从 joe@localhost 撤销 testdb.tblname 上的所有特权;撤销语句将不起作用。它将给出以下错误“在表'tblname'上的主机'localhost'上没有为用户'joe'定义这样的授权”
    • @Rahul 事实上,我不能让它与 MariaDB 5.5 一起使用。我想知道这在 2011 年是否可以正常工作,当时我可能会在 5.0 上对其进行测试,之前没有人评论过它不起作用。我将在上面添加一个注释,并链接到this other question
    【解决方案2】:

    您可以直接使用mysql.tables_priv table

    INSERT INTO mysql.tables_priv (`Host`, `Db`, `User`, `Table_name`, `Grantor`, `Table_priv`)
    VALUES
    ('%', DATABASE(), 'someuser', 'mytable1', CURRENT_USER, 'Select,Insert,Update,Delete'),
    ('%', DATABASE(), 'someuser', 'mytable2', CURRENT_USER, 'Select,Insert,Update,Delete')
    

    手动更新这些表后,您需要显式运行FLUSH PRIVILEGES 查询来告诉MySQL 更新其权限缓存(使用GRANT 时不需要)

    【讨论】:

      猜你喜欢
      • 2019-06-10
      • 1970-01-01
      • 2019-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-25
      • 2016-03-16
      • 2014-08-11
      相关资源
      最近更新 更多