Как генерировать / динамически создавать / удалять пользователей - PullRequest
0 голосов
/ 01 октября 2009

(Связано, но отдельно от Синтаксическая ошибка с эмуляцией "создать пользователя, если не существует" .)

Можно ли достичь функциональности общего / динамического добавления пользователя (т.е. эмулировать системную процедуру sp_adduser, включенную в другие СУБД) в MySQL?

MySQL не поддерживает следующий синтаксис if [not] exists, см. http://bugs.mysql.com/bug.php?id=15287:

create user if not exists 'foo'@'%' identified by password 'bar';

Это также не поддерживает:

drop procedure if exists create_user_if_not_exists;

delimiter ||

create procedure create_user_if_not_exists
               ( sUser     varchar(60),
                 sHost     varchar(16),
                 sPassword varchar(255) )
begin

-- ensure user does not yet exist
if (select ifnull((select 1
                     from mysql.user
                    where User = sUser
                      and Host = sHost), 0) = 0) then
  set @createUserText = concat('create user ''', sUser, '''@''', sHost, ''' identified by ''', sPassword, ''';');

  prepare createUserStatement FROM @createUserText;
  execute createUserStatement;
  deallocate prepare createUserStatement;
end if;

end ||

delimiter ;

потому что, если вы попытаетесь вызвать указанную процедуру:

call create_user_if_not_exists ( 'foo', '%', 'bar' );

вы получите прекрасное сообщение:

This command is not supported in the prepared statement protocol yet

Следующие работы, но, очевидно, не особенно многоразовые:

drop procedure if exists create_user_if_not_exists;

delimiter ||

create procedure create_user_if_not_exists
               (  )
begin

if (select ifnull((select 1
                     from mysql.user
                    where User = 'foo'
                      and Host = '%'), 0) = 0) then
  create user 'foo'@'%' identified by password 'bar';
end if;

end ||

delimiter ;

1 Ответ

0 голосов
/ 01 октября 2009

Ой, прости, я только что сказал, что ты говоришь о пользователях БД. не пользователи приложения.

Вам может понравиться оператор INSERT INTO ...... ON DUPLICATE KEY UPDATE ......=VALUE(.....).

Я использую это в моем общем методе сохранения объекта, поэтому мне не нужно заботиться о том, существует ли пользователь или нет, он будет там (и актуален) после того, как я сделаю коммит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...