从 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 消息队列中删除特定消息

用于从 Appfabric 缓存中删除项目的 Powershell 命令

使用 Powershell 从文件中删除最后一行

powershell Powershell脚本,用于从已编译的twine游戏中删除保存加密代码。