2010-12-17 10 views
5

私たちは本番環境に移行しています。私はaspnet_regsqlで生成したスクリプトを実行した直後にDBAがロールを持つユーザーを作成できるスクリプトを作成したいと思います。開発環境では、Membership ProviderのAPIを使用してGlobal.asax.csにユーザーとロールを追加しています。しかし、私はこのハードコーディングされたアプローチを避けたい。今私のT-SQLのexprienceの欠如が表示されます。私は一度にすべてを実行しなければ動作する以下のスクリプトを書いた。SQLMembershipProviderのSQLでユーザーとロールを追加する方法は?

Use MyApps_Prod; 
GO 

DECLARE @user_identity CHAR(40); 
DECLARE @scalar_userid AS NVARCHAR(255); 
DECLARE @scalar_roleid AS NVARCHAR(255); 
DECLARE @app_id AS NVARCHAR(255); 
SET @user_identity = N'AMERICAS\First.Last'; 

SET @app_id = (SELECT DISTINCT ApplicationId 
      FROM [dbo].[aspnet_Applications] 
      WHERE loweredapplicationname = 'MyApplication'); 
SELECT * FROM [dbo].[aspnet_Users] WHERE UserName = @user_identity 

IF NOT EXISTS (SELECT * FROM [dbo].[aspnet_Users] WHERE UserName = @user_identity) 
BEGIN 
    INSERT INTO [dbo].aspnet_Users 
      ([ApplicationId], [UserName], [LoweredUserName], [LastActivityDate]) 
    VALUES 
     (@app_id, @user_identity, LOWER(@user_identity), GETDATE()); 
END; 

DECLARE @role_name CHAR(40); 
SET @role_name = N'Communicator'; 
IF NOT EXISTS (SELECT * FROM [dbo].[aspnet_Roles] WHERE RoleName = @role_name) 
BEGIN 
    INSERT INTO [dbo].[aspnet_Roles] 
     ([ApplicationId], [RoleName], [LoweredRoleName]) 
    VALUES 
     (@app_id, @role_name, LOWER(@role_name)) 
END; 


SET @scalar_userid = (SELECT DISTINCT UserID FROM [dbo].aspnet_Users WHERE UserName = @user_identity); 
SET @scalar_roleid = (SELECT DISTINCT RoleID FROM [dbo].aspnet_Roles WHERE RoleName = @role_name); 

INSERT INTO [dbo].aspnet_UsersInRoles (UserID, RoleID) 
    VALUES (
     @scalar_userid , 
     @scalar_roleid 
    ); 


SET @role_name = N'AccessAdministrator'; 
IF NOT EXISTS (SELECT * FROM [dbo].[aspnet_Roles] WHERE RoleName = @role_name) 
BEGIN 
    INSERT INTO [dbo].[aspnet_Roles] 
     ([ApplicationId], [RoleName], [LoweredRoleName]) 
    VALUES 
     (@app_id, @role_name, LOWER(@role_name)) 
END; 


SET @scalar_roleid = (SELECT DISTINCT RoleID FROM [dbo].aspnet_Roles WHERE RoleName = @role_name); 

INSERT INTO [dbo].aspnet_UsersInRoles (UserID, RoleID) 
    VALUES (
     @scalar_userid , 
     @scalar_roleid 
    ); 
GO 

私はセミコロンで各INSERTを終了した場合に動作するようにINSERTsを取得し、GOを追加できることを発見したが、その後、私は再宣言し、各変数を再割り当てする必要があります。

実際のSQL開発者はどのようにこれを行いますか?

+0

それ以外の場合は、v1のglobal.asaxに残してv2を削除します。 – Greg

答えて

10

aspnet_reg.exeツールを使用してアプリケーションサービスをインストールするときに、SqlMembershipProvider実装プロバイダの一部であるストアドプロシージャを手動で使用するのではなく、使用します。特に、使用の際に

  • aspnet_Roles_CreateRole(等々パスワード、セキュリティの質問と回答、および)ユーザーを作成し、彼の会員データを供給するための新しい役割に
  • aspnet_Membership_CreateUserを作成する
  • aspnet_UsersInRoles_AddUsersToRoles既存のユーザーを既存の役割に追加する

aspnet_Membership_CreateUserは、唯一の厄介なものです。プレーンテキストではないパスワードを格納していると仮定すると、ハッシュ化または暗号化されたバージョンを@Passwordパラメータを介してsprocに渡す必要があります。Reflectorを使用してSqlMembershipProviderクラスのコードCreateUser methodのコードを調べることをお勧めします。ここで、.NETがどのようにこのロジックをカバーしているかがわかります。

これをスクリプト化する代わりに、おそらくテキストファイルを読み取り、指定された役割、ユーザーおよびユーザー役割の関連付けを作成するコマンドラインプログラムを作成することを検討してください。このコマンドラインプログラムはMembership APIを直接使用するため、すべての低レベルの詳細を処理します。このコマンドラインプログラムは、ビルドまたは展開プロセスの一環として実行できます。

ハッピープログラミング!

+0

私はコマンドラインの提案が好きです。 – Greg

+0

これは魅力的に機能しました。ありがとう。 – Blanthor

2

SQLプロファイラを実行してハードコードされた実装を実行しようとしましたか?それは物事を実行するための正確な順序を示すはずです。

+0

私はそれに感謝します。 – Blanthor

+0

可能であれば、データベースに含まれているストアドプロシージャを使用する必要があります。プロファイラは、それらを使用する方法を示す必要があります。 – Greg

+0

+1これは大変お世話になりました。 – Blanthor

0

「実際のSQL開発者はどのようにこれを行いますか?」

ここは始まりです。 T-SQLは配列を直接サポートしていませんが、通常、テーブル変数をループとして扱い、コードを圧縮/再利用します。あなたの例では、それは大きな利点ではありません。しかし、もし10のrolenamesがあれば、それはそうです。

例:


DECLARE @roles TABLE (rolename CHAR(40)); 
INSERT @roles 
SELECT 'Communicator' 
UNION ALL 
SELECT 'AccessAdministrator'; 
DECLARE @rolename CHAR(40); 

--loop through the @roles table variable like it's an array 
WHILE (SELECT COUNT(*) FROM @roles) > 0 
    BEGIN 
    SELECT TOP 1 @rolename = rolename FROM @roles; 
    --Do something with the current rolename 
    SELECT @rolename; 
    DELETE @roles WHERE rolename = @rolename; 
    END 
0

スクリプトを経由して、それを作成する良いアイデアではありません。また、APIを使用している場合は手動で作成する必要があるとはっきりしません。既存のデータを移行しようとしましたか?

しかし、これが選択肢であれば、リフレクターツールを使用してメンバーシップ/ロールメソッドのコードを確認することをお勧めします。これらのAPIメソッドによってストアドプロシージャが実行される前に、web.configで設定したとおり、暗号化/ハッシング、適切なapplicationNameのピッキング、その他のいくつかのチェックが行われる可能性があるため、ストアドプロシージャを実行するだけでは不十分です。

ユーザーの詳細を挿入することができるため、これらのすべてを考慮してください。ただし、使用したい場合はAPIを使用するため、別の問題が発生する可能性があります。

関連する問題