(Связано с, но отдельно от Синтаксическая ошибка с эмуляцией "создать пользователя, если не существует" .
Возможно ли реализовать функциональность общего/динамического добавления пользователя (то есть эмуляции системной процедуры 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 ;
О, извините, я только что помахал, вы говорите о пользователях db. а не для пользователей приложений.
Вам может потребоваться инструкция INSERT INTO ...... ON DUPLICATE KEY UPDATE ......=VALUE(.....)
.
Я использую это в моем общем методе объектов сохранения, используя это, мне не нужно заботиться о том, существует ли пользователь или нет, он будет там (и обновлен) после того, как я совершу.