湖上湖
由于您以多维数据集为例,这意味着您正在使用多维模型而不是表格。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 对象,我改进了以下项目的代码以添加更多对象并将它们与相关目录/文件链接起来。SSASA模型更新方法要将每个 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 中使用它。