Не удается найти тип [Microsoft.SqlServer.Management.Smo.Server] во время выполнения удаления базы данных SQL в задаче встроенного сценария VSTS Powershell. - PullRequest
0 голосов
/ 11 мая 2018

В моем выпуске VSTS, когда я запускаю следующий встроенный скрипт Powershell (Версия 5.1)

$srv = new-Object Microsoft.SqlServer.Management.Smo.Server(".") $db = New-Object Microsoft.SqlServer.Management.Smo.Database($srv, "MyDB") $db.Drop()

Я получаю следующую ошибку

##[error]new-Object : Cannot find type [Microsoft.SqlServer.Management.Smo.Server]: verify that the assembly containing this type is loaded.

Из вышеприведенной ошибки ясно, что он не может найти «SMO-сервер», и я нашел несколько решений, как добавить SMO-сервер в среде Windows, но не знаю, кто имеет дело с этим сценарием в моем VSTS Powershell. Задача VSTS? Поскольку я новичок в мире Powershell, я даже не уверен, что сценарий, который я запускаю, является правильным подходом или есть какой-то другой способ сделать эту работу? Я буду признателен, если кто-нибудь поможет мне с опцией встроенного скрипта, а не файлом скрипта.

1 Ответ

0 голосов
/ 14 мая 2018

Во-первых, с этим кодом: new-Object Microsoft.SqlServer.Management.Smo.Server(".") он использует проверку подлинности Windows, поэтому он использует учетную запись службы агента, убедитесь, что учетная запись службы агента может подключаться к базе данных (по умолчанию это сетевая служба, если агент работаеткак услуга)

Я рекомендую использовать аутентификацию SQL и код, подобный следующему:

$assemblylist =   
"Microsoft.SqlServer.Management.Common",  
"Microsoft.SqlServer.Smo",  
"Microsoft.SqlServer.Dmf ",  
"Microsoft.SqlServer.Instapi ",  
"Microsoft.SqlServer.SqlWmiManagement ",  
"Microsoft.SqlServer.ConnectionInfo ",  
"Microsoft.SqlServer.SmoExtended ",  
"Microsoft.SqlServer.SqlTDiagM ",  
"Microsoft.SqlServer.SString ",  
"Microsoft.SqlServer.Management.RegisteredServers ",  
"Microsoft.SqlServer.Management.Sdk.Sfc ",  
"Microsoft.SqlServer.SqlEnum ",  
"Microsoft.SqlServer.RegSvrEnum ",  
"Microsoft.SqlServer.WmiEnum ",  
"Microsoft.SqlServer.ServiceBrokerEnum ",  
"Microsoft.SqlServer.ConnectionInfoExtended ",  
"Microsoft.SqlServer.Management.Collector ",  
"Microsoft.SqlServer.Management.CollectorEnum",  
"Microsoft.SqlServer.Management.Dac",  
"Microsoft.SqlServer.Management.DacEnum",  
"Microsoft.SqlServer.Management.Utility",
    "Microsoft.SqlServer.Management.Smo"
foreach ($asm in $assemblylist)  
{  
    $asm = [Reflection.Assembly]::LoadWithPartialName($asm)  
}  
    $conn = new-object Microsoft.SqlServer.Management.Common.ServerConnection("{sql server instance name}","{sql user name}","{password}")

$srv = new-object Microsoft.SqlServer.Management.Smo.Server($conn)

Write-Host $srv.Information.Version

    $db = New-Object Microsoft.SqlServer.Management.Smo.Database($srv, "{database name}") 
    $srv.KillAllProcesses($db)
    $srv.databases[$db.Name].drop()
...