Я новичок в 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 = перезаписывать. Это необязательно, и если не указано иное, существующая БД не будет перезаписана, если она уже существует.Хранимая процедура довольно наивна и предполагает, что ваша база данных просто использует два файла по умолчанию - один для данных и один для журналов.
Если у вас более двух файлов, вам необходимо изменить процедуру для обработки этого условия.