通过 Powershell 从 SQL 服务器数据库中删除用户
Dropping Users from SQL Server Database via Powershell
我正在尝试使用以下代码通过 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();
}
}
}
但是我收到一条错误消息:
Collection was modified; enumeration operation may not execute.
+ 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()
}
}
}
我很确定您 are/were 看到的错误消息是因为您将 $logins 设置为 $db.users 的列表,然后试图在 foreach 循环中删除用户。
使用 $server.Logins(而不是 $db.users)初始化 $logins,然后在调用 $db.Users[$login] 之前检查 $db.Users.Contains($login)循环中的 .Drop() 将解决您的问题...
我正在尝试使用以下代码通过 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();
}
}
}
但是我收到一条错误消息:
Collection was modified; enumeration operation may not execute. + 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()
}
}
}
我很确定您 are/were 看到的错误消息是因为您将 $logins 设置为 $db.users 的列表,然后试图在 foreach 循环中删除用户。
使用 $server.Logins(而不是 $db.users)初始化 $logins,然后在调用 $db.Users[$login] 之前检查 $db.Users.Contains($login)循环中的 .Drop() 将解决您的问题...