2011-12-03 44 views

回答

40

运行它们作为两个单独的GRANT声明:

GRANT SELECT ON testdb.fruits TO [email protected] IDENTIFIED BY 'pass'; 
GRANT SELECT ON testdb.sports TO [email protected] 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 [email protected] IDENTIFIED BY 'pass'; 
REVOKE ALL PRIVILEGES ON testdb.tblname FROM [email protected]; 

这似乎是一个奇怪的方法,虽然,我想我会分别授予而不是单独REVOKE。

+0

有趣。 MySQL可以删除对特定表的访问吗?这样我可以分配'testdb。*',然后删除我不想访问的表的访问权限。 – enchance

+0

@enchance是的,请参阅上面的内容。 –

+0

谢谢,迈克尔。这解决了它。 – enchance

0

可以使用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时)