Sage Crm 權限原理分析
文字是11年寫的,貼出來共享一下,先來一張表結構圖:

一、區域。表名:【territories】
1、我們先來看看區域表的結構。

從圖中前面都是不能為空的字段,都是很重要的。來介紹一下這些字段:
Terr_territoryid: 這個字段就是區域碼
Terr_DBID:由于上面這個字段用來保存區域碼了,所以用這個來做表的id
Terr_Caption:區域碼的中文名稱,我們新建區域,只需要輸入這個就可以了。
Terr_ParentID:父區域的區域碼。如果是根區域的話,父區域為空。
Terr_RangeEnd:區域的范圍碼。具體含義下面會介紹。
Terr_NextRangeStart:下一個子區域的區域碼
Terr_ChildCount:該區域的直接子區域個數
Terr_Depth:該區域在區域樹中的層數。
2、系統對區域碼的分配機制(以下講解都是在系統默認情況下的)
在進一步解釋新建區域,系統往區域表插入記錄之前,必須先講講系統對區域碼的分配機制,這樣我們才能更加明白,系統對這個區域表的設計。
下面的內容比較理論,文件比較多,有興趣的話,慢慢看就明白了。
1) 從表的結構我們可以看到區域碼的數據類型是整型的。數據庫中int 類型的大小范圍是:-2147483648至2147483647。他們的總和剛好是2的32次方。
2) 系統在默認情況下是這樣設置區域的:
A,頂級區域的區域碼肯定是:-2147483640 ,所以只要大于這個數的區域都是他的子區域。
B, 系統會默認每個區域的子區域都是2的4次方個,即16個。這樣的話,讓我們看看我們的系統最終區域的劃分結果:
一,2 - 28 【268435454】
二、2 - 24 【16777216】
三、2 - 20 【1048576】
四、2 - 16 【65536】
五、2 - 12 【4096】
六、2 - 8 【256】
七、2 - 4 【16】
一表示第一個級子區域,他的上面就是頂級區域了。2的32次方分為16個子區域之后,每個子區域的范圍就是2的28次方,也就是 268435454。這樣一直遞減。
C,上面的分析,我們知道我們的系統一共可以分為8個級別,每個級別(頂級除外)可以有16個區域。16的8次方就是 2的32次方了。
3) C、看到這里,我們會問兩個問題:為什么是默認16呢?如果我的子公司不止16個或者我們的級別不止8個呢?
問題1:首先,16剛好是2的倍數,容易計算和劃分,可以最大限度的利用區域碼,其次,我覺得16 對于二進制的裝換有優勢。這些是我個人的看法而已??赡苁清e的。
問題2:當出現這種情況的時候,新建第15或者16個子區域的時候,系統會提示我們先平衡區域。我在252的crm 數據庫做了一次平衡。一共有95步,可能我們的表太多了。平衡的過程其實就是在重新選一個基數,擴大了子區域個數表大之后,級別的就會表小,調整之后,還要修復已有數據的區域碼。 其實一般的公司是很難達到這個數的。例如我們的國家:國家-省-市-縣-鎮-鄉 也才六個級別。假設每個省下面也是23個市。 23 的 6次方也沒有大于2的32次方。
3,數據庫的設計方面
有了上面的機制之后,再來看看數據庫表現。

如圖,
a) worldwide這個是頂級區域,所以他的父區域為0。而E總部的terr_parentid 就是 worldwide的區域碼了。新建區域的時候系統會要求我們選擇一個父區域的。
b)Terr_RangeEnd這個字段的值就是Terr_territoryid + 這個級別的區間的范圍基數了。
l 頂級區域當然是最大的區間 為-2147483648 + 2的32次方 = 2147483647
l E總部是二級區域所以 是 -1342177274 + 2的28次方 = -1073741820
l …………..
l 所以我們可以理解為:所有自己的子區域都是在 [Terr_territoryid,Terr_RangeEnd] 這兩個字段組成的區間之內的。
c) terr_caption 是新建時候的翻譯而已,不多說。
d)Terr_nextRangeStart 這個字段的意思是下一個子區域的區域碼,例如worldwide 只有一個子區域E總部,所以我們新建一個E總部的同級區域時,這個新區域的區域碼就是-805306364了。本來子區域的第一個區域的區域碼應該是父區域碼加1的,由于我們的E總部是在以前的基礎上刪改的,所以…。從留學中心之后你就可以看到了。Terr_nextRangeStart 這個字段不但告訴我們下一個子區域的區域碼,同時也是告訴我們本區域內的范圍的區間可以縮小為:[Terr_territoryid,Terr_NextRangeStart]。
e)Terr_ChildCount:該區域的直接子區域個數。留學中心暫時有13個分公司,所以他的直接子區域是13
f)Terr_Depth:該區域在區域樹中的層數。留學中心在第三層,但是數據庫從0開始,所以顯示為2。
g)這里還有一個字段要講一下的:terr_rangeincrement,這個字段記錄著子區域的 范圍基數如圖:

二、配置文件 【TerritoryProfiles】

只保存了基本信息而已。主要的配置信息保存在表【TerritoryPermissions】
三.配置信息【TerritoryPermissions】

這個配置表中保存了我們新建的配置文件的信息和直接權限的信息。每個配置文件,每個區域都會把所有的主要實體列出來給我們設置。 配置文件、區域和表就關聯起來了。
直接權限也一樣,要求我們要選一個區域,然后才添加用戶到這個區域,再設置表的權限。
直接權限和配置表的數據的區別就在于 usrt_userid 和 usrt_profileid。usrt_userid不為空就是直接權限的數據。usrt_profileid不為空就是配置文件。
四,使用實例
當用戶到機會模板的高級查找查詢數據時:
系統首先會找到登錄用戶的id 和 用戶表里面的 配置配置文件id。
然后到這個視圖去找登錄用戶的權限:
select * from dbo.vTerritoryPermissions where (usrt_userid = 630 or usrt_profileid = 10) and bord_tableid = 10167

上圖顯示了查詢結果是我在配置表中的一個直接權限 和 配置文件簽約顧問或客服中的四個區域的權限。
然后在去找機會表過濾數據。
五,權限的一些特殊應用例子
1,在某客戶的系統的管道圖,由于管道圖的sql 語句要用到group by 所以標準的findrecord滿足不了,所以出現了管道圖中的數據和列表的數據不一至。我是這樣做的:先用findrecord找出數據,然后把這些數據的id打包起來放到管道圖中sql 語句中限制范圍。
2,還是某客戶的系統,用戶需要把數據提交給數據所在區域的上一級區域的領導。這樣,我們就可以先找到這條數據的區域,然后在去找父級區域,再到配置表中找對應的區域的角色。在測試中,不生效,可能系統不容許查詢區域表,也有可能是生成腳本不支持而已,我會繼續測試。
為什么要去研究系統的權限,有什么作用?
可能大家未必會看,而且我水平有限,大家也未必看明白了。我們現在對標準功能越來越熟悉了,可是我想知其然,還要知其所以然。了解系統設計對我們理解系統的運作,理解系統的業務有比較大作用。對于遇到需要跳出系統標準功能來設計系統的時候,我們知道了系統的設計就不會那么的茫然,最起碼可以降低風險。
作者:Novus
出處:http://www.rzrgm.cn/novus/
本文版權歸作者和博客園共有,歡迎任何形式的轉載,但請務必注明出處。

浙公網安備 33010602011771號