Определение канала передачи данных SQL для DB ВОССТАНАВЛИВАЕТ с ПЕРЕМЕЩЕНИЕМ

Я пытаюсь записать сценарий, который автоматически восстанавливает резервное копирование базы данных. Я знаю, что могу использовать следующую команду RESTORE:

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

Проблема с этим, я хочу смочь определить местоположение данных SQL-сервера (т.е. ДЛЯ соединения каналом) во времени выполнения, таким образом, восстановленная база данных последовательно помещается вместе с другими базами данных по этому серверу.

Восстанавливаемая база данных не будет существовать на сервере, которому она восстанавливается, и я требую операторов MOVE, поскольку исходный сервер, вероятно, будет SQL-сервером 2005, и цель является 2008 поэтому, пути к файлам, включенные в файл резервной копии, не желательны.

Таким образом, какие пути я мог определить местоположение данных SQL программно?

8
задан Dolbz 6 January 2010 в 16:19
поделиться

2 ответа

Единственное приемлемое решение, которое я нашел, это проверка реестра с помощью вашего 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'

Я мог бы поклясться, что путь к данным будет храниться где-нибудь в SERVERPROPERTY или в динамическом представлении управления (DMV) - но не повезло .......

Обновление: как указал @Mike - в SQL Server 2012 и более новых, эта информация доступна в виде SERVERPROPERTY:

SELECT 
    DefaultDataPath = SERVERPROPERTY('InstanceDefaultDataPath'),
    DefaultLogPath = SERVERPROPERTY('InstanceDefaultLogPath')
2
ответ дан 6 December 2019 в 00:57
поделиться

Вы можете запросить это из представления sys.database_files в базе данных, которую вы хотите восстановить вместе с физически. Вам придется удалить имя файла из конца столбца physical_name.

select * from sys.database_files
1
ответ дан 6 December 2019 в 00:57
поделиться