0

デタッチされた SQL Server プライマリ データ ファイル ( .mdf) がある場合、そのファイル内に存在するデータ ファイルとログ ファイルのリストを取得するにはどうすればよいでしょうか? 目標は、Server.AttachDatabaseSMO メソッドを使用してデータベースを接続することです。ただし、データベースには複数のデータ ファイルやログ ファイルが含まれている可能性があるため、それらをStringCollectionメソッドのパラメーターに追加するにはリストを取得する必要があります。

私が必要とするのはselect * from sys.files、切り離されたmdfと同等です。SQL Server Management Studio を使用してデータベースを手動でアタッチすると、これが実行されるので、実行できることがわかります。

4

3 に答える 3

2

単一のMDFファイルの場合、他のMDFファイルがある場合、MDFファイルがそれを直接伝えることはできないと思います。

また、このオプションを使用すると、ログファイルなしでいつでもMDFファイルの添付を試みるCREATE DATABASE ... FOR ATTACH_REBUILD_LOGことができます。

SMOでは、を指定するAttachDatabaseメソッドを使用してこれを行うことができます。RebuildLogAttachOptions

もちろん、これはすべて.mdfファイルが正常であることを前提としています。これは、完全にデタッチされた場合にのみ使用できます。

Management Studioには、ファイルヘッダーを読み取る独自の方法があると思われますが、これらは文書化されておらず、プロファイラーなどを使用してSSMSが何を行っているかを確認することはできません。

通常、ある種の配布用に.mdfファイルを作成している場合は、代わりにバックアップ/復元を使用することを強くお勧めします。.BAKファイルとそのデータベースが表すデータ/ログファイルについては、などの文書化された公開メソッドを使用して、さらに多くのことを学ぶことができますRESTORE FILELISTONLY

于 2012-06-22T20:52:13.577 に答える
1

最後にこれを理解しました。文書化されていないコマンド DBCC checkprimaryfile(N'blah.mdf',3) は、必要な情報を提供します。

于 2012-06-23T18:27:10.357 に答える
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)
}

デタッチされたデータベース ファイル構造を列挙する

SMO アタッチ/デタッチ レシピ

于 2015-01-17T21:24:29.293 に答える