0

( 「存在しない場合にユーザーを作成する」をエミュレートする場合の構文エラーとは関連していますが、これとは別のものです。)

MySQLで一般的/動的にユーザーを追加する (つまりsp_adduser、他の DBMS に含まれるシステム プロシージャをエミュレートする) 機能を実現することは可能ですか?

if [not] existsMySQL は次の構文をサポートしていません。 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 ;
4

1 に答える 1

0

申し訳ありませんが、あなたが db ユーザーについて話していることに気付きました。アプリケーション ユーザーではありません。

INSERT INTO ...... ON DUPLICATE KEY UPDATE ......=VALUE(.....)あなたはその声明が好きかもしれません。

私はそれを私の一般的な保存オブジェクトメソッドで使用します。これを使用すると、コミット後にユーザーが存在するかどうかを気にする必要はありません (そして最新の状態になります)。

于 2009-10-01T11:48:23.907 に答える