имеют подпрограмму безопасности, которая из массива имен пользователей, паролей и разрешений
- удаляет пользователя
- создает (того же самого) пользователя
- предоставляетдоступ к таблицам, процедурам и т. д.
// $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)
Существует ли какой-то процесс sync
, который необходимо запустить в MySQL
при работе с пользователями и разрешениями?Нужно ли их удалять, подождать несколько секунд и заново создать?Или что?
(Код прекрасно работает в postgreSQL и Oracle. Некоторые изменения были сделаны для ограничений MySQL с помощью GRANT и REVOKE, а именно, GRANT был сделан для каждой таблицы (вместо SCHEMA), поэтому впоследствиивыданный REVOKE будет работать правильно.)
KLUDGE Solution
После настройки GRANT и REVOKE для пользователей, сделайте еще один проход через пользователей и SET PASSWORD
.Ужасно, но это работает.
Все еще ищите лучшего понимания того, что происходит.
Правильное решение KLUDGE
Согласно ответу ниже (спасибо!) MySQL имеет неКоманда ANSI FLUSH ПРИВИЛЕГИИ.Выдается после DROP USER и до CREATE USER и MySQL больше не сбрасывает пароль пользователя.