Alberto Mota Postado Janeiro 3, 2010 Denunciar Share Postado Janeiro 3, 2010 (editado) Prezados colegas, tentei adaptar uma rotina que encontrei no forumpara 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);varbancosFormatado: 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); 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 Janeiro 3, 2010 por Alberto Mota Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Jhonas Postado Janeiro 3, 2010 Denunciar Share Postado Janeiro 3, 2010 Prezados colegas, tentei adaptar uma rotina que encontrei no forumpara 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=MSSQLabraço Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Alberto Mota Postado Janeiro 3, 2010 Autor Denunciar Share Postado Janeiro 3, 2010 Jhonas, como sempre voce está certo. Alterei a linha que disse e resolveu.Mais uma vez, muito obrigado.Um abraço. Citar Link para o comentário Compartilhar em outros sites More sharing options...
Pergunta
Alberto Mota
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 MotaLink para o comentário
Compartilhar em outros sites
2 respostass a esta questão
Posts Recomendados
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.