1 回答

TA贡献2003条经验 获得超2个赞
由于您以多维数据集为例,这意味着您正在使用多维模型而不是表格。
SSAS 数据目录内容层次结构
使用 SSAS 构建多个多维立方体后,我可以假设以下树是数据目录层次结构:
|- Data Directory
|- Database (.db)
|- Dimension (.dim)
|- Role (.role)
|- Mining Structure (.dms)
|- Data Source (.ds)
|- Data Source View (.dsv)
|- Multidimensional Cube (.cub)
|- Measure Group (.det)
|- Partition (.prt)
|- AggregationDesign (.agg)
上面树中的每个对象都可以以目录或/和 XML 文件的形式存储。
操作和 Kpis 信息存储在多维数据集 XML 配置文件中。
例子:
对象:立方体
目录:
<DataDir>\<database>\<cube ID>.cub\
XML文件:
<DataDir>\<database>\<cube ID>.cub.xml
将 SSAS AMO 对象链接到数据目录文件
使用 AMO 读取数据
为了从部署的 Analysis Cube 中读取 SSAS 对象,我改进了以下项目的代码以添加更多对象并将它们与相关目录/文件链接起来。
更新方法
要将每个 AMO 对象映射到相关的目录/XML 文件,我们必须从顶层(数据库)开始遍历对象并检索在每个级别中找到的文件/目录,并使用 .ID 属性和扩展名(如上面的树)
以下代码是用 C# 编写的,它是上面链接中发布的方法的更新版本:
请注意,该方法仅适用于本地服务器,或者您必须具有与包含数据目录的原始驱动器相同盘符的映射网络驱动器。此外,您必须具有访问分析服务器对象的权限
该代码被视为概念证明,可以改进
SSAS对象类
public class SSASObject
{
public enum ObjectType{
Cube = 0,
MeasureGroup = 1,
Dimension = 2,
Partition = 3,
AggregationDesign = 4,
MiningStructure = 5,
Role = 6,
DataSource = 7,
DataSourceView = 8,
Database = 9,
Server = 10,
Kpi = 11,
Action = 12
}
public int ID { get; set; } //incremental ID
public int? ParentID { get; set; } // Parent incremental ID
public ObjectType Type { get; set; } // The Object type
public string ObjectID { get; set; } // Object ID defined in SSAS
public string ObjectName { get; set; } // Object Name defined in SSAS
public string Extension { get; set; } // The Object extension
public string FolderPath { get; set; } // The Object related directory
public string FolderName { get; set; } // The directory name
public DateTime? FolderModifiedDate { get; set; } // The directory last modified date
public string FolderIncremetalID { get; set; } // The Incremental Number mentioned in the directory name
public string XMLFilePath { get; set; } // The Object related XML file
public string XMLFileName { get; set; } // The XML file name
public DateTime? XmlModifiedDate { get; set; } // The XML file last modified date
public string XmlIncremetalID { get; set; } // The incremental number mentioned in the XML file name
}
SSASAMO级
public static class SSASAMO
{
public static List<SSASObject> ReadMeta(string ServerName)
{
try
{
List<SSASObject> result = new List<SSASObject>();
String ConnStr;
DateTime? dt = null;
int idx = 0;
int DbID = 0;
int CubeID = 0;
int ObjectID = 0;
string DataDir;
string OLAPServerName = ServerName;
ConnStr = "Provider=MSOLAP;Data Source=" + OLAPServerName + ";";
Server OLAPServer = new Server();
OLAPServer.Connect(ConnStr);
DataDir = OLAPServer.ServerProperties["DataDir"].Value;
string[] DatabasesDir = System.IO.Directory.GetDirectories(DataDir, "*", System.IO.SearchOption.TopDirectoryOnly);
string[] DatabasesFiles = System.IO.Directory.GetFiles(DataDir, "*", System.IO.SearchOption.TopDirectoryOnly);
result.Add(new SSASObject
{
ID = idx,
ParentID = null,
FolderModifiedDate = System.IO.Directory.GetLastWriteTime(DataDir),
FolderPath = DataDir,
ObjectName = OLAPServerName,
Type = SSASObject.ObjectType.Server
});
// Database
foreach (Database OLAPDatabase in OLAPServer.Databases)
{
string CurrentDbDir = DatabasesDir.Where(x => x.StartsWith(DataDir + "\\" + OLAPDatabase.ID.ToString() + ".") && x.EndsWith(".db")).DefaultIfEmpty("").First();
string CurrentDbXmlFile = DatabasesFiles.Where(x => x.StartsWith(DataDir + "\\" + OLAPDatabase.ID.ToString() + ".") && x.EndsWith(".db.xml")).DefaultIfEmpty("").First();
string[] DbObjectsDir = System.IO.Directory.GetDirectories(CurrentDbDir, "*", System.IO.SearchOption.TopDirectoryOnly);
string[] DbObjectsFiles = System.IO.Directory.GetFiles(CurrentDbDir, "*", System.IO.SearchOption.TopDirectoryOnly);
idx++;
DbID = idx;
result.Add(new SSASObject
{
ID = idx,
ParentID = 0,
ObjectID = OLAPDatabase.ID,
FolderModifiedDate = CurrentDbDir == "" ? dt : System.IO.Directory.GetLastWriteTime(CurrentDbDir),
XmlIncremetalID = System.IO.Path.GetFileNameWithoutExtension(
System.IO.Path.GetFileNameWithoutExtension(CurrentDbXmlFile)).Substring(
System.IO.Path.GetFileNameWithoutExtension(CurrentDbXmlFile).IndexOf(".") + 1),
Extension = ".db",
FolderName = System.IO.Path.GetFileName(CurrentDbDir),
FolderPath = CurrentDbDir,
ObjectName = OLAPDatabase.Name,
Type = SSASObject.ObjectType.Database,
XMLFileName = System.IO.Path.GetFileName(CurrentDbXmlFile),
XMLFilePath = CurrentDbXmlFile,
XmlModifiedDate = CurrentDbXmlFile == "" ? dt : System.IO.File.GetLastWriteTime(CurrentDbXmlFile),
FolderIncremetalID = System.IO.Path.GetFileNameWithoutExtension(CurrentDbDir).Substring(
System.IO.Path.GetFileNameWithoutExtension(CurrentDbDir).IndexOf(".") + 1)
});
//Data Source
foreach (DataSource OLAPDataSource in OLAPDatabase.DataSources)
{
idx++;
string CurrentDataSourceDir = DbObjectsDir.Where(x => x.StartsWith(CurrentDbDir + "\\" + OLAPDataSource.ID.ToString() + ".") && x.EndsWith(".ds")).DefaultIfEmpty("").First();
string CurrentDataSourceXmlFile = DbObjectsFiles.Where(x => x.StartsWith(CurrentDbDir + "\\" + OLAPDataSource.ID.ToString() + ".") && x.EndsWith(".ds.xml")).DefaultIfEmpty("").First();
result.Add(new SSASObject
{
ID = idx,
ParentID = DbID,
ObjectID = OLAPDataSource.ID,
FolderModifiedDate = CurrentDataSourceDir == "" ? dt : System.IO.Directory.GetLastWriteTime(CurrentDataSourceDir),
XmlIncremetalID = System.IO.Path.GetFileNameWithoutExtension(
System.IO.Path.GetFileNameWithoutExtension(CurrentDataSourceXmlFile)).Substring(
System.IO.Path.GetFileNameWithoutExtension(CurrentDataSourceXmlFile).IndexOf(".") + 1),
Extension = ".ds",
FolderName = System.IO.Path.GetFileName(CurrentDataSourceDir),
FolderPath = CurrentDbDir,
ObjectName = OLAPDataSource.Name,
Type = SSASObject.ObjectType.DataSource,
XMLFileName = System.IO.Path.GetFileName(CurrentDataSourceXmlFile),
XMLFilePath = CurrentDataSourceXmlFile,
XmlModifiedDate = CurrentDataSourceXmlFile == "" ? dt : System.IO.File.GetLastWriteTime(CurrentDataSourceXmlFile),
FolderIncremetalID = System.IO.Path.GetFileNameWithoutExtension(CurrentDataSourceDir).Substring(
System.IO.Path.GetFileNameWithoutExtension(CurrentDataSourceDir).IndexOf(".") + 1)
});
}
//Data Source View
foreach (DataSourceView OLAPDataSourceView in OLAPDatabase.DataSourceViews)
{
idx++;
string CurrentDataSourceViewDir = DbObjectsDir.Where(x => x.StartsWith(CurrentDbDir + "\\" + OLAPDataSourceView.ID.ToString() + ".") && x.EndsWith(".dsv")).DefaultIfEmpty("").First();
string CurrentDataSourceViewXmlFile = DbObjectsFiles.Where(x => x.StartsWith(CurrentDbDir + "\\" + OLAPDataSourceView.ID.ToString() + ".") && x.EndsWith(".dsv.xml")).DefaultIfEmpty("").First();
result.Add(new SSASObject
{
ID = idx,
ParentID = DbID,
ObjectID = OLAPDataSourceView.ID,
FolderModifiedDate = CurrentDataSourceViewDir == "" ? dt : System.IO.Directory.GetLastWriteTime(CurrentDataSourceViewDir),
XmlIncremetalID = System.IO.Path.GetFileNameWithoutExtension(
System.IO.Path.GetFileNameWithoutExtension(CurrentDataSourceViewXmlFile)).Substring(
System.IO.Path.GetFileNameWithoutExtension(CurrentDataSourceViewXmlFile).IndexOf(".") + 1),
Extension = ".dsv",
FolderName = System.IO.Path.GetFileName(CurrentDataSourceViewDir),
FolderPath = CurrentDbDir,
ObjectName = OLAPDataSourceView.Name,
Type = SSASObject.ObjectType.DataSourceView,
XMLFileName = System.IO.Path.GetFileName(CurrentDataSourceViewXmlFile),
XMLFilePath = CurrentDataSourceViewXmlFile,
XmlModifiedDate = CurrentDataSourceViewXmlFile == "" ? dt : System.IO.File.GetLastWriteTime(CurrentDataSourceViewXmlFile),
FolderIncremetalID = System.IO.Path.GetFileNameWithoutExtension(CurrentDataSourceViewDir).Substring(
System.IO.Path.GetFileNameWithoutExtension(CurrentDataSourceViewDir).IndexOf(".") + 1)
});
}
//Dimension
foreach (Dimension OLAPDimension in OLAPDatabase.Dimensions)
{
idx++;
string DimensionDir = DbObjectsDir.Where(x => x.StartsWith(CurrentDbDir + "\\" + OLAPDimension.ID.ToString() + ".") && x.EndsWith(".dim")).DefaultIfEmpty("").First();
string DimensionXmlFile = DbObjectsFiles.Where(x => x.StartsWith(CurrentDbDir + "\\" + OLAPDimension.ID.ToString() + ".") && x.EndsWith(".dim.xml")).DefaultIfEmpty("").First();
result.Add(new SSASObject
{
ID = idx,
ParentID = DbID,
ObjectID = OLAPDimension.ID,
FolderModifiedDate = DimensionDir == "" ? dt : System.IO.Directory.GetLastWriteTime(DimensionDir),
XmlIncremetalID = System.IO.Path.GetFileNameWithoutExtension(
System.IO.Path.GetFileNameWithoutExtension(DimensionXmlFile)).Substring(
System.IO.Path.GetFileNameWithoutExtension(DimensionXmlFile).IndexOf(".") + 1),
Extension = ".dim",
FolderName = System.IO.Path.GetFileName(DimensionDir),
FolderPath = DimensionDir,
ObjectName = OLAPDimension.Name,
Type = SSASObject.ObjectType.Dimension,
XMLFileName = System.IO.Path.GetFileName(DimensionXmlFile),
XMLFilePath = DimensionXmlFile,
XmlModifiedDate = DimensionXmlFile == "" ? dt : System.IO.File.GetLastWriteTime(DimensionXmlFile),
FolderIncremetalID = System.IO.Path.GetFileNameWithoutExtension(DimensionDir).Substring(
System.IO.Path.GetFileNameWithoutExtension(DimensionDir).IndexOf(".") + 1)
});
}
// Cube
foreach (Cube OLAPCubex in OLAPDatabase.Cubes)
{
idx++;
CubeID = idx;
string CubeDir = DbObjectsDir.Where(x => x.StartsWith(CurrentDbDir + "\\" + OLAPCubex.ID.ToString() + ".") && x.EndsWith(".cub")).DefaultIfEmpty("").First();
string CubeXmlFile = DbObjectsFiles.Where(x => x.StartsWith(CurrentDbDir + "\\" + OLAPCubex.ID.ToString() + ".") && x.EndsWith(".cub.xml")).DefaultIfEmpty("").First();
string[] CubeMeasureGroupsDir = System.IO.Directory.GetDirectories(CubeDir, "*", System.IO.SearchOption.TopDirectoryOnly);
string[] CubeMeasureGroupsFiles = System.IO.Directory.GetFiles(CubeDir, "*", System.IO.SearchOption.TopDirectoryOnly);
result.Add(new SSASObject
{
ID = idx,
ParentID = DbID,
ObjectID = OLAPCubex.ID,
FolderModifiedDate = CubeDir == "" ? dt : System.IO.Directory.GetLastWriteTime(CubeDir),
XmlIncremetalID = System.IO.Path.GetFileNameWithoutExtension(
System.IO.Path.GetFileNameWithoutExtension(CubeXmlFile)).Substring(
System.IO.Path.GetFileNameWithoutExtension(CubeXmlFile).IndexOf(".") + 1),
Extension = ".cub",
FolderName = System.IO.Path.GetFileName(CubeDir),
FolderPath = CubeDir,
ObjectName = OLAPCubex.Name,
Type = SSASObject.ObjectType.Cube,
XMLFileName = System.IO.Path.GetFileName(CubeXmlFile),
XMLFilePath = CubeXmlFile,
XmlModifiedDate = CubeXmlFile == "" ? dt : System.IO.File.GetLastWriteTime(CubeXmlFile),
FolderIncremetalID = System.IO.Path.GetFileNameWithoutExtension(CubeDir).Substring(
System.IO.Path.GetFileNameWithoutExtension(CubeDir).IndexOf(".") + 1)
});
//Measure Group
foreach (MeasureGroup OLAPMeasureGroup in OLAPCubex.MeasureGroups)
{
idx++;
ObjectID = idx;
string MeasureGroupDir = CubeMeasureGroupsDir.Where(x => x.StartsWith(CubeDir + "\\" + OLAPMeasureGroup.ID.ToString() + ".") && x.EndsWith(".det")).DefaultIfEmpty("").First();
string MeasureGroupXmlFile = CubeMeasureGroupsFiles.Where(x => x.StartsWith(CubeDir + "\\" + OLAPMeasureGroup.ID.ToString() + ".") && x.EndsWith(".det.xml")).DefaultIfEmpty("").First();
string[] GroupPartitionDir = System.IO.Directory.GetDirectories(MeasureGroupDir, "*", System.IO.SearchOption.TopDirectoryOnly);
string[] GroupPartitionFiles = System.IO.Directory.GetFiles(MeasureGroupDir, "*", System.IO.SearchOption.TopDirectoryOnly);
result.Add(new SSASObject
{
ID = idx,
ParentID = CubeID,
ObjectID = OLAPMeasureGroup.ID,
FolderModifiedDate = MeasureGroupDir == "" ? dt : System.IO.Directory.GetLastWriteTime(MeasureGroupDir),
XmlIncremetalID = System.IO.Path.GetFileNameWithoutExtension(
System.IO.Path.GetFileNameWithoutExtension(MeasureGroupXmlFile)).Substring(
System.IO.Path.GetFileNameWithoutExtension(MeasureGroupXmlFile).IndexOf(".") + 1),
Extension = ".det",
FolderName = System.IO.Path.GetFileName(MeasureGroupDir),
FolderPath = MeasureGroupDir,
ObjectName = OLAPMeasureGroup.Name,
Type = SSASObject.ObjectType.MeasureGroup,
XMLFileName = System.IO.Path.GetFileName(MeasureGroupXmlFile),
XMLFilePath = MeasureGroupXmlFile,
XmlModifiedDate = MeasureGroupXmlFile == "" ? dt : System.IO.File.GetLastWriteTime(MeasureGroupXmlFile),
FolderIncremetalID = System.IO.Path.GetFileNameWithoutExtension(MeasureGroupDir).Substring(
System.IO.Path.GetFileNameWithoutExtension(MeasureGroupDir).IndexOf(".") + 1)
});
//Aggregations
foreach (AggregationDesign OLAPAggregationDesign in OLAPMeasureGroup.AggregationDesigns)
{
string AggregationDir = GroupPartitionDir.Where(x => x.StartsWith(MeasureGroupDir + "\\" + OLAPAggregationDesign.ID.ToString() + ".") && x.EndsWith(".agg")).DefaultIfEmpty("").First();
string AggregationXmlFile = GroupPartitionFiles.Where(x => x.StartsWith(MeasureGroupDir + "\\" + OLAPAggregationDesign.ID.ToString() + ".") && x.EndsWith(".agg.xml")).DefaultIfEmpty("").First();
idx++;
result.Add(new SSASObject
{
ID = idx,
ParentID = ObjectID,
ObjectID = OLAPAggregationDesign.ID,
FolderModifiedDate = AggregationDir == "" ? dt : System.IO.Directory.GetLastWriteTime(AggregationDir),
XmlIncremetalID = System.IO.Path.GetFileNameWithoutExtension(
System.IO.Path.GetFileNameWithoutExtension(AggregationXmlFile)).Substring(
System.IO.Path.GetFileNameWithoutExtension(AggregationXmlFile).IndexOf(".") + 1),
Extension = ".agg",
FolderName = System.IO.Path.GetFileName(AggregationDir),
FolderPath = AggregationDir,
ObjectName = OLAPAggregationDesign.Name,
Type = SSASObject.ObjectType.AggregationDesign,
XMLFileName = System.IO.Path.GetFileName(AggregationXmlFile),
XMLFilePath = AggregationXmlFile,
XmlModifiedDate = AggregationXmlFile == "" ? dt : System.IO.File.GetLastWriteTime(AggregationXmlFile),
FolderIncremetalID = System.IO.Path.GetFileNameWithoutExtension(AggregationDir).Substring(
System.IO.Path.GetFileNameWithoutExtension(AggregationDir).IndexOf(".") + 1)
});
}
//Partitions
foreach (Partition OLAPPartition in OLAPMeasureGroup.Partitions)
{
string PartitionDir = GroupPartitionDir.Where(x => x.StartsWith(MeasureGroupDir + "\\" + OLAPPartition.ID.ToString() + ".") && x.EndsWith(".prt")).DefaultIfEmpty("").First();
string PartitionXmlFile = GroupPartitionFiles.Where(x => x.StartsWith(MeasureGroupDir + "\\" + OLAPPartition.ID.ToString() + ".") && x.EndsWith(".prt.xml")).DefaultIfEmpty("").First();
idx++;
result.Add(new SSASObject
{
ID = idx,
ParentID = ObjectID,
ObjectID = OLAPPartition.ID,
FolderModifiedDate = PartitionDir == "" ? dt : System.IO.Directory.GetLastWriteTime(PartitionDir),
XmlIncremetalID = System.IO.Path.GetFileNameWithoutExtension(
System.IO.Path.GetFileNameWithoutExtension(PartitionXmlFile)).Substring(
System.IO.Path.GetFileNameWithoutExtension(PartitionXmlFile).IndexOf(".") + 1),
Extension = ".prt",
FolderName = System.IO.Path.GetFileName(PartitionDir),
FolderPath = PartitionDir,
ObjectName = OLAPPartition.Name,
Type = SSASObject.ObjectType.Partition,
XMLFileName = System.IO.Path.GetFileName(PartitionXmlFile),
XMLFilePath = PartitionXmlFile,
XmlModifiedDate = PartitionXmlFile == "" ? dt : System.IO.File.GetLastWriteTime(PartitionXmlFile),
FolderIncremetalID = System.IO.Path.GetFileNameWithoutExtension(PartitionDir).Substring(
System.IO.Path.GetFileNameWithoutExtension(PartitionDir).IndexOf(".") + 1)
});
}
}
}
//Mining Structure
foreach (MiningStructure OLAPMiningStructure in OLAPDatabase.MiningStructures)
{
idx++;
string MiningStructureDir = DbObjectsDir.Where(x => x.StartsWith(CurrentDbDir + "\\" + OLAPMiningStructure.ID.ToString() + ".") && x.EndsWith(".dms")).DefaultIfEmpty("").First();
string MiningStructureXmlFile = DbObjectsFiles.Where(x => x.StartsWith(CurrentDbDir + "\\" + OLAPMiningStructure.ID.ToString() + ".") && x.EndsWith(".dms.xml")).DefaultIfEmpty("").First();
result.Add(new SSASObject
{
ID = idx,
ParentID = DbID,
ObjectID = OLAPMiningStructure.ID,
FolderModifiedDate = MiningStructureDir == "" ? dt : System.IO.Directory.GetLastWriteTime(MiningStructureDir),
XmlIncremetalID = System.IO.Path.GetFileNameWithoutExtension(
System.IO.Path.GetFileNameWithoutExtension(MiningStructureXmlFile)).Substring(
System.IO.Path.GetFileNameWithoutExtension(MiningStructureXmlFile).IndexOf(".") + 1),
Extension = ".ds",
FolderName = System.IO.Path.GetFileName(MiningStructureDir),
FolderPath = MiningStructureDir,
ObjectName = OLAPMiningStructure.Name,
Type = SSASObject.ObjectType.MiningStructure,
XMLFileName = System.IO.Path.GetFileName(MiningStructureXmlFile),
XMLFilePath = MiningStructureXmlFile,
XmlModifiedDate = MiningStructureXmlFile == "" ? dt : System.IO.File.GetLastWriteTime(MiningStructureXmlFile),
FolderIncremetalID = System.IO.Path.GetFileNameWithoutExtension(MiningStructureDir).Substring(
System.IO.Path.GetFileNameWithoutExtension(MiningStructureDir).IndexOf(".") + 1)
});
}
//Role
foreach (Role OLAPRole in OLAPDatabase.Roles)
{
idx++;
string RoleDir = DbObjectsDir.Where(x => x.StartsWith(CurrentDbDir + "\\" + OLAPRole.ID.ToString() + ".") && x.EndsWith(".dms")).DefaultIfEmpty("").First();
string RoleXmlFile = DbObjectsFiles.Where(x => x.StartsWith(CurrentDbDir + "\\" + OLAPRole.ID.ToString() + ".") && x.EndsWith(".dms.xml")).DefaultIfEmpty("").First();
result.Add(new SSASObject
{
ID = idx,
ParentID = DbID,
ObjectID = OLAPRole.ID,
FolderModifiedDate = RoleDir == "" ? dt : System.IO.Directory.GetLastWriteTime(RoleDir),
XmlIncremetalID = System.IO.Path.GetFileNameWithoutExtension(
System.IO.Path.GetFileNameWithoutExtension(RoleXmlFile)).Substring(
System.IO.Path.GetFileNameWithoutExtension(RoleXmlFile).IndexOf(".") + 1),
Extension = ".ds",
FolderName = System.IO.Path.GetFileName(RoleDir),
FolderPath = RoleDir,
ObjectName = OLAPRole.Name,
Type = SSASObject.ObjectType.Role,
XMLFileName = System.IO.Path.GetFileName(RoleXmlFile),
XMLFilePath = RoleXmlFile,
XmlModifiedDate = RoleXmlFile == "" ? dt : System.IO.File.GetLastWriteTime(RoleXmlFile),
FolderIncremetalID = System.IO.Path.GetFileNameWithoutExtension(RoleDir).Substring(
System.IO.Path.GetFileNameWithoutExtension(RoleDir).IndexOf(".") + 1)
});
}
}
return result;
}
catch (Exception ex)
{
return null;
}
}
}
GitHub项目
我创建了一个小型 Windows 应用程序并将其上传到 GitHub,您可以将其作为单独的工具使用,或者您可以简单地复制到 Script Task 项目中的 Classes 并在 Script 中使用它。
- 1 回答
- 0 关注
- 85 浏览
添加回答
举报