Array
(
)

Sysdatabases

Heavyromulo
   - 22 jun 2005

Pessoal, Tudo blz?
Estou com o seguinte problema:
Criei uma SP para efetuar backup das minhas bases de dados (peguei o código na net mesmo) quando executo pelo Query Analyser funciona que é uma beleza mas quando tento executar da SP dá o seguinte erro:
´Invalid Object Name ´Sysdatabases´. Como resolvo isso?!

Segue abaixo o código da SP para melhor esclarecimento:

Create proc SP_Executa_Backup
(@PathBackup VarChar(240))
As

/*PARTE DE DECLARAÇÃO DE VARIÁVEIS*/

/* Variáveis utilizadas para montar o nome do arquivo de backup e o nome dos devices para backup*/
DECLARE @Data varchar(20), @Data1 varchar(20), @ExtensaoArquivoBAckup varchar(4)
DECLARE @Nome_Data_Base_Device varchar(255), @Nome_Data_Base_Backup varchar(255)

set @Data = rtrim(CONVERT(char,getdate(), 112)) /*Variável que guarda a data em formato universal para compor o nome do arquivo de backup*/
set @Data1 = rtrim(CONVERT(char,getdate() - 1, 112)) /*Variável que guarda a data em formato universal para compor o nome do arquivo de backup*/
set @PathBackup = RTrim( @PathBackup )
set @ExtensaoArquivoBAckup = ´.BAK´

/*PARTE DE CONFIGURACAO DOS DEVICES*/

/*Seleciono os bancos que farei backup*/
DECLARE data_bases CURSOR FOR SELECT Name FROM sysdatabases WHERE Name not in (´master´,´model´,´msdb´,´Northwind´,´pubs´,´tempdb´)
OPEN data_bases
FETCH NEXT FROM data_bases INTO @Nome_Data_Base_Device
WHILE @@FETCH_STATUS = 0
BEGIN
if EXISTS (select Name FROM sysdevices WHERE Name = @Nome_Data_Base_Device)
Begin
EXEC sp_dropdevice @Nome_Data_Base_Device
end
set @Nome_Data_Base_Backup = @PathBackup + @Nome_Data_Base_Device + ´_´ + @Data + @ExtensaoArquivoBAckup
EXEC sp_addumpdevice ´disk´, @Nome_Data_Base_Device, @Nome_Data_Base_Backup
FETCH NEXT FROM data_bases INTO @Nome_Data_Base_Device
END
CLOSE data_bases
DEALLOCATE data_bases

/*PARTE DE BACKUP DOS BANCOS DE DADOS*/

DECLARE @Nome_Data_Base varchar(50) /*Variável que guarda o nome do banco de dados*/
DECLARE data_bases CURSOR FOR SELECT Name FROM sysdatabases WHERE Name not in (´master´,´model´,´msdb´,´Northwind´,´pubs´,´tempdb´)
OPEN data_bases
FETCH NEXT FROM data_bases INTO @Nome_Data_Base
WHILE @@FETCH_STATUS = 0
BEGIN
BACKUP DATABASE @Nome_Data_Base TO @Nome_Data_Base
FETCH NEXT FROM data_bases INTO @Nome_Data_Base
END
CLOSE data_bases
DEALLOCATE data_bases

/*PARTE DE DELEÇÃO DOS DEVICES PARA OS BANCOS DE DADOS QUE NÃO EXISTEM MAIS*/

DECLARE devices CURSOR FOR SELECT Name FROM sysdevices WHERE Name not in (´master´,´mastlog´,´modeldev´,´modellog´,´tempdev´,´templog´)
OPEN devices
FETCH NEXT FROM devices INTO @Nome_Data_Base_Device
WHILE @@FETCH_STATUS = 0
BEGIN
if ((SELECT COUNT(Name) FROM sysdatabases WHERE Name = @Nome_Data_Base_Device)= 0)
Begin
EXEC sp_dropdevice @Nome_Data_Base_Device
End
FETCH NEXT FROM devices INTO @Nome_Data_Base_Device
END
CLOSE devices
DEALLOCATE devices

/*PARTE DE DELEÇÃO DOS BACKUPS FEITOS X DIAS ANTES DA ÚLTIMA EXECUÇÃO*/

DECLARE @pObj int, @FileNameDeleted varchar (100)
DECLARE data_bases CURSOR FOR SELECT Name FROM sysdatabases WHERE Name not in (´master´,´model´,´msdb´,´Northwind´,´pubs´,´tempdb´)
OPEN data_bases
FETCH NEXT FROM data_bases INTO @Nome_Data_Base
EXEC sp_OACreate ´Scripting.FileSystemObject´, @pObj OUT

WHILE @@FETCH_STATUS = 0
BEGIN
set @FileNameDeleted = @PathBackup + @Nome_Data_Base + ´_´ + @Data1 + @ExtensaoArquivoBAckup
EXEC sp_OAMethod @pObj, ´DeleteFile´, null, @FileNameDeleted
FETCH NEXT FROM data_bases INTO @Nome_Data_Base
END
EXEC sp_OADestroy @pObj
CLOSE data_bases
DEALLOCATE data_bases
GO

Valeu pessoal!

Marcus.magalhaes
   - 22 jun 2005

Bom dia.

Vc deve ter criado esta procedure em uma base de dados que não foi a master (o q é correto), 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: master..sysdatabases

Espero ter ajudado.

Att,