データベースが存在する環境を (名前に基づいて) チェックし、アプリケーションに適切なユーザーとロールを作成するストアド プロシージャを作成したいと考えています。
これにより、環境間でデータベースを移動する場合に、アクセス許可の設定を自動化できます (現在、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 を生成できましたか? あるいは、ストアドプロシージャでこれを回避する方法はありますか?