Почему бы не создать резервную копию базы данных и восстановить ее?
Вы можете без проблем выполнять резервное копирование и восстановление из своего веб-приложения. Вероятно, вы должны написать код для обработки резервной копии в хранимой процедуре вместо того, чтобы пытаться записать логику в код приложения. Что-то вроде:
CREATE PROCEDURE dbo.InitiateClone
@DBName SYSNAME
AS
BEGIN
SET NOCOUNT ON;
DECLARE @sql NVARCHAR(MAX);
SET @sql = N'BACKUP DATABASE ' + QUOTENAME(@DBName)
+ ' TO DISK = ''\\Common_network_path\wherever\' + @DBName + '.BAK''
+ WITH INIT;';
EXEC sp_executesql @sql;
SET @sql = N'SELECT name, type_desc FROM sys.
END
GO
Теперь приложение, которое запрашивает для резервного копирования может потреблять данные и имя файла журнала, чтобы перейти к процедуре на другом сервере:
CREATE PROCEDURE dbo.FinishClone
@NewDBName SYSNAME,
@OldDBName SYSNAME,
@DataFileName VARCHAR(255),
@LogFileName VARCHAR(255)
AS
BEGIN
SET NOCOUNT ON;
DECLARE @sql NVARCHAR(MAX);
SET @sql = N'RESTORE DATABASE ' + QUOTENAME(@NewDBName)
+ ' FROM DISK = ''\\Common_network_path\wherever\' + @OldDBName + '.BAK''
+ ' WITH MOVE ''' + @DataFileName + ''' TO ''D:\datapath\'
+ @NewDBName + '_data.mdf'','
+ ' MOVE ''' + @LogFileName + ''' TO ''D:\logpath\'
+ @NewDBName + '_log.ldf'';';
EXEC sp_executesql @sql;
END
GO
Единственное, что вам нужно беспокоиться о том, что два пользователя пытаются клонировать одну и ту же исходную базу данных одновременно, поэтому вы можете захотеть установить там какую-либо систему управления очередью или семафором. Я также пропустил обработку ошибок для краткости (например, убедитесь, что новое имя еще не существует). Он также предполагает, что у вас есть простые базы данных (один файл данных и один файл журнала). Но это начало.
EDIT, так как мы знаем назначения является Azure:
С Azure Я думаю, что ваши возможности ограничены. Я не думаю, что вы можете выполнить восстановление таким образом. Как вы собираетесь инициировать создание новой базы данных на Azure? Как только это будет сделано, вы все равно можете рассмотреть некоторые из сторонних инструментов для сравнения и синхронизации. Например, у инструментов Red Gate есть интерфейсы командной строки, что означает, что вы можете их явно вызвать в ответ на запросы своего веб-приложения.
Какое странное требование. Пользователь в веб-приложении хочет клонировать целую базу данных? –
Если вам нужно вставлять/обновлять/удалять строки между базами данных, вы, конечно же, не * клонирование * базы данных. Если это так, вы можете просто создать резервную копию промежуточной базы данных и восстановить ее для производства. Какова ваша цель? План поддержки SQL Server, пакет SSIS или хранимая процедура могут быть более подходящим местом для этого типа логики. Ваш веб-интерфейс может отбросить одну из этих вещей. –
@TimSchmelter Я тоже так думал, но я исхожу из предположения, что это плохой английский, а конечный пользователь - клиент. Но я уверен, что вы знаете, что говорят о предположениях ... – Pete