将 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
}
这是我的 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
}