我正在编写一个PowerShell脚本,它将自动化开发环境部署,并且我遇到了附加数据库的问题。我正在添加2个管理单元SqlServerCmdletSnapin100
和SqlServerProviderSnapin100
并使用SQLSERVER:\SQL\localhost\SQLEXPRESS
和AttachDatabase
方法。这很好用,如果我以同样的方式使用DetachDatabase
方法,我可以不断重新运行脚本。当我从管理工作室分离并尝试再次运行脚本时,我的问题就出现了。无论我在这里做什么(权限等),脚本将从此时不断失败并出现错误:
Exception calling "AttachDatabase" with "2" argument(s):
"Attach database failed for Server 'localhost\SQLEXPRESS'. "
如果我更改了我附加的数据库的名称,因为脚本将再次起作用。系统数据库中是否有某些东西会挂在我需要删除的数据库或数据库文件上?
答案 0 :(得分:1)
SMO使用嵌套的错误对象,所以我想知道基本错误消息的状态。如果您运行此声明:
$error[0] | fl -force
你得到什么错误信息
更新 快速测试一下: 使用SSMS从我的本地实例分离数据库“hsg”并成功附加此脚本:
PS SQLSERVER:\SQL\WIN7BOOT\SQL1> $s = get-item .
PS SQLSERVER:\SQL\WIN7BOOT\SQL1> $s.AttachDatabase("hsg",$sc)
PS SQLSERVER:\SQL\WIN7BOOT\SQL1> $sc = new-object System.Collections.Specialized.StringCollection
PS SQLSERVER:\SQL\WIN7BOOT\SQL1> $sc.Add("C:\Program Files\Microsoft SQL Server\MSSQL10_50.SQL1\MSSQL\DATA\hsg.mdf")
PS SQLSERVER:\SQL\WIN7BOOT\SQL1> $sc.Add("C:\Program Files\Microsoft SQL Server\MSSQL10_50.SQL1\MSSQL\DATA\hsg_log.ldf)
答案 1 :(得分:0)
我使用SQL Server Management Studio分离了一个数据库,并使用以下代码将数据库附加回同一个实例。虽然文件是相同的,但附加数据库没有得到原始名称,但它工作正常。
PS SQLSERVER:\sql\Hodentek8\RegencyPark\databases>
$files = new-object system.collections.specialized.stringcollection
$files.add("C:\Program Files\Microsoft SQLServer\MSSQL11.REGENCYPARK\MSSQL\DATA\Feb6.mdf")
$files.add("C:\Program Files\Microsoft SQL Server\MSSQL11.REGENCYPARK\MSSQL\DATA\Feb6_log.ldf")
$server=new-object Microsoft.SqlServer.Management.Smo.Server('Hodentek8\RegencyPark')
$db=new-object Microsoft.SqlServer.Management.Smo.Server
$dbname="feb6"
$server.AttachDatabase($db,$files)
有些细节在这里: http://hodentekmsss.blogspot.com/2015/04/attaching-detached-database-in-sql.html
答案 2 :(得分:0)
或许不是localhost \ SQLExpress你应该使用: 我发现我的一些代码修复了同样的错误:
$srv = new-object Microsoft.SqlServer.Management.Smo.Server 'Hodentek8\RegencyPark'
此处示例: http://hodentekmsss.blogspot.com/2015/04/counting-sql-server-configuration.html