2010-01-06 1 views
7

J'essaye d'écrire un script qui restaure automatiquement une sauvegarde de base de données. Je sais que je peux utiliser la commande suivante RESTORE:Détermination du chemin de données SQL pour DB RESTORE avec MOVE

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 

Le problème est que je veux être en mesure de déterminer l'emplacement de données du serveur SQL (le TO chemin) au moment de l'exécution si est placé la base de données restaurée régulièrement aux côtés d'autres bases de données sur ce serveur.

La base de données en cours de restauration n'existe pas sur le serveur sur lequel elle est restaurée et j'ai besoin des instructions MOVE car le serveur source est susceptible d'être SQL Server 2005 et la cible est donc les chemins de fichiers inclus dans le fichier de sauvegarde ne sont pas souhaitables.

Alors, comment puis-je déterminer l'emplacement des données SQL par programme?

Répondre

2

La seule solution viable que je trouve inspecte le registre de votre code T-SQL:

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' 

Je jurerais que chemin de données seraient stockées quelque part dans un SERVERPROPERTY ou une vue sur la gestion dynamique (DMV) - mais pas de chance ......

1

Vous pouvez effectuer une requête à partir de la vue sys.database_files dans la base de données que vous souhaitez restaurer en même temps que physiquement. Vous devrez supprimer le nom du fichier à la fin de la colonne physical_name.

select * from sys.database_files 
+1

mais quelle entrée utilisez-vous? dans mon cas, j'ai mes bases de données master/msdb/model dans un répertoire différent de mes bases de données utilisateur ..... –

+0

"toujours aux côtés d'autres bases de données" est ce que je suis parti de la question.Il ne demandait pas forcément comment trouver le répertoire de données par défaut car marc_s spécifiait la solution. Vraiment ressembler à 2 problèmes différents IMO. Dans plusieurs cas que j'administre, nous devons avoir plusieurs lecteurs qui hébergent des bases de données différentes pour des raisons de performances, ce qui rend le répertoire de données par défaut un mauvais choix dans la plupart des cas pour cette situation. –

+0

désolé pour la confusion. Il était mal formulé et alors que j'étais vraiment après le répertoire de données par défaut, cette réponse est tout aussi valide, donc je l'ai aussi mise à jour. Merci – Dolbz

0

L'extrait de code ci-dessous est ce que j'ai extrait de SQL Profiler. Je l'ai modifié un peu pour supprimer les colonnes moins utiles. Le code renvoie à présent une rangée avec les colonnes suivantes:

  • IsFullTextInstalled
  • MasterDBLogPath
  • MasterDBPath
  • ErrorLogPath
  • RootDirectory
  • IsCaseSensitive
  • MaxPrecision
  • VersionString (par exemple, 10,50. 2500.0)
  • Edition (par ex. Developer Edition (64-bit))
  • ProductLevel (par exemple SP1)
  • IsSingleUser
  • EngineEdition (par exemple 3)
  • Collation (par exemple Latin1_General_CI_AS)
  • IsClustered
  • NetName (par exemple votre nom d'hôte)
  • BuildClrVersionString (par exemple v2.0.50727)

Bonne chance.

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] 
Questions connexes