给定一个分离的SQL Server主数据文件(.mdf
)如何获取该文件中存在的数据和日志文件列表?目标是使用Server.AttachDatabase
SMO方法附加数据库。但是数据库可能有多个数据和/或日志文件,因此我需要获取列表以将它们添加到方法的StringCollection
参数中。
对于分离的mdf,我需要的是等效的select * from sys.files
。 SQL Server Management Studio在您使用它手动附加数据库时执行此操作,因此我知道可以完成此操作。
答案 0 :(得分:2)
如果它是单个MDF文件,如果有其他MDF文件,我不认为MDF文件可以直接告诉您。
使用CREATE DATABASE ... FOR ATTACH_REBUILD_LOG
选项,您始终可以尝试附加没有日志文件的MDF文件。
在SMO中,您可以使用为AttachDatabase
指定RebuildLog
的{{3}}方法执行此操作。
当然这一切都假定.mdf文件是健康的 - 只有在干净地分离时它才可用。
Management Studio可能有一些专有的方式来读取文件头,但这些都没有记录,您无法使用Profiler等查看SSMS正在做什么。
如果您通常创建.mdf文件以进行某种分发,我强烈建议您使用备份/恢复。您可以使用文档化和公共方法(如AttachOptions
)了解有关.BAK文件及其数据库所代表的数据/日志文件的更多信息。
答案 1 :(得分:1)
最后想出了这个。未记录的命令DBCC checkprimaryfile(N'blah.mdf',3)给出了所需的信息。
答案 2 :(得分:1)
我花了一段时间才找到它,但在SMO中,你使用了EnumDetachedLogFiles和EnumDetachedLogFiles。
# PowerShell
$servername = "sqlserver\instance"
$mdf = "S:\DATA\mydb.mdf"
[void][Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SMO")
$filestructure = New-Object System.Collections.Specialized.StringCollection
$server = New-Object Microsoft.SqlServer.Management.Smo.Server $servername
# Here you can automatically determine the database name, or set it manually
$dbname = ($server.DetachedDatabaseInfo($mdf) | Where { $_.Property -eq "Database name" }).Value
foreach ($file in $server.EnumDetachedDatabaseFiles($mdf)) {
$null = $filestructure.add($file)
}
foreach ($file in $server.EnumDetachedLogFiles($mdf)) {
$null = $filestructure.add($file)
}