2016-12-21 6 views
0

Цели хранимой процедуры восстановления из файла .bak, но хотелось бы иметь возможность ввести имя БД в качестве параметра, т.е. Exec sp_restore @dbnameSQL Server восстановление прока с параметром имени базы данных

  • пути к .bak будет идентичным для всех dbs, т. е. все dbs являются dev-копиями одного и того же резервного копирования.
  • Каждый .mdf и .ldf будет иметь такое же имя, как и сам дб т.е. dbname = @dbname, mdf = D:\data\@dbname.mdf, ldf =D:\data\@dbname.ldf
  • пути к .mdf и .ldf будут одинаковыми для каждого дБ, т.е. D:\data\@dbname.mdf
+1

Переведено для ответа в соответствии с номинацией @MisterPositive. –

+0

@GuillaumeCR Я назначаю, что вы делаете это ответ сэр. –

+0

Похоже, вы хорошо знаете, как будет выглядеть эта процедура. Предложите свой первый проект proc, и я уверен, что вы получите полезную обратную связь. – tlemaster

ответ

1

Используя Sql Server Management Studio, вы можете приступить к выполнению операции восстановления. Перед выполнением задачи вы сможете увидеть кнопку «Сценарий». Это создаст скрипт со всеми параметрами, введенными вами вручную, включая mdf и ldf. Затем вы можете сохранить этот скрипт и выполнить его по своему усмотрению. Вы также можете изменить полученный сценарий, чтобы сделать имя базы данных входной переменной. Вы можете все сделать. Это SQL!

Script button

В примере сценарий, который восстанавливает МДФ базы данных и изменений и местоположение LDF файл будет выглядеть следующим образом:

RESTORE DATABASE [example] FROM DISK = N'E:\Backup\example.BAK' WITH FILE = 1, MOVE N'ExampleData' TO N'E:\dbfiles\example.mdf', MOVE N'example_log' TO N'E:\dbfiles\example.ldf', NOUNLOAD, STATS = 10 
GO 

Вы можете прочитать больше о RESTORE statement

Вы можете вставить сценарий в хранимой процедуре как таковой:

CREATE PROCEDURE RestoreDb 
    -- Add the parameters for the stored procedure here 
    @dbName nvarchar(50) 
AS 
BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    SET NOCOUNT ON; 

    -- Insert statements for procedure here 
    RESTORE DATABASE @dbName FROM DISK = N'C:\Data\MSSQL\Backup\lolwut.bak' WITH FILE = 1, NOUNLOAD, STATS = 10 

END 
GO 
+0

Я сделал много восстановлений с помощью графического интерфейса пользователя и не знаю, где находится «кнопка сценария», о которой вы говорите. – MoneyMonk

+0

@ Acas77 Прямо там. –

+0

Нам еще нужно обновить SQL2000, поэтому у меня нет этой опции. – MoneyMonk

0

Процедура восстановления DB из bak-файла @DeviceName. Он работает с БД, у которых есть два логических файла. Как использовать:

EXEC RestoreDb @dbName='qqq', @DeviceName = 'D:\temp\1\R.bak' 

Извините за мой английский, я его улучшить.

CREATE PROCEDURE RestoreDb 
    @dbName NVARCHAR(50), 
    @DeviceName NVARCHAR(400) 
AS 
    SET NOCOUNT ON 

    DECLARE @Cmd NVARCHAR(1000), 
     @DataLogicalName NVARCHAR(200), 
     @LogLogicalName NVARCHAR(200), 
     @DatabasePath NVARCHAR(200), 
     @DataPath NVARCHAR(300), 
     @LogPath NVARCHAR(300) 

    CREATE TABLE #Files 
     (
     LogicalName   nvarchar(128), 
     PhysicalName  nvarchar(260), 
     [Type]    char(1), 
     FileGroupName  nvarchar(128), 
     Size    numeric(20,0), 
     MaxSize    numeric(20,0), 
     FileID    bigint, 
     CreateLSN   numeric(25,0), 
     DropLSN    numeric(25,0), 
     UniqueID   uniqueidentifier, 
     ReadOnlyLSN   numeric(25,0) , 
     ReadWriteLSN  numeric(25,0), 
     BackupSizeInBytes bigint, 
     SourceBlockSize  int, 
     FileGroupID   int, 
     LogGroupGUID  uniqueidentifier, 
     DifferentialBaseLSN numeric(25,0), 
     DifferentialBaseGUID uniqueidentifier, 
     IsReadOnly   bit, 
     IsPresent   bit, 
     TDEThumbprint  varbinary(32) 
     ) 

    SELECT @DatabasePath = 'D:\data\' 

    SELECT @DataPath = @DatabasePath + @dbName + '.mdf', 
     @LogPath = @DatabasePath + @dbName + '.ldf' 

    SELECT @Cmd = 'RESTORE FILELISTONLY 
    FROM DISK = ''' + @DeviceName + '''' 

    INSERT #Files 
    EXEC (@Cmd) 

    IF NOT EXISTS(SELECT 1 FROM #Files) GOTO ERRORFILES 

    IF (SELECT COUNT(*) FROM #Files) > 2 GOTO ERRORFILESCOUNT 

    SELECT @DataLogicalName = LogicalName 
    FROM #Files 
    WHERE [Type] = 'D' 

    SELECT @LogLogicalName = LogicalName 
    FROM #Files 
    WHERE [Type] = 'L' 

    RESTORE DATABASE @DbName 
    FROM DISK = @DeviceName 
    WITH 
    MOVE @DataLogicalName TO @DataPath, 
    MOVE @LogLogicalName TO @LogPath 

GOTO EXITSTAT 

ERRORFILES: 
    BEGIN 
     RAISERROR('The list of files contained in the backup set is empty', 16, 1) 
     GOTO EXITSTAT 
    END 

ERRORFILESCOUNT: 
    BEGIN 
     RAISERROR('The count of files contained in the backup set is more than two', 16, 1) 
     GOTO EXITSTAT 
    END 

EXITSTAT: 
Смежные вопросы