(Связано, но отдельно от Синтаксическая ошибка с эмуляцией "создать пользователя, если не существует" .)
Можно ли достичь функциональности общего / динамического добавления пользователя (т.е. эмулировать системную процедуру 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 ;