2009-04-16 4 views
6

У меня есть небольшая база данных SQL Server, которую мне нужно скопировать по команде - мне нужно иметь возможность принимать файлы mfd и ldf в любой момент времени, копировать их, , и сделать их доступными для конечного пользователя.Программно отсоединить базу данных SQL Server для копирования файла mdf

Сейчас это возможно, вручную:

1) Вход на сервер SQL с помощью удаленного рабочего стола

2) отсоединение базы данных с помощью SQL Management Studio. Я должен возиться с комбинацией настройки базы данных на single_user и/или перезапуска службы, чтобы я мог ее отделить, поскольку сервер приложений обычно регистрируется в ней.

3) Во время отсоединения я просматриваю файловую систему и копирую файлы mdf и ldf.

4) Я снова присоединить базу данных с помощью SQL Management Studio

5) Я пронестись скопированные файлы, и я переместить их на FTP-сервер, чтобы люди, которые нуждаются в них могут получить их.

Это ужасный, неэффективный процесс. Речь идет не просто о необходимости схемы, а о необходимости того, чтобы люди работали со снимками реальных производственных данных на своих собственных машинах с целью деструктивного экспериментирования. К счастью, база данных zipped очень маленькая - может быть, 30 мегабайт с журналом.

В идеале я хотел бы создать страницу в веб-приложении ASP.NET, на которой есть кнопка, которую пользователь может нажать, чтобы начать упаковку текущей базы данных в zip-файл, а затем я просто предоставил ссылка на загрузку файла.

ответ

9

Почему бы не сделать обычную резервную копию (легко сделать с SqlCommand) и добавить функцию для пользователей легко восстановить этот файл резервной копии одним нажатием кнопки?

  • Вы можете создать резервную копию базы данных с SQL-команд
  • Вы можете выложить и заархивировать BackupFile с SQL-команд
  • Вы также можете выложить и FTP в BackupFile автомагически к веб-серверу, если вы хотите.

Каковы конечные пользователи, потребляющие ваш дБ? Winform-программа? Затем легко сделать все, нажав кнопку мыши для пользователя.

Вот несколько примеров кода для этого:

Declare @CustomerID int 
declare @FileName nvarchar(40) 
declare @ZipFileName nvarchar(40) 
declare @ZipComand nvarchar(255) 


set @CustomerID=20 --Get from database instead in real life application 
SET @FileName='c:\backups\myback'+ cast(@customerID as nvarchar(10))+'.bak' 
SET @ZipFileName='c:\backups\myback'+ cast(@customerID as nvarchar(10))+'.zip' 

--Backup database northwind 
backup database northwind to [email protected] 

--Zip the file, I got a commanddriven zip.exe from the net somewhere. 
set @ZipComand= 'zip.exe -r '[email protected]+' '[email protected] 
EXEC xp_cmdshell @zipcomand,NO_output 

--Execute the batfile that ftp:s the file to the server 
exec xp_cmdshell 'c:\movetoftp.bat',no_output 

--Done! 

Вы должны иметь movetoftp.bat, содержащий это (изменение FTP-сервера в):
FTP -s: ftpcommands.txt FTP. myftp.Чистая

И вы должны иметь ftpcommands.txt, содержащий это (Вы можете иметь этот файл, созданный dnamically только с правой зип-файл по sqlcommands тоже, но я позволю вам сделать это самостоятельно):

ftpusername
ftppassword
двоичный
проворная п
MPUT с:. \ подпорки \ * почтовый
бросить

8

Посмотрите на диалоги, которые вы используете в SQL Management Studio, в верхней части каждого есть кнопка, которая создаст скрипт для выполнения действия. Это быстрый способ узнать, как это сделать в SQL, который может быть выполнен из подключения к базе данных.

E.g. для отсоединения базы данных DB1:

EXEC master.dbo.sp_detach_db @dbname = N'db1' 
+1

Указывая на наличие кнопки сценария был чрезвычайно полезен. +1 –

0

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

Причина, заключающаяся в отсоединении базы данных, делает ее недоступной для других пользователей.

0

Я бы использовал консольную версию SQL Dumper и сжимал свалку sql.

IMHO всегда лучше иметь текстовую копию вместо двоичного файла. Если что-то пойдет не так, по крайней мере, вы можете переписать свои данные вручную, потому что вы можете прочитать его.

0

Первое подключение к SQL Server без присоединения любого файла базы данных и без использования имени базы данных.

ConnectionString = @"Data Source=XXX;Integrated Security=True;Connect Timeout=30"; 

Примечание: XXX =. ИЛИ. \ SQLEXPRESS ИЛИ. \ MSSQLSERVER ИЛИ (местный) \ SQLEXPRESS ИЛИ (localdb) \ v11.0 & ...

затем по запросу Query Отсоедините файл базы данных.

"ALTER DATABASE [your DB] SET OFFLINE WITH ROLLBACK IMMEDIATE \n\r exec sp_detach_db @dbname = [your DB]"; 

Ok.

Мой Пример кода:

sql_connect1.ConnectionString = @"Data Source=.\sqlexpress;Integrated Security=True;Connect Timeout=30"; 
sql_command.CommandText = "ALTER DATABASE [IRAN] SET OFFLINE WITH ROLLBACK IMMEDIATE \n\r exec sp_detach_db @dbname = [IRAN]"; 
        sql_command.Connection = sql_connect1; 
        sql_connect1.Open(); 
        sql_command.ExecuteNonQuery(); 
        sql_connect1.Close(); 
Смежные вопросы