BI數(shù)據(jù)權(quán)限解決方案_第1頁
BI數(shù)據(jù)權(quán)限解決方案_第2頁
BI數(shù)據(jù)權(quán)限解決方案_第3頁
BI數(shù)據(jù)權(quán)限解決方案_第4頁
BI數(shù)據(jù)權(quán)限解決方案_第5頁
已閱讀5頁,還剩3頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、BI數(shù)據(jù)分析是目前企業(yè)的熱門應(yīng)用,而對企業(yè)來說,權(quán)限控制是非常重要的,尤其是作為決策用的企業(yè)報(bào)表。目前基于微軟SQL Server體系的BI架構(gòu)為Integration Services + Analysis Service + Reporting Services,Integration Services和Analysis都屬于應(yīng)用后臺的服務(wù),不會在用戶前端展現(xiàn),其權(quán)限控制體系不在我們這篇文章的討論范圍內(nèi)(但是實(shí)現(xiàn)數(shù)據(jù)級權(quán)限控制,需要Analysis Services的參與)。而對于前端展示用的企業(yè)報(bào)表,權(quán)限控制體系分為2種:報(bào)表級權(quán)限和數(shù)據(jù)級權(quán)限。報(bào)表級權(quán)限較為簡單,主要用于控制誰能夠看這

2、個(gè)報(bào)表;數(shù)據(jù)級權(quán)限則比較復(fù)雜了,任何人看同一張報(bào)表,報(bào)表上的數(shù)據(jù)只能是他有權(quán)限查看的數(shù)據(jù)。簡單說,就是總經(jīng)理看到的數(shù)據(jù)和經(jīng)理看到的數(shù)據(jù)是不一樣的,雖然他們在看同一張報(bào)表。比較報(bào)表級權(quán)限和數(shù)據(jù)級權(quán)限,會發(fā)現(xiàn)如果實(shí)現(xiàn)了數(shù)據(jù)級權(quán)限的控制,那么企業(yè)報(bào)表是否需要進(jìn)行權(quán)限控制已經(jīng)不再重要(當(dāng)然,為了界面友好性,還是應(yīng)該控制下的)。 這篇文章主要就是講述基于SQL Server架構(gòu)的BI數(shù)據(jù)級權(quán)限的解決方案,這也是我給一個(gè)德國大型跨國企業(yè)客戶實(shí)施其BI項(xiàng)目中,對方非常重視的一個(gè)功能。這里先簡單介紹下這個(gè)客戶和項(xiàng)目,出于保密要求,我把該客戶叫做Customer S(簡稱CS,呵呵,不是那個(gè)游戲哦)。CS項(xiàng)目前

3、端采用Sharepoint,后臺采用SQL Server,主要分析客戶S的銷售數(shù)據(jù)。CS的組織結(jié)構(gòu)分為部門、區(qū)域;部門和區(qū)域是相互交叉的;某個(gè)部門的總部人員能夠看到全國所有區(qū)域的數(shù)據(jù);而區(qū)域員工則只能看到該區(qū)域的數(shù)據(jù)了。用戶能夠查看的數(shù)據(jù)權(quán)限,需要在網(wǎng)頁上可以進(jìn)行配置。這就是客戶對數(shù)據(jù)級權(quán)限的要求。針對這些需求,數(shù)據(jù)級權(quán)限解決方案采用如下架構(gòu):-報(bào)表查看流程說明:用戶查看報(bào)表 報(bào)表從Cube中獲取數(shù)據(jù) Cube從數(shù)據(jù)庫中(記錄用戶的數(shù)據(jù)權(quán)限配置)獲得訪問用戶的權(quán)限配置,根據(jù)配置返回相應(yīng)的數(shù)據(jù) 報(bào)表顯示結(jié)果數(shù)據(jù)數(shù)據(jù)權(quán)限配置流程說明:用戶訪問數(shù)據(jù)權(quán)限配置頁面(由于基于Sharepoint,因此是內(nèi)

4、嵌數(shù)據(jù)權(quán)限Webpart的Sharepoint頁面) 頁面獲取Cube結(jié)構(gòu)(由于Cube的結(jié)構(gòu)內(nèi)容很龐大,為了避免網(wǎng)頁響應(yīng)慢,一般通過ajax樹狀來展示其結(jié)構(gòu)) 用戶修改數(shù)據(jù)權(quán)限設(shè)置,并且保存到數(shù)據(jù)庫中說明:這里面進(jìn)行數(shù)據(jù)權(quán)限控制的對象為域帳號(可以為域用戶或者組)??v覽數(shù)據(jù)權(quán)限實(shí)現(xiàn)的這個(gè)流程,我們提取出中間幾個(gè)重要的實(shí)現(xiàn)具體講解解決方案,他們是:Cube中如何進(jìn)行權(quán)限控制 設(shè)置數(shù)據(jù)權(quán)限時(shí),如何讀取Cube結(jié)構(gòu)Cube中如何進(jìn)行權(quán)限控制SQL Server Analysis Services本身提供了一種設(shè)置Cube數(shù)據(jù)數(shù)據(jù)權(quán)限的機(jī)制。打開Analysis Services,我們可以看到“程序

5、集”和“角色”2個(gè)條目,他們就是和數(shù)據(jù)權(quán)限設(shè)置緊密相關(guān)的內(nèi)容了。如下圖所示:程序集:這是一個(gè)DLL類庫,通過Visual Studio中新建一個(gè)Class Library(類庫)來實(shí)現(xiàn)。主要作用是返回用戶能夠訪問的Cube數(shù)據(jù)。 角色:這是訪問用戶的角色。在這里面可以設(shè)置角色的用戶,更重要的是設(shè)置Cube調(diào)用哪個(gè)程序集來獲取用戶能夠訪問的數(shù)據(jù)。我們先來看DataSecurity.dll程序集。這個(gè)程序集的代碼其實(shí)很簡單,不會超過30行。其主要流程如下:1.讀取訪問用戶的數(shù)據(jù)權(quán)限設(shè)置 2.根據(jù)數(shù)據(jù)權(quán)限設(shè)置,返回一個(gè)能夠訪問的Dimension數(shù)據(jù)集MDX字符串 我們看看如下的主要代碼(這個(gè)類庫也

6、就只需要這樣一個(gè)CS文件):namespace BIpublic class DataSecuritypublic static string GetDimensionSet(string domain_account, string dimension)/ 方法的名字無所謂,參數(shù)比較重要/ domain_account:訪問用戶的帳號,后面我們會知道是從角色的設(shè)置中傳入/ dimension:是獲取哪個(gè)維度的數(shù)據(jù)。在角色里,需要對每一個(gè)維度進(jìn)行設(shè)置/return Location.City.&Seattle, 返回的結(jié)果示例SqlConnection connection = new Sql

7、Connection(connection_string);connection.Open();SqlCommand command = new SqlCommand(SP_Security_GetDimensionSetByLoginAccount, connection);command.CommandType = System.Data.CommandType.StoredProcedure;SqlParameter p1 = new SqlParameter(domain_account, domain_account);SqlParameter p2 = new SqlParamet

8、er(dimension, dimension);command.Parameters.Add(p1);command.Parameters.Add(p2);SqlDataReader reader = command.ExecuteReader();string result_set = string.Empty;int count = 0;while (reader.Read()count+;if (result_set != string.Empty) result_set += ,;result_set += (string)readerDimensionSet;command.Dis

9、pose();connection.Close();connection.Dispose();return + result_set + ;public DataSecurity()這個(gè)類庫的作用很簡單,拋開BI不談,其實(shí)他就調(diào)用了一個(gè)存儲過程,把返回結(jié)果做了一個(gè)字符串拼接,然后返回這個(gè)字符串。一般的返回結(jié)果會是大致如下:Location.City.&Seattle,這表示用戶在Location維度下只能夠看到Seattle的數(shù)據(jù),其他的城市數(shù)據(jù)都看不到。當(dāng)然如果是多個(gè)城市,那就是用逗號分隔的列表,比如:Location.City.&Seattle,Location.City.&Washing

10、ton。如上所示,字符串拼接很簡單,但是這些用戶能夠訪問的具體數(shù)據(jù)記錄在哪呢?這就是用戶在網(wǎng)頁上設(shè)置好數(shù)據(jù)權(quán)限,記錄在數(shù)據(jù)庫中的字符串了。在這里你要更清楚地話,就需要進(jìn)一步了解MDX,這不在這篇文章的討論范圍之內(nèi)。我們首先完成了第一步,結(jié)下來就是在角色設(shè)置里調(diào)用這個(gè)DataSecurity.dll類庫了。這個(gè)比較簡單,但是繁瑣,對于Cube中的每一個(gè)維度都需要手動設(shè)置。這個(gè)步驟根據(jù)如下的示意圖走就是了,沒有什么代碼工作。打開SecruityRole角色的屬性,進(jìn)入“維度數(shù)據(jù)”中就可以設(shè)置數(shù)據(jù)權(quán)限了。每一個(gè)需要控制數(shù)據(jù)權(quán)限的維度和屬性都需要設(shè)置下,基本上設(shè)置為一條語句:StrtoSet(BI.D

11、ataSecurity.GetDimensionSet(USERNAME, City)對這個(gè)語句解釋下:StrtoSet是將字符串轉(zhuǎn)換為MDX里的數(shù)據(jù)集。USERNAME是訪問者的域帳號,City則為我們自定義的參數(shù),表示要獲取City屬性維度的授權(quán)數(shù)據(jù)。到了這里,我們已經(jīng)完成了很重要的一步,數(shù)據(jù)權(quán)限的主體已經(jīng)實(shí)現(xiàn)了。但是對于用戶來說,他需要有一個(gè)前端界面來設(shè)置這些數(shù)據(jù)權(quán)限。下面的內(nèi)容就是為了解決這個(gè)問題,不過這里,我只挑出最重要的部分,讀取Cube結(jié)構(gòu)來講,其他的部分你完全可以自己設(shè)計(jì)。在CS這個(gè)項(xiàng)目中,我們是做了如下工作:所有的設(shè)置界面都是Sharepoint Webpart(請參見相關(guān)內(nèi)

12、容) Webpart中的ajax(這個(gè)要單獨(dú)拿出來說,是因?yàn)檫@個(gè)部分比較麻煩),需要用到ajax的原因就是Cube的結(jié)構(gòu)是很大的,如果一次性讀出來,肯定是等到花兒也謝了,相信沒有人會用他。 后臺可以控制哪些維度需要設(shè)置數(shù)據(jù)權(quán)限(有些維度不需要設(shè)置數(shù)據(jù)權(quán)限,那么就不讓他在ajax樹中展示出來了) 有自定義的角色,這個(gè)角色不同于剛才講的Cube中的角色。這是用戶自己定義的數(shù)據(jù)權(quán)限角色,剛才的角色只需要那一個(gè)就足夠了。 有了角色自然有搜索、設(shè)置用戶、設(shè)置角色的數(shù)據(jù)權(quán)限、編輯、刪除這個(gè)都可以根據(jù)你的需要進(jìn)行設(shè)計(jì),不一定要完全相同,就比如我用了ajax樹來展示Cube結(jié)構(gòu),但是你可以采用別的方式。下面我

13、們就進(jìn)入下一個(gè)重要話題,就是讀取Cube的結(jié)構(gòu)(其實(shí)在讀取這個(gè)結(jié)構(gòu)本身,前面的數(shù)據(jù)權(quán)限就已經(jīng)開始起作用了,沒有權(quán)限訪問的數(shù)據(jù)不會出現(xiàn)在ajax樹中)。設(shè)置數(shù)據(jù)權(quán)限時(shí),如何讀取Cube結(jié)構(gòu)讀取Cube的結(jié)構(gòu),微軟已經(jīng)提供了一套非常豐富的類庫給我們。這里就簡單介紹下,如果你在具體實(shí)現(xiàn)過程中遇到了問題,相信上Google是一個(gè)最好的辦法。下面我們介紹讀取Cube結(jié)構(gòu)的具體內(nèi)容,首先就是連上你的Cube。這主要通過如下語句完成。AdomdConnection adomdConnection = new AdomdConnection();adomdConnection.ConnectionString

14、 = “Data Source=localhost;Catalog=MyCube;”;adomdConnection.Open();/ 這里讀取具體的Cube結(jié)構(gòu)adomdConnection.Close();adomdConnection.Dispose();在連上Cube之后,通過adomdConnection可以讀取整個(gè)Cube了。主要涉及到如下內(nèi)容:Cube:CubeDef cube = adomdConnection.Cubes“MyCubeName”; Dimension:cube.Dimensions,這里面是所有的Dimension。 Hierarchy:dimension.Hierarchies,所有的層次 Member:hierarchy.Levels0.GetMembers(),所有成員通過以上幾個(gè)內(nèi)容就可以把整個(gè)Cube的結(jié)構(gòu)完全展現(xiàn)出來,有了他們,

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論