Премахнете базата данни на 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 char: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, или се изпълни на commodore 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

Ако искате да проверите дали вашата база данни съществува (както liang посочи), можете да промените последния ред с:

$db = $dbServer.Databases[$database]

и проверете дали $db има стойност.

person Gambit    schedule 11.04.2018