Solay 0 Denunciar post Postado Novembro 20, 2006 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
marcio.theis 3 Denunciar post Postado Novembro 20, 2006 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 SQLServerSe quiser pode pegar o exemplo que tenho... Compartilhar este post Link para o post Compartilhar em outros sites
Solay 0 Denunciar post Postado Novembro 20, 2006 Muito obrigada marcio.theis, vou testar. Compartilhar este post Link para o post Compartilhar em outros sites
marcio.theis 3 Denunciar post Postado Novembro 20, 2006 beleza... Testa ai e vê se funfa legal, para mim pelo menos sempre funcionou... :P Compartilhar este post Link para o post Compartilhar em outros sites
Solay 0 Denunciar post Postado Novembro 22, 2006 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
marcio.theis 3 Denunciar post Postado Novembro 22, 2006 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
Solay 0 Denunciar post Postado Novembro 22, 2006 Eu estou usando o usuário sa. Como assim salvar o comando SQL e executar diretamente no BD? Compartilhar este post Link para o post Compartilhar em outros sites
marcio.theis 3 Denunciar post Postado Novembro 22, 2006 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
Solay 0 Denunciar post Postado Novembro 27, 2006 Muito obrigada marcio.theis, funcionou direitinho. Compartilhar este post Link para o post Compartilhar em outros sites
marcio.theis 3 Denunciar post Postado Novembro 27, 2006 beleza... http://forum.imasters.com.br/public/style_emoticons/default/joia.gif http://forum.imasters.com.br/public/style_emoticons/default/joia.gif Compartilhar este post Link para o post Compartilhar em outros sites
Solay 0 Denunciar post Postado Dezembro 3, 2006 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.theis 3 Denunciar post Postado Dezembro 4, 2006 O certo realmente seria colocar o TimeOut como 0(zero).... no caso faz um teste não executando por dentro do programa... Compartilhar este post Link para o post Compartilhar em outros sites
Solay 0 Denunciar post Postado Dezembro 4, 2006 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
Solay 0 Denunciar post Postado Dezembro 11, 2006 Marcio, o backup está funcionando normalmente, foi uma falta de atenção minha, pois só coloquei commandtimeiout=0 no adoconnection e o commandtimeiout da adoquery estava igual a 30, assim que alterei na query tbm o backup funcionou. Muito obrigada..... http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif Compartilhar este post Link para o post Compartilhar em outros sites
marcio.theis 3 Denunciar post Postado Dezembro 11, 2006 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
Solay 0 Denunciar post Postado Dezembro 11, 2006 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
marcio.theis 3 Denunciar post Postado Dezembro 11, 2006 Usei o próprio WinZip, chamando ele, e passando os comandos... Se quiser pode dar uma olhada neste post, tem um exemplo de como fazer... Compartilhar este post Link para o post Compartilhar em outros sites
Solay 0 Denunciar post Postado Março 20, 2007 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
marcio.theis 3 Denunciar post Postado Março 20, 2007 Neste caso ele somente faz o backup da base. Compartilhar este post Link para o post Compartilhar em outros sites