我正在尝试使用以下代码通过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()
}
}
}
答案 0 :(得分:1)
我非常肯定您正在/看到的错误消息是因为您已将$ logins设置为$ db.users列表,然后尝试在foreach循环期间删除用户。
使用$ server.Logins(而不是$ db.users)初始化$ logins,然后在循环中调用$ db.Users [$ login] .Drop()之前检查$ db.Users.Contains($ login)解决你的问题......