我们的 MySQL 服务器上运行着多个具有相同结构的数据库。现在我们需要一个用户,该用户需要对所有数据库(但对特定表)具有 INSERT 权限。
是否可以?
我尝试了下面的授权,但没有成功:
授予 'myuser'@'%' 在 *.mytable 上进行 INSERT 权限
如您所见,我试图避免为每个数据库创建一个用户。如果上述方法不可行,还有其他方法可以实现此目标吗?
我知道相反的情况也是可能的(创建一个对给定数据库的所有表或所有数据库中的所有表具有权限的用户)。我可以通过以下方式实现它:
授予 dbname.* 至 'myuser'@'%'
授予 *.* 至 'myuser'@'%'
全局权限如下所述:http://dev.mysql.com/doc/refman/5.1/en/grant.html#grant-global-privileges,但我在那里找不到这样的选项。
答案1
您可能需要使用 mysql 模式表来破解它以获得所需的授权:
首先,这里是mysql.tables_priv的描述
mysql> show create table mysql.tables_priv\G
*************************** 1. row ***************************
Table: tables_priv
Create Table: CREATE TABLE `tables_priv` (
`Host` char(60) COLLATE utf8_bin NOT NULL DEFAULT '',
`Db` char(64) COLLATE utf8_bin NOT NULL DEFAULT '',
`User` char(16) COLLATE utf8_bin NOT NULL DEFAULT '',
`Table_name` char(64) COLLATE utf8_bin NOT NULL DEFAULT '',
`Grantor` char(77) COLLATE utf8_bin NOT NULL DEFAULT '',
`Timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`Table_priv` set('Select','Insert','Update','Delete','Create','Drop','Grant','References','Index','Alter','Create View','Show view','Trigger') CHARACTER SET utf8 NOT NULL DEFAULT '',
`Column_priv` set('Select','Insert','Update','References') CHARACTER SET utf8 NOT NULL DEFAULT '',
PRIMARY KEY (`Host`,`Db`,`User`,`Table_name`),
KEY `Grantor` (`Grantor`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='Table privileges'
1 row in set (0.00 sec)
mysql>
您可能必须收集所有具有 mytable 的数据库并附加字符串 '.mytable'
SELECT CONCAT(table_schema,'.',table_name) my_table
FROM information_schema.tables WHERE table_name = 'mytable';
然后,获取该列表并为每个特定用户的表列表创建适当的授权
SELECT CONCAT('GRANT ALL PRIVILEGES ON ',my_table,' TO ',userhost,';') SQLGrantCommand
FROM
(
SELECT CONCAT('''',user,'''.''',host,'''') userhost
FROM mysql.user WHERE user NOT IN ('','root')
) user_list,
(
SELECT CONCAT(table_schema,'.',table_name) my_table
FROM information_schema.tables WHERE table_name = 'mytable';
) table_list;
您应该获取该查询并将其导出到名为 /root/GlobalTableGrants.sql 的文本文件
mysql -uroot -A --skip-column-names -e"SELECT CONCAT('GRANT ALL PRIVILEGES ON ',my_table,' TO ',userhost,';') SQLGrantCommand FROM (SELECT CONCAT('''',user,'''.''',host,'''') userhost FROM mysql.user WHERE user NOT IN ('','root')) user_list,(SELECT CONCAT(table_schema,'.',table_name) my_table FROM information_schema.tables WHERE table_name = 'mytable') table_list" > /root/GlobalTableGrants.sql
现在只需登录 mysql 运行该脚本
mysql> source /root/GlobalTableGrants.sql
运行脚本后,执行以下操作
SELECT * FROM mysql.tables_priv WHERE table_name = 'mytable'\G
您应该看到每个启用了表级特权的 my_table 实例。
试一试 !!!