這是我們擁有的數據庫模式。T-SQL Query將一組ResultSet與DB中的一組行相匹配,Group By columnId
t_RoleCombinations - 這些權限的所有可能的組合,一個角色可以有。
t_Permissions_Hierarchy - 這會強制執行權限。對於例如如果一個角色有權限Create
某些資源,它應該有權限到Edit
該資源,如果有權限到Edit
它應該有權限到View
。我們也有一個Share
權限,如果被分配,還應該強制執行View
權限。因此,如果角色具有Create
權限,則該權限也應具有View
,但可能沒有Share
權限。由於這種複雜性,我們無法通過t_Permissions中的ParentPermissionId列以樹視圖的方式實施層次結構,這就是爲什麼具有此t_PermissionHierarchy表。
t_RoleCombinations_Permissions - 這是映射表,它實際上定義了所有權限組合。
t_Permissions
表的樣本數據
t_PermissionsHierarchy
表
當客戶端更新的作用,我得到一組服務器上的樣本數據我需要與t之一匹配的權限他在t_RoleCombinations_Permissions
表中設置並得到RoleCombinationId
它在t_Roles
表中更新。在SP中通過參數傳遞逗號分隔的一組權限的逗號分隔值,並且如果需要,我可以通過類似於stated here的表值函數來記錄它。
UPDATE: -
-I在t_RoleCombinations創建VARCHAR(最大)列來存儲逗號分隔排序PermissionIds的思想。但這在關係數據庫中並不好。
- 我可以想到的聲明如下。但它不會工作,因爲IN
操作員檢查邏輯OR
而不是AND
。
SELECT RoleCombinationId from t_RoleCombinations_Permissions
WHERE PermissionId in (1,2,3,4,5) -- my comma saperated permissions
GROUP BY RoleCombinationId
HAVING Count(*) = 5 -- number of permissions specified.