Удалить базу данных SQL Server из PowerShell

У меня есть экземпляр SQL Server на моем локальном компьютере с именем .\SC. Я хочу удалить базу данных из этого экземпляра с помощью сценария PowerShell. Мне нужно войти в систему с sa пользователем моей базы данных.

Это код, который у меня есть, но он не работает:

[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.Smo")
$srv = new-object Microsoft.SqlServer.Management.Smo.Server(".\SC")
$conContext = $srv.ConnectionContext
$conContext.LoginSecure = $FALSE
$conContext.Login = "sa"
$conContext.Password = "MyPlainTextPass"
$srv2 = new-object Microsoft.SqlServer.Management.Smo.Server($conContext)
$srv2.Databases

Эта последняя строка должна перечислять базы данных в моем экземпляре SQL ... но она дает мне эту ошибку:

Следующее исключение произошло при попытке перечислить коллекцию: «Не удалось подключиться к серверу. \ SC.». В строке: 1 символ: 1 + $ srv2.Databases + ~~~~~~~~~~~~~~~ + CategoryInfo: NotSpecified: (:) [], ExtendedTypeSystemException + FullyQualifiedErrorId: ExceptionInGetEnumerator

Что я делаю неправильно?


person user952342    schedule 10.06.2014    source источник
comment
Вы проверяли свои журналы SQL на предмет неудачных попыток входа в систему? В противном случае сохраните $error[0] в локальной переменной сразу после запуска и получайте Exception и InnerException, пока не дойдете до основной причины.   -  person Ben Thul    schedule 11.06.2014


Ответы (4)


Я нашел для этого другую команду. Это было просто:

invoke-sqlcmd -ServerInstance ".\SC" -U "sa" -P "MyPlainTextPass" -Query "Drop database MyDatabase;"
person user952342    schedule 11.06.2014
comment
это не сработает, если база данных не существует - person liang; 15.08.2016
comment
@liang Это также не сработает, если сервер не существует, или пользователь не существует, или если пароль неверен, если на сервере нет SQL Server, если он запущен против SQL Server v1.0, или если бы он был выполнен на машине без PowerShell, или был бы выполнен на коммодоре 64 ... Суть его ответа заключается в исправлении исходной проблемы, а не в украшении вокруг проблемы. - person P-L; 09.09.2020

Единственный способ заставить его работать для меня - это принудительно закрыть любые другие соединения с базой данных с помощью следующей команды:

Invoke-SqlCmd -ServerInstance $Server @Auth `
    -Query "IF EXISTS (SELECT name FROM master.dbo.sysdatabases WHERE name ='MyDBName') `
                BEGIN `
                    ALTER DATABASE [MyDBName] SET SINGLE_USER WITH ROLLBACK IMMEDIATE; `
                    DROP DATABASE [MyDBName]; `
                END;" `
    -Verbose

Обратные кавычки (`) необходимы, иначе эту команду нужно было бы встроить.

person ccoutinho    schedule 20.04.2020
comment
Спасибо - при использовании проверки подлинности Windows вы можете удалить @Auth из приведенного выше. - person robyaw; 26.06.2020

Я использую следующее:

$sqlserver = '<enter sql server here>'
$database = '<enter db name here>'

Try{
    invoke-sqlcmd -ServerInstance "$sqlserver" -Query "Drop database $database;"
}Catch{
      Write-Output 'Failed to delete database'
}

Таким образом, вы можете превратить его в функцию, если это необходимо, с переменными, и если она не удастся, она сообщит вам, но перейдет к остальной части скрипта, в котором она находится.

person Adrian Coles    schedule 19.03.2019

При всей вашей подготовке вы, кажется, забываете на самом деле подключиться к серверу. Обратите внимание, что в приведенном ниже примере вызывается ConnectionContext.Connect().

$dbServer = New-Object Microsoft.SqlServer.Management.Smo.Server $server
$smoSecurePassword = $Password  | ConvertTo-SecureString -asPlainText -Force
$dbServer.ConnectionContext.LoginSecure = $false
$dbServer.ConnectionContext.set_Login($User)            
$dbServer.ConnectionContext.set_SecurePassword($smoSecurePassword)
$dbServer.ConnectionContext.Connect() 
$db = $dbServer.Databases

Если вы хотите проверить, существует ли ваша база данных (как указал Лян), вы можете изменить последнюю строку с помощью:

$db = $dbServer.Databases[$database]

и проверьте, есть ли у $db значение.

person Gambit    schedule 11.04.2018