Azure Analysis Service表格模型兼容级别异常:API返回1600但实际为1608
Azure Analysis Services Tabular API 返回兼容级别1600与实际1608不符的问题
我通过C#的Microsoft.AnalysisServices.Tabular API连接Azure Analysis Service(AAS)管理表格模型,实现了"热切换"功能:移除生产模型后将临时模型重命名为生产模型。创建临时模型时已将*CompatibilityLevel*设为服务器支持的最高版本1608,但重新连接AAS后,调用*ssasServer.Databases.FindByName*返回的所有模型兼容级别均显示为1600,触发了兼容级别降级不支持的异常。手动在热切换逻辑中指定*CompatibilityLevel*为1608可解决问题,但疑惑为何API返回值与SSMS显示、服务器声明的支持级别不一致。
热切换功能代码
Tabular.Database d = ssasServer.Databases.FindByName(cubeDBName); Tabular.Database dnew = ssasServer.Databases.FindByName(tempDBName); ssasServer.Databases.Remove(d.ID); ssasServer.Databases.Remove(dnew.ID); dnew.Name = cubeDBName; ssasServer.Databases.Add(d); d?.Drop(); ssasServer.Databases.Add(dnew); dnew.Update();
临时模型创建代码
Tabular.Database d = new Tabular.Database() { Name = ssasServer.Databases.GetNewName(newDbName), ID = newDatabaseName + $"_" + DateTime.Now.ToString("ddMMyyyyhhmmss"), CompatibilityLevel = compatibilityLevel, // 此处compatibilityLevel是从ssasServer.SupportedCompatibilityLevels解析出的最大值1608 StorageEngineUsed = StorageEngineUsed.TabularMetadata, }; ssasServer.Databases.Add(d); d.Update();
触发的异常信息
Tabular databases do not support CompatibilityLevel downgrade. Current CompatibilityLevel: '1608'. Requested CompatibilityLevel: '1600'
问题原因
- 客户端库版本限制:旧版本的
Microsoft.AnalysisServices.TabularNuGet包对AAS的细分兼容级别(如1608)识别逻辑存在缺陷,会将16xx系列的增量版本统一映射为表格模型的基础兼容级别1600。 - 元数据读取逻辑差异:SSMS直接从AAS服务器读取原始元数据,因此能展示真实的1608;而API客户端库在解析元数据时,未对这类细分版本号做特殊处理,返回了通用的1600标识。
解决办法
- 复用预设的兼容级别值:在热切换流程中,直接使用创建临时模型时从
ssasServer.SupportedCompatibilityLevels解析出的compatibilityLevel变量(即1608),不要依赖FindByName返回对象的CompatibilityLevel属性值。 - 升级客户端库:将项目中的
Microsoft.AnalysisServices.TabularNuGet包更新至最新版本,新版本已修复高版本兼容级别的识别问题,能正确返回1608这类细分版本号。 - 硬编码指定兼容级别(临时方案):如果暂时无法升级库,可在热切换操作中手动设置
dnew.CompatibilityLevel = 1608,避免降级异常。
内容的提问来源于stack exchange,提问作者Dave R
相关产品推荐
相关产品推荐

