繁体   English   中英

在mysql中,删除/添加用户时出现奇怪的结果

[英]in mysql, weird results when dropping / adding users

具有一个安全例程,该例程由一系列用户名,密码和权限组成

  • 删除用户
  • 创建(相同)用户
  • 授予访问表,过程等的权限
// $users - Array of user records
// $tables - list of tables from `show tables`

// create users as necessary, reset password
foreach( $users as $user=>$arr ) {
        mysql_query( "drop user {$arr['user']}" );
        mysql_query( "create user {$arr['user']} identified by '{$arr['pwd']}'" );
};

// for each user set permission
foreach( $users as $user=>$arr ) {
     if( @$arr['table_grant'] ) foreach( $tables as $table )
        mysql_query( "grant {$arr['table_grant']} on $table to {$arr['user']}" );
     if( @$arr['tables_revoke'] ) foreach( $arr['tables_revoke'] as $table )                
        mysql_query( "revoke {$arr['table_grant']} on $table from {$arr['user']}" );
     if( @$arr['procedures_grant'] ) foreach( $arr['procedures_grant'] as $proc 
        mysql_query( "grant execute on procedure $proc to {$arr['user']}" );
     if( @$arr['functions_grant'] ) foreach( $arr['functions_grant'] as $func )
        mysql_query( "grant execute on function $func to {$arr['user']}" );
}

如果没有用户,则可以正常工作。

如果用户已经存在,则该用户在那里,但是除了最后一个创建的用户之外, 没有其他所有用户的密码

mysql> select user, password from mysql.user where user like 'm%';
+------------+-------------------------------------------+
| user       | password                                  |
+------------+-------------------------------------------+
| massage150 | *21A196706D99436A1C8163A98AE0687C432C37E2 |
| mlogin     | *DE069F0ED7E311D173CB01C3DD136D282E66048D |
| mselect    |                                           |
| mdml       |                                           |
+------------+-------------------------------------------+
4 rows in set (0.00 sec)

使用用户和权限时,是否需要在MySQL运行某种sync过程? 我需要删除它们,等待几秒钟,然后重新创建吗? 要不然是啥?

(代码在postgreSQL和Oracle中运行良好。针对MySQL的GRANT和REVOKE的局限性进行了一些修改,即GRANT是逐表(而不是SCHEMA范围)进行的,因此随后发布的REVOKE可以正常工作。)


KLUDGE解决方案

为用户设置GRANTs和REVOKEs后,再通过一次用户SET PASSWORD 丑陋,但是行得通。

仍在寻找对正在发生的事情的更好的理解。

正确的KLUDGE解决方案

按照下面的答案(谢谢!),MySQL有一个非ANSI命令FLUSH PRIVILEGES。 在DROP USER之后,CREATE USER和MySQL之前发出,不再发出用户密码。

尝试在CREATE USER语句之后执行FLUSH PRIVILEGES。 根据文档:

由于GRANT和CREATE USER语句,服务器将信息缓存在内存中。 相应的REVOKE和DROP USER语句不会释放该内存,因此对于执行许多导致缓存的语句实例的服务器,将会增加内存使用量。 可以使用FLUSH PRIVILEGES释放此缓存的内存。

值得一试。 我注意到对users表的更新在不运行此命令的情况下不会直接生效。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM