2009-07-14 137 views
1

我的許多僱主應用程序共享一個類似的內部權限結構,用於將數據限制爲特定的一組用戶或組。組也可以嵌套。數據庫權限結構

我們目前使用這種方法面臨的問題是枚舉權限非常慢。當前方法使用具有許多遊標和臨時表的存儲過程。這對於較小的應用程序來說工作得很好,但我們現在有一個特定的系統正在快速增長,並且它開始放慢速度。

基本表結構如下;

tblUser {用戶ID,用戶名,WindowsLogonName}

tblGroup {的GroupID,名稱,說明,SystemFlag}

tblGroupGroup {GroupGroupID,名稱}

tblGroupUser {GroupUserID,Name,}

並將它們連接在一起;

tblPermission {PermissionID,SecurityObjectID,SecuredID,表名,AllowFlag}

包含行像..

'5255-5152-1234-5678', '{組的ID}' ,'{ID for something in tblJob}','tblJob',1

'4240-7678-5435-8774','{用戶的ID}','{用於tblJob中的東西}',' tblJob',1

'5434-2424-5244-5678','{組的ID'','{ID for在tblTask​​}','tblTask​​',0

當然,必須有一個更有效的方法來枚舉所有的組,並獲得安全行的ID?

使事情進一步複雜化;如果用戶明確拒絕訪問某一行,則這將否決任何組權限。這一切都在MSSQL中。

+0

您使用的是什麼版本的SQL服務器;有幾個建議,但他們依賴於SQL Server的版本。 看看更高負載應用程序中的最終權限,您可能能夠將支票拆分爲授予和拒絕您的選擇,這可能會簡化執行,因爲我習慣於在應用程序中看到比denys更多的授予。 – u07ch 2009-07-14 21:07:54

+0

SQL Server 2005.我在哪裏可以找到有關「更高負載應用程序」的信息? – 2009-07-15 08:08:58

回答

0

我猜測將tblPermission分解成幾個表是有用的:一個用於組和一個用戶。通過將組和用戶放在那裏,似乎會增加設計的複雜性(也許這就是爲什麼您需要存儲過程)。

如果您想要分解tblPermission表(類似於tblUserPermission和tblGroupPermission),但仍希望表示類似於tblPermission的表,您可以製作一個視圖,即union是來自這兩個表的數據。

希望這會有所幫助。你有存儲過程的例子嗎?

0

我認爲你可以使用Recursive公用表表達式(CTE)進行分層查詢。你可以找到很多例子,如果你搜索它。 This就是其中之一。

0

也許你的設計是好的,但實現/代碼是錯誤的。

的幾點思考:

  • 是否所有的ID列GUID?不建議使用Kimberley L Tripp article
  • 所有外鍵索引,或許與其他列鍵或INCLUDE
  • 定期維護?例如索引碎片,統計OT日期等
  • 是否所有的數據類型匹配(假定沒有FKS):數據類型的優先級和隱式轉換誤差

的蠕變現象,一些更多的架構信息和業績不佳的代碼示例可以幫助