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

48

我正在运行一些测试,尝试查看是否可以创建一个仅能访问数据库中1或2个表的用户。有人知道该如何实现吗?以下是我的代码,但它失败了:

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

错误提示我语法有误。

2个回答

78

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

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

MySQL的GRANT语法仅允许在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上似乎无法正常工作如何在MySQL中“减去”权限 解释了原因。

要授予所有表的SELECT权限,然后有选择性地撤销,可以执行以下操作:

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

尽管如此,我认为这似乎是一种奇怪的方法,我更倾向于逐个授予权限而不是逐个撤销权限。


有趣。MySQL也可以删除对特定表的访问权限吗?这样我就可以分配testdb.*,然后只需删除我不希望他们访问的表的访问权限。 - enchance
@enchance 是的,请参见上面的添加。 - Michael Berkowski
授予joe@localhost对testdb.*的SELECT权限,密码为'pass'; 从joe@localhost撤销testdb.tblname的所有权限; 撤销语句将无法生效。它会给出以下错误信息:“在表'tblname'上,用户'joe'在主机'localhost'上没有定义此类授权”。 - Rahul
1
@Rahul 确实,我也无法在MariaDB 5.5上使其正常工作。我想知道在2011年是否可以正确运行,当时我可能已经在5.0上测试过它,并且没有人评论说它不起作用。我将在上面添加一个注释,并链接到这个问题 - Michael Berkowski

6
您可以直接使用mysql.tables_priv表
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时不需要)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接