Назад | Перейти на главную страницу

Создание копии схемы на сервере MS SQL

Я новичок в MS SQL server. Мне нужно создать тестовую базу данных из существующей тестовой базы данных с той же схемой, получить данные из производства и заполнить вновь созданную пустую базу данных. Для этого я использовал генерацию скриптов в SSMS. Но теперь мне нужно делать это регулярно на работе. Пожалуйста, объясните мне, как я могу автоматически создавать пустые базы данных в определенный момент времени.

Спасибо

Венкатеш

Вот быстрая и грязная хранимая процедура, которую я создал на основе этот ответ на переполнении стека:

CREATE PROCEDURE CloneDatabase
(
  @SrcDB VARCHAR(250), -- source DB
  @DstDB VARCHAR(250), -- destination DB
  @DataDir VARCHAR(250), -- where to put cloned database
  @LogDir VARCHAR(250) = NULL, -- where to put cloned DB logs
  @BackupDir VARCHAR(250) = NULL, -- folder to use for backup
  @Overwrite BIT = 0 -- Set to 1 if Destination DB should be dropped
)
AS

------------------------------------
IF @LogDir IS NULL SET @LogDir = @DataDir
IF @BackupDir IS NULL SET @BackupDir = @DataDir

/* PART 1: Backup the good database */

DECLARE @BackupFile VARCHAR(250)
DECLARE @BackupName VARCHAR(250) 
SET @BackupFile = @BackupDir + @SrcDB + '.bak'
SET @BackupName = N' - Full Database Backup of: ' + @SrcDB

PRINT 'Backup to: ' + @BackupFile

BACKUP DATABASE @SrcDB 
  TO  DISK = @BackupFile WITH NOFORMAT, 
  INIT,  
  NAME = @BackupName, SKIP, 
  NOREWIND, 
  NOUNLOAD,  
  STATS = 33

-- Check to see if we should overwrite if the destination already exists
DECLARE @DoRestore BIT 
SET @DoRestore = 0

IF NOT EXISTS (SELECT name FROM sys.databases WHERE name = @DstDB) OR @Overwrite = 1
BEGIN
  SET @DoRestore = 1
END

IF @DoRestore = 1
BEGIN
  /* PART 3: Restore the backup to the new location */

  --
  -- Find out our logical file names in the source DB. 
  -- This is slightly naive and assumes that there is just one log file 
  -- and one datafile, so beware!
  --

  DECLARE @LogicalDataFileName VARCHAR(250), @LogicalLogfileName VARCHAR(250)
  SET @LogicalDataFileName = 
    (SELECT m.Name FROM sys.databases d 
    JOIN sys.master_files m ON m.database_id = d.database_id
    WHERE d.name = @SrcDB AND m.type = 0 AND m.state = 0)

  SET @LogicalLogfileName = 
    (SELECT m.Name FROM sys.databases d 
    JOIN sys.master_files m ON m.database_id = d.database_id
    WHERE d.name = @SrcDB AND m.type = 1 AND m.state = 0)

  DECLARE @DstPhysicalDataFileName VARCHAR(250)
  DECLARE @DstPhysicalLogFileName VARCHAR(250) 
  SET @DstPhysicalDataFileName = @DataDir + @DstDb + '.mdf'
  SET @DstPhysicalLogFileName = @DataDir + @DstDb + '_log.ldf'

  RESTORE DATABASE @DstDB
      FROM DISK = @BackupFile WITH FILE = 1,  
      MOVE @LogicalDataFileName TO @DstPhysicalDataFileName,  
      MOVE @LogicalLogfileName TO @DstPhysicalLogFileName,  
      REPLACE,
      NOUNLOAD,
      STATS = 33

  /* PART 4: Delete all tables' data in the clone */

  PRINT N'Clearing down data: ' + @DstDB
  DECLARE @SQL VARCHAR(MAX)
  SET @SQL = 'USE ' + @DstDB + ' ; ' +
     'EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all"; ' +
     'EXEC sp_MSForEachTable "DELETE FROM ?"; ' + 
     'EXEC sp_msforeachtable "ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all";'
  EXEC(@SQL)
END

Выполнить:

EXEC CloneDatabase 
  @SrcDB = 'SourceDatabase',
  @DstDB = 'DestinationDatabase',
  @DataDir = 'd:\MSSQL\data\',
  @LogDir = 'd:\MSSQL\Logs\'

Всего шесть параметров:

  • @SrcDB - имя исходной БД, которую вы хотите клонировать
  • @DstDB - имя целевой БД, в которую вы хотите клонировать
  • @DataDir - физическая папка, в которой должен быть восстановлен файл данных клонированной БД
  • @LogDir - физическая папка, в которую должен быть восстановлен файл журнала клонированной БД. Это необязательно, и если вы его не укажете, файл журнала будет восстановлен в @DataDir
  • @BackupDir - где создать резервную копию. Это необязательно, и если не указывать, вызовет @DataDir папка, которая будет использоваться
  • @OverWrite - флаг, указывающий, следует ли принудительно перезаписывать базу данных назначения, если она уже существует: 0 = не перезаписывать, 1 = перезаписывать. Это необязательно, и если не указано иное, существующая БД не будет перезаписана, если она уже существует.

Хранимая процедура довольно наивна и предполагает, что ваша база данных просто использует два файла по умолчанию - один для данных и один для журналов.

Если у вас более двух файлов, вам необходимо изменить процедуру для обработки этого условия.