授予用户访问MySQL中有限数量的表的权限

时间:2011-12-03 16:53:23

标签: mysql

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

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

错误说我的语法错误。

2 个答案:

答案 0 :(得分:53)

将它们作为两个单独的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.5 How 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;

这似乎是一个奇怪的方法,我想我会单独GRANT而不是单独REVOKE。

答案 1 :(得分: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时不需要)