【发布时间】:2011-12-03 16:53:23
【问题描述】:
我正在运行一些测试,并试图查看是否可以创建一个只能访问我的数据库中的 1 或 2 个表的用户。有谁知道这是怎么做到的?我下面的代码失败了:
GRANT SELECT ON testdb.fruits, testdb.sports TO joe@localhost IDENTIFIED BY 'pass';
错误表明我的语法有错误。
【问题讨论】:
标签: mysql
我正在运行一些测试,并试图查看是否可以创建一个只能访问我的数据库中的 1 或 2 个表的用户。有谁知道这是怎么做到的?我下面的代码失败了:
GRANT SELECT ON testdb.fruits, testdb.sports TO joe@localhost IDENTIFIED BY 'pass';
错误表明我的语法有错误。
【问题讨论】:
标签: mysql
将它们作为两个单独的 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;
不过,这似乎是一种奇怪的方法,我想我会单独授予而不是单独撤销。
【讨论】:
testdb.*,然后删除对我不希望他们访问的表的访问。
您可以直接使用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 时不需要)
【讨论】: