Ir para conteúdo
Fórum Script Brasil
  • 0

(Resolvido) Backup Sql Server


Alberto Mota

Pergunta

Prezados colegas, tentei adaptar uma rotina que encontrei no forum

para através do delphi fazer o backup no sql server 2005 express.

Entretanto surge a mensagem de erro:

invalid object name 'sysdatabases'

Alguém poderia me dizer como solucionar?

De antemão agradeço. Segue a rotina a seguir:

procedure TFrmbackup.BitBtn1Click(Sender: TObject);

var

bancosFormatado: string;

begin

if 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);

BitBtn1.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;

Editado por Alberto Mota
Link para o comentário
Compartilhar em outros sites

2 respostass a esta questão

Posts Recomendados

  • 0
Prezados colegas, tentei adaptar uma rotina que encontrei no forum

para através do delphi fazer o backup no sql server 2005 express.

Entretanto surge a mensagem de erro:

invalid object name 'sysdatabases'

Alguém poderia me dizer como solucionar?

A cláusula na select deve seguir o padrão para a base de dados mestre (master), porém a tabela sysdatabases só existe na base master. Sendo assim, ao utilizar a sysdatabases no seu select, faça-o da seguinte forma:

exemplo:

SELECT name FROM master..sysdatabases

então na sua select deveria ficar assim:

qryExec.SQL.Add('DECLARE data_bases CURSOR FOR SELECT Name FROM master..sysdatabases WHERE Name in (''' + bancosFormatado + ''')');

Para maiores informações veja:

http://lab.mediaservice.net/notes_more.php?id=MSSQL

abraço

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,2k
    • Posts
      651,9k
×
×
  • Criar Novo...