2012-04-17 32 views
0

下午好清一色SQL SMO對象SqlRestore方法(ReadFileList)

我已搜索周圍相當多,並發現如何動態地確定包含在一個邏輯數據文件名的名字有幾個很好的資源和SQL .bak文件。與我一起工作的SMO方法要求我傳遞ServerName,但是我的要求要求將實際文件路徑傳遞給備份。我可以在T-SQL中得到我需要的東西,但我真的很想確定一種利用SMO的方法。下面是T-SQL這讓我我所需要的信息:

RESTORE FILELISTONLY 
FROM N'C:\Directory\File.bak' 
WITH FILE = 1 

不幸的是SqlRestore.ReadFileList(服務器)將無法正常工作,因爲備份集還沒有恢復到一個服務器呢。基本上我需要這些信息,所以我可以將它傳遞給Restore.RelocateFiles.Add。實際上,我只是涉足C#的DBA,所以如果您需要更多信息,請告訴我,我會盡力填補空白。感謝您的幫助!

+0

我不讀了SqlRestore.ReadFileList需要的備份集恢復到服務器(HTTP: //msdn.microsoft.com/en-us/library/microsoft.sqlserver.management.smo.restore.readfilelist.aspx)。我認爲它只是需要引用一個服務器實例,目的是讓SQL引擎能夠從備份文件中讀取備份集文件列表。你打電話時會發生什麼?你會得到某種錯誤信息嗎? – mellamokb 2012-04-17 18:16:49

+0

在您提供的鏈接中顯示的是從服務器級別讀取的備份集,我需要能夠傳遞備份設備(路徑到bak)才能讀取文件名,以便將它們傳遞給Restore。搬遷。 – user1253174 2012-04-17 20:49:12

回答

0

下面的PowerShell腳本顯示瞭如何基於文件的路徑上讀取備份文件:

$ServerName="SERVER\MYSQLSERVER" 
$svrConn = new-object Microsoft.SqlServer.Management.Common.ServerConnection 
$svrConn.ServerInstance=$secondaryServerName 
$svrConn.LoginSecure = $true 
$svr = new-object Microsoft.SqlServer.Management.Smo.Server ($svrConn) 
$fullResotrePath = "\\Path\MyDatabase.bak" 
$res = new-object Microsoft.SqlServer.Management.Smo.Restore 
$res.Devices.AddDevice($fullRestorePath, [Microsoft.SqlServer.Management.Smo.DeviceType]::File) 

$dt = $res.ReadFileList($svr) 

foreach($r in $dt.Rows) 
{ 
    foreach ($c in $dt.Columns) 
    { 
     Write-Host $c "=" $r[$c] 
    } 
}