【问题标题】:What is the equivalent of the 'GO' statement when using SMO with Powershell?将 SMO 与 Powershell 一起使用时,“GO”语句的等价物是什么?
【发布时间】:2015-08-17 14:55:42
【问题描述】:

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

# 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 用户或组“[域\用户]”。再次检查名称。

但是$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 中实现的?还是我做错了?

【问题讨论】:

  • 好奇,应该是$user.Login = $login
  • 不,根据 MSDN,它要求 String 而不是 Login 对象。尝试使用 Login 对象会引发异常,类似于“未找到重载”。

标签: sql-server powershell smo


【解决方案1】:

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

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

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

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

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

【讨论】:

  • $db 是一个 Microsoft.SqlServer.Management.Smo.Database 对象,但该部分似乎工作正常。我会尝试第二个 sn-p 并回复你。
  • 如果您可以尝试在 $login.Create() 命令之后停止并使用 SSMS 等来确保登录确实已创建。
  • 登录已创建,执行该行后,我可以在 SSMS 的 Logins 文件夹下看到登录。现在问题似乎解决了,但很遗憾我不知道如何解决。 =/
【解决方案2】:

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

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
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    • 2011-01-26
    • 2018-04-15
    • 2015-07-06
    相关资源
    最近更新 更多