将 SMO 与 Powershell 一起使用时,'GO' 语句的等效项是什么?

What is the equivalent of the 'GO' statement when using SMO with Powershell?

这是我的 powershell 模块的一个片段,它在数据库中创建了一个登录名和用户:

# code omitted which sets default db, language, etc.
$login.Create()

$user = New-Object ("Microsoft.SqlServer.Management.Smo.User") $db, $username
$user.Login = $login.Name
$user.Create()

调用 $user.Create() 时抛出异常,并显示以下消息:

Windows 未找到 NT 用户或组“[domain\user]”。再次检查名称。

但是 $login.Create() 执行没有问题,我可以在 SSMS 中看到登录存在。

我唯一想到的是为什么会抛出这个错误,如果我是通过 T-SQL 来做的,我会写下以下内容:

CREATE USER [domain\user] FROM WINDOWS;
GO
CREATE USER [user] FOR [domain\user];
GO

Question regarding issuing a GO statement after CREATE LOGIN

这在 PowerShell 中是如何实现的?还是我做错了?

如果 $DB 只是一个包含数据库名称的字符串,请将其更改为

$db = $server.Databases['YourDatabaseNameHere']

您也可以尝试将 $user 创建行更改为

$user = New-Object ("Microsoft.SqlServer.Management.Smo.User") $db, $login.Name
$user.Create()

最后一个应该不是必需的,但这是我使用的方法。如果仍然不起作用,您可能需要 post 更多代码。

我不确定我更改了什么,但脚本现在似乎可以运行了。无论如何,我会 post 完整的脚本,也许有人可以告诉我。 -耸肩-

Function Add-DatabaseUser
{
Param(
    [Parameter(Mandatory=$true, HelpMessage="The domain account to create the account for.", Position = 0)]
    [string] $loginname
   ,[Parameter(Mandatory=$true, HelpMessage="The user name for the new account.", Position = 1)]
    [string] $username
   ,[Parameter(HelpMessage="Make this user an database administrator?")]
    [switch] $dbadmin
)

$srv = Get-Server
$db = Get-Database

$login = $null;
$user = $null;

Try
{
    $login = New-Object ("Microsoft.SqlServer.Management.Smo.Login") $srv, $loginname
    $login.DefaultDatabase = "MyDatabase"
    $login.Language = "British English"
    $login.LoginType = "WindowsUser"
    $login.Create()
}
Catch
{
    $exception = $_.Exception
    while($exception.InnerException -ne $null)
    {
        $exception = $exception.InnerException
    }

    Write-Error $exception.Message

    return
}

Try
{
    $user = New-Object ("Microsoft.SqlServer.Management.Smo.User") $db, $username
    $user.Login = $login.Name
    $user.Create()

    if ($administrator)
    {
        $user.AddToRole("db_datareader")
        $user.AddToRole("db_datawriter")
        $user.Alter()
    }
}
Catch
{
    $exception = $_.Exception
    while($exception.InnerException -ne $null)
    {
        $exception = $exception.InnerException
    }

    Write-Error $exception.Message

    return
}

Write-Host "User was successfully created."
return
}