Я пытаюсь записать сценарий, который автоматически восстанавливает резервное копирование базы данных. Я знаю, что могу использовать следующую команду 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 программно?
Единственное приемлемое решение, которое я нашел, это проверка реестра с помощью вашего 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')
Вы можете запросить это из представления sys.database_files в базе данных, которую вы хотите восстановить вместе с физически. Вам придется удалить имя файла из конца столбца physical_name.
select * from sys.database_files