notebook/IT/SQL/SCRIPTS SQL QSA ORSYS/Proc BACKUP.sql
2020-11-26 18:38:25 +01:00

74 lines
3.4 KiB
Transact-SQL

USE msdb;
GO
CREATE PROCEDURE dbo.P_BACKUP
@MODE CHAR(1), -- L : LOG, C : COMPLETE, D : DIFFERENTIAL
@PATH NVARCHAR(256),
@DATETIME BIT = 1,
@RETAINSDAYS TINYINT
AS
/******************************************************************************
* NATURE : PROCEDURE *
* OBJECT : msdb.dbo.P_BACKUP *
* CREATE : 2020-06-26 *
* VERSION : 1 *
* SYSTEM :NON *
*******************************************************************************
* Frédéric BROUARD - alias SQLpro - SARL SQL SPOT - SQLpro@sqlspot.com *
* Architecte de données : expertise, audit, conseil, formation, modélisation *
* tuning, sur les SGBD Relationnels, le langage SQL, MS SQL Server/PostGreSQL *
* blog: http://blog.developpez.com/sqlpro site: http://sqlpro.developpez.com *
*******************************************************************************
* PURPOSE : sauvegarde de toutes les bases d'une instance *
*******************************************************************************
* INPUTS : *
* @MODE CHAR(1), L : LOG, C : COMPLETE, D : DIFFERENTIAL *
* @PATH NVARCHAR(256), chemin vers le répertoire de sauvegarde *
* @DATETIME BIT = 1, ajoute ou non la date heure dans le nom du fichier *
* de sauvegarde *
* @RETAINSDAYS TINYINT si pas de dateheure dans le fichier de sauvegarde *
* alors cumule les sauvegarde mais ne retient que les *
* n dernier jours *
*******************************************************************************
* EXEMPLE : *
* EXEC dbo.P_BACKUP 'C', 'C:\DATABASE\BACKUP', 1, NULL; *
******************************************************************************/
SET NOCOUNT ON;
SET @MODE = UPPER(@MODE);
IF RIGHT(@PATH, 1) <> '\'
SET @PATH = @PATH + '\';
DECLARE @SQL NVARCHAR(max) = N'';
SELECT @SQL = @SQL + N'BACKUP ' +
CASE @MODE
WHEN N'L' THEN N'LOG '
ELSE N'DATABASE '
END + N'[' + name + '] TO DISK = ''' + @PATH + name +
CASE @DATETIME
WHEN 1 THEN N'_' + CONVERT(NVARCHAR(32), SYSDATETIME(), 121)
ELSE ''
END +
CASE @MODE
WHEN N'L' THEN N'.TRN'
ELSE N'.BAK'
END + '''' +
CASE WHEN @RETAINSDAYS IS NOT NULL AND @DATETIME = 0
THEN N' WITH RETAINDAYS = ' + CAST(@RETAINSDAYS AS VARCHAR(16))
ELSE N''
END + N';'
FROM sys.databases
WHERE state = 0
AND source_database_id IS NULL
AND name NOT in ('model', 'tempdb')
AND 1 = CASE WHEN @MODE = 'L' AND recovery_model = 3 THEN 0
ELSE 1 END;
GO
--> planif de la sauvegarde FULL tous les jours
EXEC dbo.P_BACKUP 'C', 'C:\DATABASE\BACKUP', 1, NULL;
--> planif de la sauvegarde TRAN toutes les 30 minutes
EXEC dbo.P_BACKUP 'L', 'C:\DATABASE\BACKUP', 1, NULL;