SQL服务器 - 在触发
问题描述:
设置权限,我有一个触发器的一部分,像这样 -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
被重写?
答
如何构造上述代码,以便如果dbo.isGlobalAdministrator(dbo.getCurrentUser())= 1时可以重写IF(@errMsg IS NOT NULL)?
当你说重写,我想你想绕过errormessage的
所以只添加这上面的错误消息
if (dbo.isGlobalAdministrator(dbo.getCurrentUser()) = 1)
return
你有一个问题,这里的整体结构。你假设在插入或删除的表中只有每一行都是单行的。不是这种情况。 –
我正在逆向工程当前的逻辑。据我所知,只有一行。整体触发基于何时插入,更新或删除单个记录 – whoisearth
您正在用非常脆弱的视角设计触发器。在sql服务器中,每个操作触发一次触发器,而不是每行触发一次。如果您需要执行一些维护并使用单个更新语句更新2行,则触发器逻辑将无法正常工作。 –