-- --データベースのバックアップを実行する -- IF EXISTS (SELECT name FROM sysobjects WHERE name = 'DB_BACKUP' AND type = 'P ') BEGIN DROP PROCEDURE DB_BACKUP END GO CREATE PROCEDURE DB_BACKUP @MODE INT, -- =0 全体バックアップ =1 差分 =2 ログ @DB_NAME SYSNAME , --バックアップを行なうデータベースの名前 @DIR_NAME VARCHAR(256) --バックアップを作成するディレクトリパス AS DECLARE @NOW DATETIME DECLARE @YY INT , @MON INT , @DAY INT DECLARE @HH INT , @MM INT DECLARE @FILE_NAME VARCHAR(256) DECLARE @SQL VARCHAR(512) SET NOCOUNT ON --現在の日付け、時間を数値に直す SELECT @NOW = GETDATE() SELECT @YY = DATEPART ( year , @NOW ) SELECT @MON = DATEPART ( month , @NOW ) SELECT @DAY = DATEPART ( day , @NOW ) SELECT @HH = DATEPART ( hour , @NOW ) SELECT @MM = DATEPART ( minute , @NOW ) --スケジュールの定義では、開始時刻が午前6時、終了時刻が午前0時のような --定義はできない(終了時刻を大きくしなければいけない) --そこで、開始時刻を午前0時、終了時刻を23時59分59秒として --プログラムの中で調整を行なう --ジョブを実行しない時間ですか? IF( 1<= @HH AND @HH <=5 ) BEGIN --午前1時から午前5時は、ジョブを実行しません RETURN END --全体バックアップを実行したときは、差分バックアップとログバックアップは --実行しません --ログバックアップ命令の後に差分バックアップが実行される --5分程度の時間誤差を許容します IF( @MODE=1 OR @MODE=2 ) BEGIN IF( (@HH%2)=0 AND ( 0<= @MM AND @MM <= 5 ) ) RETURN END --バックアップファイル名の作成 SELECT @FILE_NAME = @DIR_NAME + '\' + @DB_NAME + '_' + CASE @MODE WHEN 0 THEN 'FULL_'+CONVERT(VARCHAR,@NOW,112)+'.BAK' WHEN 1 THEN 'DIFF.BAK' WHEN 2 THEN 'LOG.BAK' END --バックアップ命令のSQL文を組み立てる IF( @MODE = 0 ) BEGIN SELECT @SQL = 'BACKUP DATABASE ' + @DB_NAME + ' TO DISK = ''' + @FILE_NAME + ''' ' IF( @HH = 0 ) BEGIN --新しいファイルを作成するときのオプションが何か必要なときはここに記述する --例えば WITH INITなど SELECT @SQL = @SQL + 'WITH INIT' END ELSE BEGIN --午前0時以外に実行されるときのオプションはここに記述する SELECT @SQL = @SQL + 'WITH NOINIT' END END IF( @MODE = 1 ) BEGIN --差分バックアップは常にメディアを新規作成で行なう SELECT @SQL = 'BACKUP DATABASE ' + @DB_NAME + ' TO DISK = ''' + @FILE_NAME + ''' ' + 'WITH DIFFERENTIAL , INIT ' END IF( @MODE = 2 ) BEGIN --ログバックアップは常にメディアを新規作成で行なう --ログは切捨てで行なう SELECT @SQL = 'BACKUP LOG ' + @DB_NAME + ' TO DISK = ''' + @FILE_NAME + ''' ' + 'WITH INIT ' END --バックアップを実行して終了 EXECUTE( @SQL ) RETURN GO