2016-02-12 105 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