2017-01-28 62 views
0

目前我有三個存儲過程改變位SQL Server過程:上if語句

  1. 第一個將插入一個userIdroleId
  2. 第二個將刪除目標userIdroleId
  3. 三是應該更改列的位值的更新isShopper

userId是唯一的,但可以有多個角色。角色是「客戶」,「購物者」和「管理員」。當我插入「購物者」角色時,isShopper列的位值爲1,這是我想要的。

但是,當我從用戶中刪除「購物者」的角色時,位值保持爲1.我很好奇,當購物者角色被移除時,我會如何將購物者的位值更改回0。

插入過程:

ALTER proc [dbo].[Asp_Net_User_Role_Insert] 
    @UserId nvarchar (128), 
    @RoleId nvarchar (128) 
AS 
BEGIN 
    INSERT INTO [dbo].[AspNetUserRoles] ([UserId], [RoleId]) 
     SELECT 
      @UserId, @RoleId 
     WHERE 
      NOT EXISTS(SELECT UserId, RoleId 
         FROM AspNetUserRoles 
         WHERE RoleId = @RoleId 
         AND UserId = @UserId) 

    EXECUTE dbo.ProfileAccountInfos_Shopper_Update 
       @UserId, @RoleId 
END 

刪除程序:

ALTER proc [dbo].[Asp_Net_User_Role_Delete] 
    @UserId nvarchar (128), 
    @RoleId nvarchar (128) 
AS 
BEGIN 
    DELETE FROM [dbo].[AspNetUserRoles] 
    WHERE RoleId = @RoleId 
     AND UserId = @UserId 

    EXECUTE dbo.ProfileAccountInfos_Shopper_Update 
      @UserId, @RoleId   
END     

更新程序(標記在插入的結束和刪除)

ALTER proc dbo.ProfileAccountInfos_Shopper_Update 
    @IsShopper bit, 
    @UserId nvarchar (128), 
    @RoleId nvarchar(128) 
AS 
BEGIN 
    IF (@RoleId = '91e67659-0dcb-4171-bc76-78d18b1d1336') 
     AND @IsShopper = 0 
    BEGIN 
     UPDATE [dbo].[ProfileAccountInfos] 
     SET [DateModified] = getutcdate(), 
      [IsShopper] = 1 
     WHERE UserId = @UserId 
    END 
END 

回答

0

在步驟 「ProfileAccountInfos_Shopper_Update」 你有參數@IsShooper但您沒有傳遞該參數的值當您從「Asp_Net_User_Role_Delete」或「Asp_Net_User_Role_Insert」執行時。

如果您的RoleId值始終保持不變,那麼您可以在Asp_Net_User_Role_InsertAsp_Net_User_Role_Delete過程中確定@IsShopper的值,並將其傳遞給ProfileAccountInfos_Shopper_Update過程。 ProfileAccountInfos_Shopper_Update過程中不需要@RoleId參數。

所以ProfileAccountInfos_Shopper_Update將簡化如下。

ALTER proc dbo.ProfileAccountInfos_Shopper_Update 
    ,@UserId nvarchar (128) 
    ,@IsShopper BIT 
AS 
BEGIN 

    UPDATE [dbo].[ProfileAccountInfos] SET [DateModified] = getutcdate(),[IsShopper] = @IsShopper WHERE UserId = @UserI 
END 

程序Asp_Net_User_Role_Insert將改變如下。

ALTER proc [dbo].[Asp_Net_User_Role_Insert] 
    @UserId nvarchar (128), 
    @RoleId nvarchar (128) 
AS 
BEGIN 
    DECLARE @IsShoper BIT 

    SET @IsShopper = 0 

    INSERT INTO [dbo].[AspNetUserRoles] ([UserId], [RoleId]) 
    SELECT 
     @UserId, @RoleId 
    WHERE 
     NOT EXISTS(SELECT UserId, RoleId 
        FROM AspNetUserRoles 
        WHERE RoleId = @RoleId 
        AND UserId = @UserId) 

    IF (@RoleId = '91e67659-0dcb-4171-bc76-78d18b1d1336') -- If role being inserted is Shopper then mark user as a Shopper. 
    BEGIN 
     SET @IsShopper = 1 
    END 

    EXECUTE dbo.ProfileAccountInfos_Shopper_Update @UserId, @IsShopper 
END 

程序Asp_Net_User_Role_Insert將改變如下。

ALTER proc [dbo].[Asp_Net_User_Role_Delete] 
    @UserId nvarchar (128), 
    @RoleId nvarchar (128) 
AS 
BEGIN 
    DECLARE @IsShoper BIT 

    SET @IsShopper = 1 

    DELETE FROM [dbo].[AspNetUserRoles] WHERE RoleId = @RoleId AND UserId = @UserId 

    IF (@RoleId = '91e67659-0dcb-4171-bc76-78d18b1d1336') -- If role being deleted is Shopper then mark user as non-shopper. 
    BEGIN 
    SET @IsShopper = 0 
    END 

    EXECUTE dbo.ProfileAccountInfos_Shopper_Update @UserId, @IsShopper   
END 

您還可以避免有ProfileAccountInfos_Shopper_Update存儲過程。你可以把更新陳述在Asp_Net_User_Role_InsertAsp_Net_User_Role_Delete

+0

當使用你的答案我成功插入一個新的角色ID和用戶ID;然而,當我在列上使用delete proc時,'isShopping'不會返回到0. – Michael

+0

好吧..知道了......我錯過了刪除角色時使其成爲0的部分。我認爲在這種情況下,應該在插入和刪除存儲過程中決定IsShopper的值,並傳遞給更新存儲過程。更新的存儲過程不需要'@ RoleId'和If塊。它會有'@ IsShopper'參數。我會盡快更新我的答案。 –