我们有几个在我们的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。
试一试 !!!