1. 程式人生 > >C#通過AMO物件模型瀏覽SQL SERVER 2005 SSAS角色一例

C#通過AMO物件模型瀏覽SQL SERVER 2005 SSAS角色一例

用過SSAS的朋友都使用Visual Studio Business Intelligence Development Studio(BIDS)去建立以及管理所建立的Cube。但是如果只是想檢視Cube下的某個角色包含的使用者以及許可權,我們只能一遍遍的開啟BIDS,忍受它的慢動作。更有甚者,如果要比較兩個Cube下所有角色及使用者是否一致,手工操作更是會讓人頭大。現在,利用Microsoft提供的AMO物件模型,我們可以很輕鬆的對Cube進行程式設計訪問,根據自身工作的需求,實在一些有用的工具,以提高工作效率,避免無聊的手工重複勞動。 

Analysis Management Objects (AMO) 

SQL Server SSAS的物件模型庫,通過它可以方便的對SSAS裡的物件進行訪問及控制,包括Cube, DataSource, DataSourceView, Partition, Measure, Dimension, Assembly, Role以及Data Mining物件等。要使用它,必須在機器上找到SSAS的安裝路徑..\Microsoft SQL Server\90\SDK\Assemblies,把目錄中的Microsoft.AnalysisServices.Dll檔案載入到專案的Reference列表中,AMO物件就是通過這個Dll檔案進行訪問的。

  需要說明的一點是,
AMO物件不能用來獲取Cube中的資料,如果想要進行資料查詢,則需要使用ADOMD.Net (Microsoft.AnalysisServices.AdomdClient).

下面,我們就簡要介紹一下如何利用AMO物件來訪問Cube。在把Microsoft.AnalysisServices.Dll載入到專案的引用以後,在程式碼中我們需要引入名稱空間:

using Microsoft.AnalysisServices


在此名稱空間下,我們首先引入
SSASServer物件,並建立連線: 

String connectstring = “Data Source = ServerName;Provider
=msolap”;
Server ssasServer 
= New Server();
ssasServere.Connect(connectstring);

與SSAS的伺服器例項建立連線以後,我們要取得它的所有Database物件名稱:

複製程式碼 staticpublic List<string> GetDatabaseCollection()
    {
        List
<string> collect =new List<string>();
        
foreach (Database db in server.Databases)
        {
            collect.Add(db.Name);
        }
        
return collect;         
}
複製程式碼

請注意,AMO中的Database物件並不是一般意義上的資料庫,而是一個容器,可以簡單的理解為我們的一個Business Intelligence專案就是一個Database容器,在Database物件內容,包括了BI專案中的所有內容 (Cube, dimension, data mining structure, data source, account, role) 。

接下來,根據所選擇的Database來獲得它的Cube物件,因為在一個Database(一個BI專案中),我們可以建立多個Cube,所以在此先取得所有Cube的列表:

複製程式碼 staticpublic List<string> GetCubeCollection(string databasename)
    {
        List
<string> collect =new List<string>();
        database 
= server.Databases[databasename];
        
foreach (Cube cube in database.Cubes)
        {
            collect.Add(cube.Name);
        }
        
return collect;
}
複製程式碼

Cube物件中,我們可以取得CubePermission物件,角色Role就在CubePermission中,從這裡就可以獲得指定Cube下所有的角色名稱列表:

複製程式碼 staticpublic List<string> GetCubePermission(string cubename)
    {
        List
<string> collect =new List<string>();
        cube 
= database.Cubes[cubename];
        
foreach (CubePermission cp in cube.CubePermissions)
        {
            collect.Add(cp.Role.Name);
        }
        
return collect;
    }
複製程式碼

 到這裡,我們其實就滿足了基本需求,可以很輕鬆地得到Cube下的角色列表,但是不同角色針對DimensionAttribute其實是擁有不同的訪問許可權。

複製程式碼 foreach (CubeDimensionPermission dp in cp.DimensionPermissions)
{
  
foreach (AttributePermission ap in dp.AttributePermissions)
   {
    Label1.Text 
= ap.AllowedSet;
    Label2.Text 
= ap.DeniedSet;
    }
}
複製程式碼

利用CubeDimensionPermission下的AttributePermission物件,我們可以得到當前角色的允許和拒絕的維度屬性值,得到了這個值,我們可以直接程式設計來檢查兩個Cube中的角色是否一致。

上面只是簡單介紹了利用AMO物件進行SSAS伺服器物件管理的一個例子,其實大家可以盡情發揮,利用AMO物件實現一些實用的工具來幫忙日常工作中對於SSAS的便捷管理。

附:AMO物件樹