2017-11-17 11 views
1

シナリオ私は、ユーザーが他のユーザーに役割を割り当てるときから取得していますこのDataTableを持って挿入レコード

enter image description here

上記の表では、ユーザーmushtaqに新しい役割を割り当て、以下の手順でデータベースに挿入します。以下は

ALTER PROCEDURE [dbo].[SP_ROLE_ASSIGNMENT_ASSIGN_ROLES_TO_USER] 
    @RoleAssignmentDT _ROLEASSIGNMENTSCHEMA ReadOnly 
AS 
BEGIN TRY 
BEGIN TRANSACTION 
    IF EXISTS (SELECT Role_ID 
       FROM Role_Assignment RA 
       INNER JOIN @RoleAssignmentDT t ON t._Role_ID = Ra.Role_ID 
               AND RA.Username = t._Username) 
    BEGIN 
     UPDATE Role_Assignment 
     SET Role_Assign = 0, 
      Modified_By_ID = t._Modified_By_ID, 
      Modified_Date = GETDATE() 
     FROM @RoleAssignmentDT t 
     WHERE Role_Assignment.Role_ID <> t._Role_ID 
      AND Role_Assignment.Username = t._Username 
      AND (t._Role_Assign = 1 AND Role_Assignment.Role_Assign = 1) 

     UPDATE Role_Assignment 
     SET Role_Assign = t._Role_Assign, 
      Modified_By_ID = t._Modified_By_ID, 
      Modified_Date = GETDATE() 
     FROM @RoleAssignmentDT t 
     WHERE Role_Assignment.Role_ID = t._Role_ID 
      AND Role_Assignment.Username = t._Username 
    END 
    ELSE 
    BEGIN 
     INSERT INTO Role_Assignment (Role_ID, Username, Role_Assign, Prepared_By_ID, Prepared_Date) 
      SELECT 
       t._Role_ID, t._Username, t._Role_Assign, t._Prepared_By_ID, GETDATE() 
      FROM 
       @RoleAssignmentDT t 
    END 

    COMMIT TRAN -- Transaction Success! 
END TRY 
BEGIN CATCH 
    IF @@TRANCOUNT > 0 
     ROLLBACK TRAN --RollBack in case of Error 

-- you can Raise ERROR with RAISEERROR() Statement including the details of the exception 
--RAISERROR('No Record Inserted, Contact to administrator',16,1) 
    DECLARE @Msg NVARCHAR(MAX) 
    SELECT @Msg=ERROR_MESSAGE() 
    RAISERROR('Error Occured: %s', 20, 101,@msg) WITH LOG 
END CATCH 

私は手続き上の他のユーザに新しい役割を割り当てる場合にのみ、ユーザーahmerを更新し、私のSQL Role_Assignmentテーブルのスキーマ今

enter image description here

です。私のプロシージャがデータテーブルを取得すると、IF条件が実行され、ユーザahmerが見つかり、それを更新します。私はチェックして、SQL ServerテーブルRole_Assignmentに存在するユーザーのみを更新するストアドプロシージャをしたい

を欲しい

。存在しない場合は、最初に挿入します。

私は現在の問題について簡単な情報を提供していると思います。私のストア手順で何を修正する必要があるのか​​を教えてください。最初に気象ユーザーが存在するかどうかを確認してください。前に存在しなかった人はそれを挿入し、存在する他の人を更新します。

答えて

0

ストアドプロシージャ

MERGE Role_Assignment ra 
    USING @RoleAssignmentDT t 
    ON Role_Assignment.Username = t._Username 
    WHEN MATCHED AND 
     Role_Assignment.Role_ID <> t._Role_ID 
    and (t._Role_Assign = 1 and Ra.Role_Assign = 1) THEN 
     UPDATE 
     Set Role_Assign = 0, Modified_By_ID = t._Modified_By_ID, Modified_Date = GETDATE() 
     From @RoleAssignmentDT 
    WHEN MATCHED AND 
    Role_Assignment.Role_ID = t._Role_ID THEN 
     UPDATE 
     Set Role_Assign = t._Role_Assign, Modified_By_ID = t._Modified_By_ID, Modified_Date = GETDATE() 
     From @RoleAssignmentDT 
    WHEN NOT MATCHED BY TARGET THEN 
     Insert (Role_ID,Username,Role_Assign,Prepared_By_ID,Prepared_Date) 
     VALUES (t._Role_ID, t._Username, t._Role_Assign, t._Prepared_By_ID, GETDATE()); 
であなたのT-SQLコードの代わりに、以下のことを試してみてください