SQL Server SMO中DatabaseRole.EnumObjectPermissions方法失效求助
解决SMO获取数据库角色对象权限的问题
你遇到的EnumObjectPermissions()方法失效是一个长期存在的已知问题,即使在SQL Server 2017版本中仍未修复,并非你的操作有误。以下是无需依赖T-SQL的纯SMO/PowerShell替代实现方案:
替代实现方法
通过遍历数据库中的各类对象(表、视图、存储过程等),针对每个对象查询目标角色的权限,以此绕过失效的角色级EnumObjectPermissions()方法。
直接使用SMO的脚本
# 加载SMO程序集(推荐用此方式避免版本兼容问题) $smoPath = Join-Path -Path (Get-Item "HKLM:\SOFTWARE\Microsoft\Microsoft SQL Server\Instance Names\SQL").GetValue("DMGBVSQL01") -ChildPath "..\..\140\Tools\Binn\Microsoft.SqlServer.Smo.dll" [System.Reflection.Assembly]::LoadFrom($smoPath) | Out-Null $instanceName = 'DEVECPVM010346\DMGBVSQL01' $SMOserver = New-Object Microsoft.SqlServer.Management.Smo.Server($instanceName) $db = $SMOserver.Databases['SomeDatabase'] $targetRole = $db.Roles['WebAppPoolRole'] # 定义需要检查的对象类型,可按需扩展 $objectTypes = @( [Microsoft.SqlServer.Management.Smo.ObjectType]::Table, [Microsoft.SqlServer.Management.Smo.ObjectType]::View, [Microsoft.SqlServer.Management.Smo.ObjectType]::StoredProcedure, [Microsoft.SqlServer.Management.Smo.ObjectType]::ScalarFunction, [Microsoft.SqlServer.Management.Smo.ObjectType]::TableValuedFunction ) # 遍历对象并收集权限 $rolePermissions = @() foreach ($objType in $objectTypes) { $db.EnumObjects($objType) | ForEach-Object { $objPermissions = $_.EnumPermissions($targetRole.Name) if ($objPermissions) { $rolePermissions += $objPermissions | Select-Object @{Name='ObjectName'; Expression={$_.Name}}, @{Name='ObjectType'; Expression={$objType.ToString()}}, PermissionType, PermissionState } } } # 输出整理后的权限列表 $rolePermissions
使用SqlServer模块的脚本
若偏好SqlServer模块,逻辑完全一致:
$db = Get-SqlDatabase -ServerInstance 'DEVECPVM009562\DMGBVSQL01' -Name 'SomeDb' $targetRole = $db.Roles['WebAppPoolRole'] # 定义需要检查的对象类型 $objectTypes = @('Table', 'View', 'StoredProcedure', 'ScalarFunction', 'TableValuedFunction') $rolePermissions = @() foreach ($objType in $objectTypes) { $db.GetEnumObjects($objType) | ForEach-Object { $objPermissions = $_.EnumPermissions($targetRole.Name) if ($objPermissions) { $rolePermissions += $objPermissions | Select-Object @{Name='ObjectName'; Expression={$_.Name}}, @{Name='ObjectType'; Expression={$objType}}, PermissionType, PermissionState } } } $rolePermissions
补充说明
- 上述代码完全基于SMO API实现,无需编写或执行T-SQL语句。
- 可根据实际需求,向
$objectTypes数组中添加更多对象类型(如Synonym、Trigger等)。
内容的提问来源于stack exchange,提问作者endurium
相关产品推荐
相关产品推荐

