2010-01-06 21 views
7

otomatik olarak bir veritabanı yedekleme geri senaryo yazmaya çalışıyorum ile RESTORE. Ben RESTORE aşağıdaki komutu kullanabilirsiniz biliyorum:belirlenmesi SQL veri yolu HAMLE

RESTORE DATABASE [DBRestoredName] 
FROM DISK = N'C:\path\to\backup.bak' 
WITH FILE = 1, 
MOVE N'DBNAME' TO N'C:\Program Files\Microsoft SQL Server\MSSQL10.SQL2008\MSSQL\DATA\DBNAME.mdf', 
MOVE N'DBNAME_log' TO N'C:\Program Files\Microsoft SQL Server\MSSQL10.SQL2008\MSSQL\DATA\DBNAME.ldf', 
NOUNLOAD 

bu sorun ben (yani yol TO) çalışma anında restore veritabanı yerleştirilir böylece SQL sunucunun veri konumunu belirlemek için isterler olduğunu Bu sunucudaki diğer veritabanlarının yanında sürekli olarak.

Geri yüklenen veritabanı geri yüklenmekte olan sunucuda bulunmayacak ve kaynak sunucu SQL Server 2005 olması ve MOVE deyimlerinin SQL Server 2005 olması gerektiğine inanıyorum, bu nedenle yedekleme dosyasında yer alan dosya yolları arzu edilmez.

Yani hangi yollarla programlı SQL veri konumunu belirleyebilir?

cevap

2

Ben senin T-SQL kodundan kayıt teftiş ediyor bulundu tek çözüm: Veri yolu SERVERPROPERTY veya Dinamik Yönetimi görünümünde bir yerde saklanan olacağını ben yemin

DECLARE @filepath NVARCHAR(260) 

EXEC master.dbo.xp_instance_regread 
     N'HKEY_LOCAL_MACHINE', N'Software\Microsoft\MSSQLServer\MSSQLServer', 
     N'DefaultData', 
     @filepath output, 'no_output' 

SELECT @filepath as 'Your default data directory' 

(DMV) - ama hayır şans ......

1

Sen fiziksel olarak yanında geri yüklemek istediğiniz veritabanında görüntülemek sys.database_files bu sorgulayabilir. Dosya adını, fiziksel_adı sütununun sonundan çıkarmanız gerekir.

select * from sys.database_files 
+1

ancak giriş kullanıyorsunuz? Benim durumumda, kullanıcı veritabanlarımdan farklı bir dizinde master/msdb/model veritabanlarım var ..... –

+0

"sürekli olarak diğer veritabanlarının yanı sıra" sorusundan çıkmış olduğum şey.O, varsayılan veri dizini çözümün belirtildiği marc_s olarak nasıl bulacağını sormadı. Gerçekten 2 farklı sorun IMO gibi geliyor. Uyguladığım birkaç durumda, performans verileri için farklı veritabanlarını barındıran birden çok sürücüye sahip olmalıyız; bu durumda, varsayılan veri dizini, çoğu durumda bu durum için kötü bir seçimdir. –

+0

karışıklık için özür dilerim. Kötü bir şekilde ifade edildi ve varsayılan veri dizininin hemen ardından bu cevap aynı şekilde geçerliydi. Teşekkürler – Dolbz

0

aşağıda kod parçacığı ben SQL Profiler çıkarılan budur. Daha az kullanışlı sütunları kaldırmak için biraz değiştirdim. Kod şimdi aşağıdaki Sütun bir satır verir:

  • MasterDBPath
  • MasterDBLogPath
  • IsFullTextInstalled ErrorLogPath
  • RootDirectory
  • IsCaseSensitive
  • MaxPrecision
  • VersionString (örneğin 10.50. 2500.0)
  • Edition (ör. Geliştirici Sürümü (64-bit))
  • ProductLevel (örn SP1)
  • IsSingleUser
  • EngineEdition (örn 3)
  • Harmanlama (örn Latin1_General_CI_AS)
  • NetName IsClustered (örneğin ev sahibi ismi)
  • BuildClrVersionString (örn v2.0.50727)

iyi şanslar.

declare @RegPathParams sysname 
declare @Arg sysname 
declare @Param sysname 
declare @MasterPath nvarchar(512) 
declare @LogPath nvarchar(512) 
declare @ErrorLogPath nvarchar(512) 
declare @n int 

select @n=0 
select @RegPathParams=N'Software\Microsoft\MSSQLServer\MSSQLServer'+'\Parameters' 
select @Param='dummy' 
while(not @Param is null) 
begin 
    select @Param=null 
    select @Arg='SqlArg'+convert(nvarchar,@n) 

    exec master.dbo.xp_instance_regread N'HKEY_LOCAL_MACHINE', @RegPathParams, @Arg, @Param OUTPUT 
    if(@Param like '-d%') 
    begin 
     select @Param=substring(@Param, 3, 255) 
     select @MasterPath=substring(@Param, 1, len(@Param) - charindex('\', reverse(@Param))) 
    end 
    else if(@Param like '-l%') 
    begin 
     select @Param=substring(@Param, 3, 255) 
     select @LogPath=substring(@Param, 1, len(@Param) - charindex('\', reverse(@Param))) 
    end 
    else if(@Param like '-e%') 
    begin 
     select @Param=substring(@Param, 3, 255) 
     select @ErrorLogPath=substring(@Param, 1, len(@Param) - charindex('\', reverse(@Param))) 
    end 

    select @[email protected]+1 
end 

declare @SmoRoot nvarchar(512) 
exec master.dbo.xp_instance_regread N'HKEY_LOCAL_MACHINE', N'SOFTWARE\Microsoft\MSSQLServer\Setup', N'SQLPath', @SmoRoot OUTPUT 

SELECT CAST(FULLTEXTSERVICEPROPERTY('IsFullTextInstalled') AS bit) AS [IsFullTextInstalled], @LogPath AS [MasterDBLogPath], @MasterPath AS [MasterDBPath], @ErrorLogPath AS [ErrorLogPath], @SmoRoot AS [RootDirectory], CAST(case when 'a' <> 'A' then 1 else 0 end AS bit) AS [IsCaseSensitive], @@MAX_PRECISION AS [MaxPrecision], SERVERPROPERTY(N'ProductVersion') AS [VersionString], CAST(SERVERPROPERTY(N'Edition') AS sysname) AS [Edition], CAST(SERVERPROPERTY(N'ProductLevel') AS sysname) AS [ProductLevel], CAST(SERVERPROPERTY('IsSingleUser') AS bit) AS [IsSingleUser], CAST(SERVERPROPERTY('EngineEdition') AS int) AS [EngineEdition], convert(sysname, serverproperty(N'collation')) AS [Collation], CAST(SERVERPROPERTY('IsClustered') AS bit) AS [IsClustered], CAST(SERVERPROPERTY(N'MachineName') AS sysname) AS [NetName], SERVERPROPERTY(N'BuildClrVersion') AS [BuildClrVersionString]