-- =============================================
-- Autor: Microsoft
-- Data de criação: 2010-02-06
-- Descrição: Backup de bancos de dados para SQLExpress
-- Parâmetro1: nome do banco de dados
-- Parameter2: backupType F=full, D=differential, L=log
-- Parâmetro3: localização do arquivo de backup
-- =============================================
CREATE PROCEDURE [dbo].[sp_BackupDatabases]
@databaseName sysname = null,
@backupType CHAR(1),
@backupLocation nvarchar(200)
AS
SET NOCOUNT ON;
DECLARE @DBs TABLE
(
ID int IDENTITY PRIMARY KEY,
DBNAME nvarchar(500)
)
-- Selecionar apenas bancos de dados que estejam online caso TODOS os bancos de
dados sejam escolhidos para o backup
-- Se um banco de dados específico for escolhido para backup, selecioná-lo apenas
entre @DBs
INSERT INTO @DBs (DBNAME)
SELECT Name FROM [Link]
where state=0
AND name=@DatabaseName
OR @DatabaseName IS NULL
ORDER BY Name
-- Filtrar bancos de dados dos quais não é preciso fazer backup
IF @backupType='F'
BEGIN
DELETE @DBs where DBNAME IN
('tempdb','Northwind','pubs','AdventureWorks','master','model','msdb',
'ReportServer','ReportServerTempDB','SANKHYA_TESTE','SANKHYA_TREINA')
END
ELSE IF @backupType='D'
BEGIN
DELETE @DBs where DBNAME IN
('tempdb','Northwind','pubs','AdventureWorks','master','model','msdb',
'ReportServer','ReportServerTempDB','SANKHYA_TESTE','SANKHYA_TREINA')
END
ELSE IF @backupType='L'
BEGIN
DELETE @DBs where DBNAME IN
('tempdb','Northwind','pubs','AdventureWorks','master','model','msdb',
'ReportServer','ReportServerTempDB','SANKHYA_TESTE','SANKHYA_TREINA')
END
ELSE
BEGIN
RETURN
END
-- Declarar variáveis
DECLARE @BackupName varchar(100)
DECLARE @BackupFile varchar(100)
DECLARE @DBNAME varchar(300)
DECLARE @sqlCommand NVARCHAR(1000)
DECLARE @dateTime NVARCHAR(20)
DECLARE @Loop int
-- Executar um loop pelos bancos de dados, um por um
SELECT @Loop = min(ID) FROM @DBs
WHILE @Loop IS NOT NULL
BEGIN
-- Os Nomes de Bancos de Dados devem estar no formato [dbname], pois alguns têm -
ou _ no nome
SET @DBNAME = '['+(SELECT DBNAME FROM @DBs WHERE ID = @Loop)+']'
-- Definir a data e a hora atuais n formato aaaahhmmss
SET @dateTime = REPLACE(CONVERT(VARCHAR, GETDATE(),101),'/','') + '_' +
REPLACE(CONVERT(VARCHAR, GETDATE(),108),':','')
-- Criar um nome de arquivo de backup no formato caminho\nome_de_arquivo.extensão
para backups completos, diferenciais e de log
IF @backupType = 'F'
SET @BackupFile = @backupLocation+REPLACE(REPLACE(@DBNAME,
'[',''),']','')+ '_FULL_'+ @dateTime+ '.BAK'
ELSE IF @backupType = 'D'
SET @BackupFile = @backupLocation+REPLACE(REPLACE(@DBNAME,
'[',''),']','')+ '_DIFF_'+ @dateTime+ '.BAK'
ELSE IF @backupType = 'L'
SET @BackupFile = @backupLocation+REPLACE(REPLACE(@DBNAME,
'[',''),']','')+ '_LOG_'+ @dateTime+ '.TRN'
-- Fornecer um nome para o backup para armazenar na mídia
IF @backupType = 'F'
SET @BackupName = REPLACE(REPLACE(@DBNAME,'[',''),']','') +' full
backup for '+ @dateTime
IF @backupType = 'D'
SET @BackupName = REPLACE(REPLACE(@DBNAME,'[',''),']','') +'
differential backup for '+ @dateTime
IF @backupType = 'L'
SET @BackupName = REPLACE(REPLACE(@DBNAME,'[',''),']','') +' log backup
for '+ @dateTime
-- Gerar o comando SQL dinâmico a ser executado
IF @backupType = 'F'
BEGIN
SET @sqlCommand = 'BACKUP DATABASE ' +@DBNAME+ ' TO DISK =
'''+@BackupFile+ ''' WITH INIT, NAME= ''' +@BackupName+''', NOSKIP, NOFORMAT'
END
IF @backupType = 'D'
BEGIN
SET @sqlCommand = 'BACKUP DATABASE ' +@DBNAME+ ' TO DISK =
'''+@BackupFile+ ''' WITH DIFFERENTIAL, INIT, NAME= ''' +@BackupName+''', NOSKIP,
NOFORMAT'
END
IF @backupType = 'L'
BEGIN
SET @sqlCommand = 'BACKUP LOG ' +@DBNAME+ ' TO DISK =
'''+@BackupFile+ ''' WITH INIT, NAME= ''' +@BackupName+''', NOSKIP, NOFORMAT'
END
-- Executar o comando SQL gerado
EXEC(@sqlCommand)
-- Ir para o próximo banco de dados
SELECT @Loop = min(ID) FROM @DBs where ID>@Loop
END