如何用C#管理SSAS Tabular 2017权限?无法访问ColumnPermissions及设置筛选器
解决SSAS Tabular 2017(1400)角色权限管理问题的思路
针对你用C#通过Microsoft.AnalysisServices.Tabular管理SSAS Tabular 2017(兼容级别1400)角色权限时遇到的ColumnPermissions访问和TablePermissions筛选器设置问题,我整理了以下解决思路和代码修正建议:
1. 如何操作ColumnPermissions
在1400兼容级别的Tabular模型中,列权限(ColumnPermission)是隶属于TablePermission的Columns集合的,你需要先创建TablePermission实例,再为其添加对应的ColumnPermission项:
// 假设你要为某张表设置列权限 TablePermission newTablePer = new TablePermission { Name = tabPerm.TableName, FilterExpression = tabPerm.TableFilters }; // 添加列权限示例:允许访问特定列,设置权限为Read var columnPerm = new ColumnPermission { Column = dictTables[tabPerm.TableName].Columns["目标列名"], // 从表的Columns集合中获取目标列 Permission = ModelPermission.Read // 根据需求设置权限:None/Read等 }; newTablePer.Columns.Add(columnPerm);
这里要注意:必须确保你引用的列是模型中实际存在的列,建议通过你已创建的dictTables字典来快速定位表和列,避免名称匹配错误。
2. 修正TablePermissions筛选器的潜在问题
你代码中设置FilterExpression的逻辑本身是可行的,但需要注意两个关键点:
- 筛选器语法正确性:
FilterExpression必须符合DAX语法,比如"[Region] = 'North'",如果语法错误,Validate()会返回错误,导致该权限被跳过。建议提前验证DAX表达式的正确性。 - 表名称匹配逻辑错误:你代码中用
tables.Contains(tabPerm.TableName)是错误的,因为tables是Table对象的集合,Contains是按对象引用比较,不是按名称。应该改用你已创建的dictTables.ContainsKey(tabPerm.TableName)来判断表是否存在:
// 替换原有的表存在性判断逻辑 if (dictTables.ContainsKey(tabPerm.TableName) && !string.IsNullOrWhiteSpace(tabPerm.TableFilters)) { Table targetTable = dictTables[tabPerm.TableName]; TablePermission newTablePer = new TablePermission { Name = tabPerm.TableName, FilterExpression = tabPerm.TableFilters, Table = targetTable // 建议显式关联Table对象,避免名称歧义 }; // ... 后续添加列权限或验证逻辑 tb.Add(newTablePer); }
3. 代码中其他需要优化的点
- 角色移除逻辑:你当前遍历角色名称并移除的方式可能引发集合修改异常,建议改用
RemoveAll方法:model.Roles.RemoveAll(r => rolesName.Contains(r.Name)); model.SaveChanges(); - 显式关联Table对象:在创建
TablePermission时,最好显式设置Table属性(如上面代码所示),而不仅仅依赖Name,这样能避免模型中存在重名表时的错误。
完整修正后的核心代码片段
if (n.TablePermissions.Count > 0) { var tb = newRole.TablePermissions; foreach (var tabPerm in n.TablePermissions) { if (dictTables.ContainsKey(tabPerm.TableName) && !string.IsNullOrWhiteSpace(tabPerm.TableFilters)) { Table targetTable = dictTables[tabPerm.TableName]; TablePermission newTablePer = new TablePermission { Name = tabPerm.TableName, FilterExpression = tabPerm.TableFilters, Table = targetTable }; // 示例:添加列权限 if (tabPerm.ColumnPermissions != null && tabPerm.ColumnPermissions.Count > 0) { foreach (var colPerm in tabPerm.ColumnPermissions) { if (targetTable.Columns.Contains(colPerm.ColumnName)) { var columnPermission = new ColumnPermission { Column = targetTable.Columns[colPerm.ColumnName], Permission = colPerm.Permission // 比如ModelPermission.Read }; newTablePer.Columns.Add(columnPermission); } } } if (!newTablePer.Validate().ContainsErrors) { tb.Add(newTablePer); } } } }
以上思路应该能解决你遇到的ColumnPermissions访问和TablePermissions筛选器设置问题,记得在修改后重新验证模型的权限配置是否符合预期。
内容的提问来源于stack exchange,提问作者Paul Poterasi
相关产品推荐
相关产品推荐

