通过Powershell从SQL Server数据库中删除用户

时间:2017-06-15 12:40:38

标签: sql-server powershell smo

我正在尝试使用以下代码通过PowerShell从SQL服务器数据库中删除用户:

$sql_server = "mysqlserver"
$dbname = "mydb"

[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SMO") | Out-Null

$server = New-Object ("Microsoft.SqlServer.Management.Smo.Server")($sql_server)
$db = $server.Databases["$dbname"]
$logins = $db.users

if ($logins.count -gt 0) {
    foreach ($login in $logins) {
        if ($login -notmatch "\[dbo\]|\[guest\]|\[INFORMATION_SCHEMA\]|\[sys\]") {
            $user = $login -replace '[^a-zA-Z\.\\]'
            write-host "Dropping $user"
            $db.Users[$user].Drop();
        }
    }
}

但是我收到错误声明:

  

收藏被修改;枚举操作可能无法执行。   + foreach($ login in $ logins){   + ~~~~~~       + CategoryInfo:OperationStopped:(:) [],InvalidOperationException       + FullyQualifiedErrorId:System.InvalidOperationException

我认为$logins正在改变,因为我删除了用户?我不确定如何解决这个问题?

修改

以下内容应该有效。感谢@Neil Hibbert的帮助。

$sql_server = "mysqlserver"
$dbname = "mydb"

[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SMO") | Out-Null

$server = New-Object ("Microsoft.SqlServer.Management.Smo.Server")($sql_server)
$db = $server.Databases["$dbname"]
$logins = $db.users

if ($logins.count -gt 0) {
    for ($i=0; $i -lt $logins.count; $i++) {
        if ($logins[$i] -notmatch "\[dbo\]|\[guest\]|\[INFORMATION_SCHEMA\]|\[sys\]") {
            $user = $logins[$i] -replace '[^a-zA-Z\.\\]'
            write-host "Dropping $user"
            $db.Users[$user].Drop()
        }
    }
}

1 个答案:

答案 0 :(得分:1)

我非常肯定您正在/看到的错误消息是因为您已将$ logins设置为$ db.users列表,然后尝试在foreach循环期间删除用户。

使用$ server.Logins(而不是$ db.users)初始化$ logins,然后在循环中调用$ db.Users [$ login] .Drop()之前检查$ db.Users.Contains($ login)解决你的问题......