Как можно клонировать базу данных SQL Server на том же сервере в SQL Server 2008 Express? - PullRequest
241 голосов
/ 30 сентября 2010

У меня есть система MS SQL Server 2008 Express, которая содержит базу данных, которую я хотел бы «копировать и переименовывать» (для целей тестирования), но я не знаю простого способа достижения этого.

Я заметил, что в версии SQL Server R2 есть мастер копирования баз данных, но, к сожалению, я не могу обновить.

База данных, о которой идет речь, - это концерт. Я попытался восстановить резервную копию базы данных, которую я хочу скопировать в новую базу данных, но безуспешно.

Ответы [ 13 ]

3 голосов
/ 04 июля 2018

Вы можете просто создать новую базу данных, а затем перейти к задачам, импортировать данные и импортировать все данные из базы данных, которую вы хотите дублировать, в базу данных, которую вы только что создали.

2 голосов
/ 15 февраля 2018

Сценарий, основанный на ответе Джо ( отсоединение, копирование файлов, вложение обоих ).

  1. Запуск Managment Studio от имени учетной записи администратора.

Этоне обязательно, но возможно ошибка доступа запрещена при выполнении.

Настройка сервера sql для выполнения xp_cmdshel
EXEC sp_configure 'show advanced options', 1
GO
RECONFIGURE
GO
EXEC sp_configure 'xp_cmdshell', 1
GO
RECONFIGURE
GO
Запустите скрипт, но введите свои имена БД в переменных @dbName и @copyDBName.
USE master;
GO 

DECLARE @dbName NVARCHAR(255) = 'Products'
DECLARE @copyDBName NVARCHAR(255) = 'Products_branch'

-- get DB files
CREATE TABLE ##DBFileNames([FileName] NVARCHAR(255))
EXEC('
    INSERT INTO ##DBFileNames([FileName])
    SELECT [filename] FROM ' + @dbName + '.sys.sysfiles')

-- drop connections
EXEC('ALTER DATABASE ' + @dbName + ' SET OFFLINE WITH ROLLBACK IMMEDIATE')

EXEC('ALTER DATABASE ' + @dbName + ' SET SINGLE_USER')

-- detach
EXEC('EXEC sp_detach_db @dbname = ''' + @dbName + '''')

-- copy files
DECLARE @filename NVARCHAR(255), @path NVARCHAR(255), @ext NVARCHAR(255), @copyFileName NVARCHAR(255), @command NVARCHAR(MAX) = ''
DECLARE 
    @oldAttachCommand NVARCHAR(MAX) = 
        'CREATE DATABASE ' + @dbName + ' ON ', 
    @newAttachCommand NVARCHAR(MAX) = 
        'CREATE DATABASE ' + @copyDBName + ' ON '

DECLARE curs CURSOR FOR 
SELECT [filename] FROM ##DBFileNames
OPEN curs  
FETCH NEXT FROM curs INTO @filename
WHILE @@FETCH_STATUS = 0  
BEGIN
    SET @path = REVERSE(RIGHT(REVERSE(@filename),(LEN(@filename)-CHARINDEX('\', REVERSE(@filename),1))+1))
    SET @ext = RIGHT(@filename,4)
    SET @copyFileName = @path + @copyDBName + @ext

    SET @command = 'EXEC master..xp_cmdshell ''COPY "' + @filename + '" "' + @copyFileName + '"'''
    PRINT @command
    EXEC(@command);

    SET @oldAttachCommand = @oldAttachCommand + '(FILENAME = "' + @filename + '"),'
    SET @newAttachCommand = @newAttachCommand + '(FILENAME = "' + @copyFileName + '"),'

    FETCH NEXT FROM curs INTO @filename
END
CLOSE curs 
DEALLOCATE curs

-- attach
SET @oldAttachCommand = LEFT(@oldAttachCommand, LEN(@oldAttachCommand) - 1) + ' FOR ATTACH'
SET @newAttachCommand = LEFT(@newAttachCommand, LEN(@newAttachCommand) - 1) + ' FOR ATTACH'

-- attach old db
PRINT @oldAttachCommand
EXEC(@oldAttachCommand)

-- attach copy db
PRINT @newAttachCommand
EXEC(@newAttachCommand)

DROP TABLE ##DBFileNames
2 голосов
/ 10 октября 2016

Другой способ добиться цели с помощью мастера импорта / экспорта , сначала создать пустую базу данных, затем выбрать источник, который является вашим сервером с исходной базой данных, а затем в пункте назначения выбрать тот же сервер.с целевой базой данных (используя пустую базу данных, которую вы сначала создали), затем нажмите Finish

. Она создаст все таблицы и перенесет все данные в новую базу данных,

...