You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 15:00:53