在同一服务器上的数据库之间复制用户权限

时间:2011-09-13 10:14:46

标签: mysql

最近的项目更新涉及为应用程序添加大量相对(每6-12个月更新一次)静态数据。由于它的大小(appx 1GB,包括索引),它被选为将其包含在一个单独的数据库中。代码已经更新,已经处理完所有,但是现在开发机器上的一个简单的一次性操作对于部署更新来说是一个相当大的麻烦:即,将应用程序的用户权限添加到新数据库。

是否有一种简单的方法可以复制主数据库中已存在的用户以访问新数据库?

e.g。用户最初使用标准“在main_db上的GRANT ALL。*到由'XX'标识的用户@ localhost创建;”

我希望找到一种方法可以轻松将其转换为“在static_db上使用GRANT ALL。*由'XX'识别的用户@ localhost;”无需在部署应用程序的每台服务器上手动执行此操作(是的,它们都具有不同的“XX”值。:))

编辑: 以Devart的建议为出发点,我得到了我需要的东西。有关数据库范围权限的表是mysql.db。在此处发布查询(通用形式)以防其他人帮助。

INSERT INTO mysql.db 
SELECT 
Host, 'New_DB', User, Select_priv, Insert_priv, Update_priv, Delete_priv, 
Create_priv, Drop_priv, Grant_priv, References_priv, Index_priv, Alter_priv, 
Create_tmp_table_priv, Lock_tables_priv, Create_view_priv, Show_view_priv,    
    Create_routine_priv, Alter_routine_priv, Execute_priv, Event_priv, Trigger_priv
    FROM mysql.db
WHERE
User='username' AND Host = 'hostname' AND Db='Old_Db';

1 个答案:

答案 0 :(得分:2)

所有授予的权限都存储在系统表中,例如 - mysql.tables_priv,mysql.columns_priv,mysql.db ...你可以编写一个脚本来复制你需要的所有权限。

假设我们有用户 -

CREATE USER 'user1'@'%';
GRANT Insert ON TABLE database1.table1 TO 'user1'@'%';
GRANT Execute ON PROCEDURE database1.procedure1 TO 'user1'@'%';

现在,我们将复制这些权限以访问数据库'database2' -

-- Copy table's privileges
INSERT INTO mysql.tables_priv SELECT host, 'database2', user, table_name, grantor, timestamp, table_priv, column_priv FROM mysql.tables_priv
  WHERE user = 'user1' AND host = '%' AND db = 'database1';

-- Copy routine's privileges
INSERT INTO mysql.procs_priv SELECT host, 'database2', user, routine_name, routine_type, grantor, proc_priv, timestamp FROM mysql.procs_priv
  WHERE user = 'user1' AND host = '%' AND db = 'database1';

-- Do not forget to apply changes ;-)
FLUSH PRIVILEGES;

对另一个系统表执行相同的操作。