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
被重寫?
你有一個問題,這裏的整體結構。你假設在插入或刪除的表中只有每一行都是單行的。不是這種情況。 –
我正在逆向工程當前的邏輯。據我所知,只有一行。整體觸發基於何時插入,更新或刪除單個記錄 – whoisearth
您正在用非常脆弱的視角設計觸發器。在sql服務器中,每個操作觸發一次觸發器,而不是每行觸發一次。如果您需要執行一些維護並使用單個更新語句更新2行,則觸發器邏輯將無法正常工作。 –