3

データベースが存在する環境を (名前に基づいて) チェックし、アプリケーションに適切なユーザーとロールを作成するストアド プロシージャを作成したいと考えています。

これにより、環境間でデータベースを移動する場合に、アクセス許可の設定を自動化できます (現在、Windows Azure SQL データベースの制限により、スクリプトを手動で実行する必要がありますが、これは理想的ではなく、人的エラーが発生しやすいものです)。

したがって、使用している構文は次のとおりです。

DECLARE @UserToAdd VARCHAR(50) = (
    SELECT  CASE 
            WHEN @Environment = 'Development' THEN 'DevelopmentApplicationUser'
            WHEN @Environment = 'Test' THEN 'TestingApplicationUser'
            ELSE ''
        END
)

IF (@UserToAdd != '')
BEGIN
    EXEC ('CREATE USER [' + @UserToAdd + '] FOR LOGIN [' + @UserToAdd + '];')

    EXEC ('EXEC sp_addrolemember N''WebUser'', N''' + @UserToAdd + ''';')
END

これは開発サーバー (SQL Server 2008 R2) では正しく機能しますが、Windows Azure SQL データベースでは次のエラーが発生します。

CREATE USER ステートメントは、バッチ内の唯一のステートメントでなければなりません

現在、MSDN のドキュメントには次のように記載されています。

CREATE USER ステートメントが SQL バッチ内の唯一のステートメントである場合、Windows Azure SQL データベースは FOR | ステートメントをサポートします。FROM LOGIN 句。CREATE USER ステートメントが SQL バッチ内の唯一のステートメントではない場合、または動的 SQL で実行される場合、FOR | FROM LOGIN 句はサポートされていません。

ただし、これは、アクセス許可をまったく自動化できないことを意味します。

誰かがこの問題を回避し、ユーザーを作成する動的 SQL を生成できましたか? あるいは、ストアドプロシージャでこれを回避する方法はありますか?

4

2 に答える 2

2

これが可能かどうかを確認するために Microsoft にサポート ケースを開いたところ、ログインまたはユーザーの存在を確認してからそのログインまたはユーザーを作成する場合は、確認とその後に別の接続を使用する必要があるという回答がありました。創造。同じトランザクションまたはバッチ内に存在しない場合、確認して作成することはできません。SQL Azure で。

Hth、オリ

于 2013-12-04T11:34:51.087 に答える
1

私はここで訂正の下で話します。FOR LOGIN なしでユーザーを作成してから、sp_change_users_login を使用してユーザーをログインにマップすることができます。

于 2013-10-30T09:18:04.450 に答える