是否有可能为所有数据库中的特定表指定MySQL全局特权?

我们有几个在我们的MySQL服务器上运行相同结构的数据库。 现在我们需要一个在所有数据库上都需要INSERT权限的用户,但是在特定的表上。

可能吗?

我尝试下面的授权,但没有运气:

将* .mytable上的INSERT授予“myuser”@“%”

正如你所看到的,我试图避免为每个数据库创build一个用户。 如果上述方法不可行,还有其他办法可以达到这个目标吗?

我知道相反的情况是可能的(创build一个拥有给定数据库的所有表或所有数据库中所有表的权限的用户)。 我可以做到这一点:

授予dbname。*到'myuser'@'%'

授予*。*到'myuser'@'%'

全局权限在这里描述: http : //dev.mysql.com/doc/refman/5.1/en/grant.html#grant-global-privileges ,但我找不到这样的选项。

你可能需要使用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的数据库,并追加string'.mytable'

 SELECT CONCAT(table_schema,'.',table_name) my_table FROM information_schema.tables WHERE table_name = 'mytable'; 

然后,获取该列表并为每个特定用户的表列表创build适当的授权

 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 

现在只需login到mysql运行该脚本

 mysql> source /root/GlobalTableGrants.sql 

运行脚本后,执行此操作

 SELECT * FROM mysql.tables_priv WHERE table_name = 'mytable'\G 

您应该看到每次启用表级别priv的my_table。

试一试 !!!