Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Solay

Backup SQL Server por linhas de código

Recommended Posts

Pessoal preciso fazer uma rotina que gere backup do SQL Server em um programa em delphi 7. Será mostrado um botão para o usuário que ao clicar irá gerado um arquivo de backup, mas sem usar o SQL Server Agent.Estou em dúvida sobre como fazer essa rotina.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fiz um dia um programa que fazia o backup da base de dados em SQLServer, segue o código:

 

unit fPrincipal;interfaceuses  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  Dialogs, StdCtrls, Buttons, DB, ADODB, ExtCtrls, OpenDir;type  TfrmPrincipal = class(TForm)	Panel1: TPanel;	Panel2: TPanel;	BitBtn1: TBitBtn;	BitBtn2: TBitBtn;	ADOConnection: TADOConnection;	BitBtn3: TBitBtn;	edtBanco: TEdit;	Label1: TLabel;	Label2: TLabel;	edtDiretorio: TEdit;	BitBtn4: TBitBtn;	OpenDirectory: TOpenDirectory;	qryExec: TADOQuery;	procedure BitBtn1Click(Sender: TObject);	procedure BitBtn2Click(Sender: TObject);	procedure BitBtn3Click(Sender: TObject);	procedure BitBtn4Click(Sender: TObject);	function Bancos(listaBancos: string): string;  private	{ Private declarations }	banco: string;  public	{ Public declarations }  end;var  frmPrincipal: TfrmPrincipal;implementation{$R *.dfm}function TfrmPrincipal.Bancos(listaBancos: string): string;var	x: integer;	ret: string;beginret:='';for x:=1 to Length(listaBancos) do	begin	if listaBancos[x] = ',' then		ret:=ret + ''','''	else		ret:=ret + listaBancos[x];	end;Bancos:=ret;end;procedure TfrmPrincipal.BitBtn1Click(Sender: TObject);var	bancosFormatado: string;beginif Trim(edtBanco.Text) = '' then	begin	Application.MessageBox('Banco não informado','BackUp',MB_OK or MB_APPLMODAL or MB_ICONWARNING);	edtBanco.SetFocus;	Exit;	end;if Trim(edtDiretorio.Text) = '' then	begin	Application.MessageBox('Diretório não informado','BackUp',MB_OK or MB_APPLMODAL or MB_ICONWARNING);	BitBtn4.SetFocus;	Exit;	end;bancosFormatado:=Bancos(edtBanco.Text);qryExec.Close;qryExec.SQL.Clear;qryExec.SQL.Add('DECLARE @Data varchar(20), @Data1 varchar(20), @PathBackup varchar(255), @ExtensaoArquivoBAckup varchar(4)');qryExec.SQL.Add('DECLARE @Nome_Data_Base_Device varchar(255), @Nome_Data_Base_Backup varchar(255)');qryExec.SQL.Add('set @Data = rtrim(CONVERT(char,getdate(), 112))');qryExec.SQL.Add('set @Data1 = rtrim(CONVERT(char,getdate() - 1, 112))');qryExec.SQL.Add('set @PathBackup = ''' + edtDiretorio.Text + '''');qryExec.SQL.Add('set @ExtensaoArquivoBAckup = ''.bak''');qryExec.SQL.Add('DECLARE data_bases CURSOR FOR SELECT Name FROM sysdatabases WHERE Name in (''' + bancosFormatado + ''')');qryExec.SQL.Add('OPEN data_bases');qryExec.SQL.Add('FETCH NEXT FROM data_bases INTO @Nome_Data_Base_Device');qryExec.SQL.Add('WHILE @@FETCH_STATUS = 0');qryExec.SQL.Add('	BEGIN');qryExec.SQL.Add('	if EXISTS (select Name FROM sysdevices WHERE Name = @Nome_Data_Base_Device)');qryExec.SQL.Add('		Begin');qryExec.SQL.Add('		EXEC sp_dropdevice @Nome_Data_Base_Device');qryExec.SQL.Add('		end');qryExec.SQL.Add('	set @Nome_Data_Base_Backup = @PathBackup + @Nome_Data_Base_Device + ''_'' + @Data + @ExtensaoArquivoBAckup');qryExec.SQL.Add('	EXEC sp_addumpdevice ''disk'', @Nome_Data_Base_Device, @Nome_Data_Base_Backup');qryExec.SQL.Add('	FETCH NEXT FROM data_bases INTO @Nome_Data_Base_Device');qryExec.SQL.Add('	END');qryExec.SQL.Add('CLOSE data_bases');qryExec.SQL.Add('DEALLOCATE data_bases');qryExec.SQL.Add('DECLARE @Nome_Data_Base varchar(50)');qryExec.SQL.Add('DECLARE data_bases CURSOR FOR SELECT Name FROM sysdatabases WHERE Name in (''' + bancosFormatado + ''')');qryExec.SQL.Add('OPEN data_bases');qryExec.SQL.Add('FETCH NEXT FROM data_bases INTO @Nome_Data_Base');qryExec.SQL.Add('WHILE @@FETCH_STATUS = 0');qryExec.SQL.Add('	BEGIN');qryExec.SQL.Add('	BACKUP DATABASE @Nome_Data_Base TO @Nome_Data_Base');qryExec.SQL.Add('	FETCH NEXT FROM data_bases INTO @Nome_Data_Base');qryExec.SQL.Add('	END');qryExec.SQL.Add('CLOSE data_bases');qryExec.SQL.Add('DEALLOCATE data_bases');qryExec.SQL.Add('DECLARE devices CURSOR FOR SELECT Name FROM sysdevices WHERE Name in (''' + bancosFormatado + ''')');qryExec.SQL.Add('OPEN devices');qryExec.SQL.Add('FETCH NEXT FROM devices INTO @Nome_Data_Base_Device');qryExec.SQL.Add('WHILE @@FETCH_STATUS = 0');qryExec.SQL.Add('	BEGIN');qryExec.SQL.Add('	if ((SELECT COUNT(Name) FROM sysdatabases WHERE Name = @Nome_Data_Base_Device)= 0)');qryExec.SQL.Add('		Begin');qryExec.SQL.Add('		EXEC sp_dropdevice @Nome_Data_Base_Device');qryExec.SQL.Add('		End');qryExec.SQL.Add('	FETCH NEXT FROM devices INTO @Nome_Data_Base_Device');qryExec.SQL.Add('	END');qryExec.SQL.Add('CLOSE devices');qryExec.SQL.Add('DEALLOCATE devices');qryExec.SQL.Add('DECLARE @pObj int, @FileNameDeleted varchar (100)');qryExec.SQL.Add('DECLARE data_bases CURSOR FOR SELECT Name FROM sysdatabases WHERE Name in (''' + bancosFormatado + ''')');qryExec.SQL.Add('OPEN data_bases');qryExec.SQL.Add('FETCH NEXT FROM data_bases INTO @Nome_Data_Base');qryExec.SQL.Add('EXEC sp_OACreate "Scripting.FileSystemObject", @pObj OUT');qryExec.SQL.Add('WHILE @@FETCH_STATUS = 0');qryExec.SQL.Add('	BEGIN');qryExec.SQL.Add('	set @FileNameDeleted = @PathBackup + @Nome_Data_Base + ''_'' + @Data1 + @ExtensaoArquivoBAckup');qryExec.SQL.Add('	EXEC sp_OAMethod @pObj, "DeleteFile", null, @FileNameDeleted');qryExec.SQL.Add('	FETCH NEXT FROM data_bases INTO @Nome_Data_Base');qryExec.SQL.Add('	END');qryExec.SQL.Add('EXEC sp_OADestroy @pObj');qryExec.SQL.Add('CLOSE data_bases');qryExec.SQL.Add('DEALLOCATE data_bases');qryExec.ExecSQL;Application.MessageBox(PChar('Backup realizado em: ' + edtDiretorio.Text),'BackUp', MB_OK or MB_APPLMODAL or MB_ICONINFORMATION);end;procedure TfrmPrincipal.BitBtn2Click(Sender: TObject);beginclose;end;procedure TfrmPrincipal.BitBtn3Click(Sender: TObject);beginif not ADOConnection.Connected then	ADOConnection.Connected:=True;banco:=ADOConnection.DefaultDatabase;BitBtn1.Enabled:=True;end;procedure TfrmPrincipal.BitBtn4Click(Sender: TObject);beginif OpenDirectory.Execute then	begin	if copy(OpenDirectory.UncPath,1,2) = '\\' then		edtDiretorio.Text:=OpenDirectory.UncPath	else		edtDiretorio.Text:=OpenDirectory.DrivePath;	if copy(OpenDirectory.DrivePath,Length(OpenDirectory.DrivePath),Length(OpenDirectory.DrivePath)- 1) <> '\' then		edtDiretorio.Text:=edtDiretorio.Text + '\';	end;end;end.
Provavelmente terá de mudar algumas linhas, pois contém um componente que se pode selecionar um diretório... Mas no caso somente precisa passar o nome da base de dados que se deseja efetuar o backup, no caso oseu ADOConnection precisa se conectar com a base master do SQLServer

Se quiser pode pegar o exemplo que tenho...

Compartilhar este post


Link para o post
Compartilhar em outros sites

marcio.theis, o sistema retornou a seguinte mensagem de erro: O objeto ou provedor não é capaz de executar a operação solicitada. Será que é problema de versão do Provider=SQLReplication.OLEDB e o Sql Server?

Compartilhar este post


Link para o post
Compartilhar em outros sites

No caso você tentou acesso com o usuário sa ou algum outro quem poderes para este tipo de operação, certo ? Outra coisa que pode tentar é salvar o comando SQL e executar diretamente no BD para ver se funciona.

Compartilhar este post


Link para o post
Compartilhar em outros sites

No caso o que é passado para dentro da QRY é somente comando SQL, antes da dar o comando .ExecSQL, coloque:

 

qryExec.SQL.SaveToFile('c:\testeSQL.txt');

No caso ele vai salvar um arquivo de nome "testeSQL.txt" na pasta c:\, tente rodar no QueryAnalyzer para ver se funciona...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Marcio, estava funcionando o backup, mas agora está dando a mensagem de " tempo excedido ", já revisei todo a rotina e aparentemente está certo, mas a mensagem continua.Pesquisei na internet e as soluções dadas foram colocar colocar o commandtimeiout=0, mas não resolveu.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Marcio, pelo QueryAnalyzer funciona, ele faz o backup normalmente.Será que é algum problema com a rede, mas pelo QueryAnalyzer funcionou pela rede e no servidor, é estranho........deve estar faltando algum detalhezinho que não percebi.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Opa... coisa boa... aqui utilizo ele até hj... funciona que é uma beleza... coloquei ainda a opção de compactar em .ZIP e mover para outra pasta o arquivo... ficou show de bola... :D :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

Que componente você usou para compactar em .ZIP?Eu utilizei em outro sistema pra fazer compactação de arquitos txt o ZipTV Components free para delphi 7.

Compartilhar este post


Link para o post
Compartilhar em outros sites

OláEstou com mais uma dúvida......para restaurar esse backup, utizilei o comando RESTORE DATABASE, no QueryAnalyzer funcionou certo, mas quando executo pelo delphi ele dá erro, ele não acha o servidor, tem algum esquema de permissão ou coisa do genero para restaurar o backup?Muito obrigada pela ajuda.....

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.