2016-02-12 106 views
0

設置權限,我有一個觸發器的一部分,像這樣 -SQL服務器 - 在觸發

DECLARE @isInsert TINYINT 

    SET @isInsert = (CASE @actionType WHEN 'I' THEN 1 ELSE 0 END) 

    SELECT 
     (CASE @isInsert WHEN 1 THEN i.groupId ELSE d.groupId END) AS groupId 
    INTO #tmpRecordPermissionsToCheck 
    FROM inserted i 
    FULL JOIN deleted d 
     ON i.userId = d.userId 
      AND 
      i.groupId = d.groupId 

-- Stop everything if the user is attempting to edit something they're not entitled to... 
-- special case(s): refer above for additional tblServer-specific checks required here 
    DECLARE @errMsg VARCHAR(255) 

    SELECT @errMsg = 'You do not have permission to edit permissions for group ' + IsNULL(ug.shortName, '') 
    FROM #tmpRecordPermissionsToCheck tmp 
    LEFT JOIN tblUserGroups ug 
     ON ug.groupId = tmp.groupId 
WHERE dbo.hasAdministrativePermissionsForGroup(tmp.groupId, dbo.getCurrentUser()) = 0 


    IF (@errMsg IS NOT NULL) 
    BEGIN 
     RAISERROR (@errMsg, 16, 1) 
     ROLLBACK TRANSACTION 
     RETURN 
    END 

我打電話一個單獨的函數返回一個0或1 bit值。

如果我做select dbo.isGlobalAdministrator(dbo.getCurrentUser())我得到一個1

如何組織上面的代碼,以便IF (@errMsg IS NOT NULL)可如果dbo.isGlobalAdministrator(dbo.getCurrentUser()) = 1被重寫?

+1

你有一個問題,這裏的整體結構。你假設在插入或刪除的表中只有每一行都是單行的。不是這種情況。 –

+0

我正在逆向工程當前的邏輯。據我所知,只有一行。整體觸發基於何時插入,更新或刪除單個記錄 – whoisearth

+0

您正在用非常脆弱的視角設計觸發器。在sql服務器中,每個操作觸發一次觸發器,而不是每行觸發一次。如果您需要執行一些維護並使用單個更新語句更新2行,則觸發器邏輯將無法正常工作。 –

回答

1

如何構造上述代碼,以便如果dbo.isGlobalAdministrator(dbo.getCurrentUser())= 1時可以重寫IF(@errMsg IS NOT NULL)?

當你說重寫,我想你想繞過errormessage的

所以只添加這上面的錯誤消息

if (dbo.isGlobalAdministrator(dbo.getCurrentUser()) = 1) 
return