从 powershell 中删除 SQL Server 数据库
Posted
技术标签:
【中文标题】从 powershell 中删除 SQL Server 数据库【英文标题】:Drop SQL Server database from powershell 【发布时间】:2014-07-31 17:02:39 【问题描述】:我的本地计算机上有一个名为 .\SC
的 SQL Server 实例。我想使用 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.数据库 +~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (:) [], ExtendedTypeSystemException + FullyQualifiedErrorId : ExceptionInGetEnumerator
我做错了什么?
【问题讨论】:
您是否检查过您的 SQL 日志以查找失败的登录尝试?如果做不到这一点,请在运行后立即将$error[0]
存储到局部变量中,并获取 Exception 和 InnerException 直到找到根本原因。
【参考方案1】:
我找到了一个不同的命令来执行此操作。很简单:
invoke-sqlcmd -ServerInstance ".\SC" -U "sa" -P "MyPlainTextPass" -Query "Drop database MyDatabase;"
【讨论】:
如果数据库不存在会失败 @liang 如果服务器不存在,或者用户不存在,或者密码不正确,如果服务器上没有 SQL Server,这也会失败,如果是针对 SQL Server v1.0 运行,或者如果它会在没有 powershell 的机器上执行,或者在 commodore 64 上执行......他的答案的重点是解决原始问题,而不是问题周围的装饰。 【参考方案2】:让它对我有用的唯一方法是通过以下命令强制关闭与数据库的任何其他连接:
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
反引号 (`) 是必需的,否则必须内联此命令
【讨论】:
谢谢 - 如果使用 Windows 身份验证,您可以从上面删除@Auth
。【参考方案3】:
我使用以下:
$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'
这样,如果需要,您可以使用变量将其转换为函数,如果失败,它会告诉您,但会继续执行它所在的脚本的其余部分。
【讨论】:
【参考方案4】:做好所有准备后,您似乎忘记了实际连接到服务器。请注意,以下示例调用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
是否有值。
【讨论】:
以上是关于从 powershell 中删除 SQL Server 数据库的主要内容,如果未能解决你的问题,请参考以下文章
MS SQL/Powershell:如何杀死可用性组中辅助节点上的后台进程
使用 Powershell 或 C# 从 TFS 项目中删除用户
如何使用 PowerShell 从 MSMQ 消息队列中删除特定消息