/* Drop existing standard schedule for job */ declare @schedule_id int declare c_schedules cursor local forward_only static for select ss.schedule_id from msdb.dbo.sysjobschedules sjs INNER JOIN msdb.dbo.sysschedules ss ON sjs.schedule_id = ss.schedule_id AND ss.name NOT LIKE '%#SPEC#' INNER JOIN msdb.dbo.sysjobs sj ON sjs.job_id = sj.job_id WHERE sj.name = N'D91030 - Backup ActivePos_Read' open c_schedules FETCH NEXT FROM c_schedules into @schedule_id while @@fetch_status = 0 begin IF ((select COUNT(*) from msdb.dbo.sysjobschedules where schedule_id=@schedule_id) = 1) EXEC msdb.dbo.sp_delete_schedule @schedule_id=@schedule_id, @force_delete = 1 FETCH NEXT FROM c_schedules into @schedule_id end close c_schedules deallocate c_schedules IF EXISTS (SELECT job_id FROM msdb.dbo.sysjobs_view WHERE name = N'D91030 - Backup ActivePos_Read') EXEC msdb.dbo.sp_delete_job @job_name = N'D91030 - Backup ActivePos_Read', @delete_unused_schedule=0 GO /* Creation Job and Steps*/ BEGIN TRANSACTION DECLARE @ReturnCode INT SELECT @ReturnCode = 0 IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'TPH-Maintenance' AND category_class=1) BEGIN EXEC @ReturnCode = msdb.dbo.sp_add_category @class=N'JOB', @type=N'LOCAL', @name=N'TPH-Maintenance' IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback END /* Add Job */ DECLARE @jobId BINARY(16) EXEC @ReturnCode = msdb.dbo.sp_add_job @job_name=N'D91030 - Backup ActivePos_Read', @enabled=1, @notify_level_eventlog=0, @notify_level_email=0, @notify_level_netsend=0, @notify_level_page=0, @delete_level=0, @description=N'25.08.2020 - RTC - Integrate parrallele backup on multiple shared 28.10.2020 - SPE - Add more return code and tests in PS 15.02.2021 - SPE - Modifiy step 3 and 4 to use new settings 15.03.2021 - SPE - Add a new purge step for old backups 19.04.2021 - RTC - Update schedule : no run on sat 16.08.2021 - SPE - Integrate PS in job step 14.01.2022 - SPE - Activate CopyOnly mode 17.03.2022 - FLA - Change DBA mail 15.06.2022 - RTC - Update error management step 5', @category_name=N'TPH-Maintenance', @start_step_id=1, @owner_login_name=N'sa', @job_id = @jobId OUTPUT IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback /* Add Step */ EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Empty step', @step_id=1, @cmdexec_success_code=0, @on_success_action=3, @on_success_step_id=0, @on_fail_action=3, @on_fail_step_id=0, @retry_attempts=0, @retry_interval=0, @os_run_priority=0, @subsystem=N'TSQL', @command=N'/* Empty step */', @database_name=N'master', @output_file_name=NULL, @flags=0, @database_user_name=NULL, @server=NULL, @additional_parameters=NULL, @proxy_id=NULL, @proxy_name=NULL IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback /* Add Step */ EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Wait for a random delay of 0..5 minutes', @step_id=2, @cmdexec_success_code=0, @on_success_action=3, @on_success_step_id=0, @on_fail_action=3, @on_fail_step_id=0, @retry_attempts=0, @retry_interval=0, @os_run_priority=0, @subsystem=N'TSQL', @command=N'EXEC [dbo].[aps_Wait_Random_Time] @in_Minutes = 5', @database_name=N'HCITools', @output_file_name=NULL, @flags=0, @database_user_name=NULL, @server=NULL, @additional_parameters=NULL, @proxy_id=NULL, @proxy_name=NULL IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback /* Add Step */ EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Purge old ActivePos_Read backups', @step_id=3, @cmdexec_success_code=0, @on_success_action=3, @on_success_step_id=0, @on_fail_action=3, @on_fail_step_id=0, @retry_attempts=0, @retry_interval=0, @os_run_priority=0, @subsystem=N'PowerShell', @command=N'# DELETE OLD ActivePos_read backups files Get-ChildItem D:\SQLDatabaseDump | where {$_.name -like "ActivePos_read.*.bak"} | % { $CheckBackup = $_.name.Substring($_.name.Length - 9); IF ($CheckBackup.StartsWith(".")){ Remove-Item -Path $_.FullName -Force }} ', @database_name=N'master', @output_file_name=NULL, @flags=0, @database_user_name=NULL, @server=NULL, @additional_parameters=NULL, @proxy_id=NULL, @proxy_name=NULL IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback /* Add Step */ EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Backup ActivePos_Read', @step_id=4, @cmdexec_success_code=0, @on_success_action=3, @on_success_step_id=0, @on_fail_action=4, @on_fail_step_id=8, @retry_attempts=0, @retry_interval=1, @os_run_priority=0, @subsystem=N'TSQL', @command=N'DECLARE @dbVersion varchar(20), @PathInit varchar(255), @FileName varchar(255), @BackupPath varchar(400) /* Get version of Database */ SELECT @dbVersion = ActivePos_write.upd.DatabaseVersion() /* Unvalidate current backup */ EXECUTE Arizona.[dbo].aps_Registry_Write_Value ''HKEY_LOCAL_MACHINE'', ''SOFTWARE\HCI Solutions\HCI Install Launcher'', ''DumpSQLVer'', '' '' /* Get local path for Backup */ SELECT @PathInit = HCIP_value FROM HCITools.dbo.HCI_PARAMS WHERE HCIP_Key = ''BKP_DIR'' SET @FileName = ''ActivePos_read.''+@dbVersion+''.bak'' SET @BackupPath = @PathInit+@FileName /* Backup database locally */ BACKUP DATABASE [ActivePos_read] TO DISK = @BackupPath WITH NOFORMAT, INIT, NAME = N''ActivePos_read-Full Database Backup'', SKIP, NOREWIND, NOUNLOAD, COMPRESSION, STATS = 5, CHECKSUM, COPY_ONLY; RESTORE VERIFYONLY FROM DISK = @BackupPath; ', @database_name=N'master', @output_file_name=NULL, @flags=0, @database_user_name=NULL, @server=NULL, @additional_parameters=NULL, @proxy_id=NULL, @proxy_name=NULL IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback /* Add Step */ EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Parrallele copy backup to shared folder(s)', @step_id=5, @cmdexec_success_code=0, @on_success_action=3, @on_success_step_id=0, @on_fail_action=4, @on_fail_step_id=8, @retry_attempts=0, @retry_interval=0, @os_run_priority=0, @subsystem=N'PowerShell', @command=N'Set-Location C: # VARIABLES $query = "select SettingValue from cfg.Settings where SettingId like ''Values.Modules.Replication.DbInitializationBackupPath%'' and len(SettingValue) > 1" $erroronscript = 0 $errortext = '''' #Get configs from SQL $connectionString = "Server=''.\apssql'';Database=''ActiveSystemServer'';Integrated Security=True;" $connection = New-Object System.Data.SqlClient.SqlConnection $connection.ConnectionString = $connectionString $connection.Open() $command = $connection.CreateCommand() $command.CommandText = $query $adapter = New-Object System.Data.sqlclient.sqlDataAdapter $command $dataset = New-Object System.Data.DataSet $adapter.Fill($dataSet) | Out-Null $data = $dataset.Tables[0] # Get database version $query2 = "SELECT ActivePos_write.upd.DatabaseVersion()" $command2 = New-Object System.Data.SqlClient.SqlCommand($query2,$connection) $aposVersion = $command2.ExecuteScalar() $file = "ActivePos_read."+$aposVersion +".bak" # Get backup directory $query3 = "SELECT HCIP_value FROM HCITools.dbo.HCI_PARAMS WHERE HCIP_Key = ''BKP_DIR''" $command3 = New-Object System.Data.SqlClient.SqlCommand($query3,$connection) $source = $command3.ExecuteScalar() $connection.close() $jobs = foreach($dir in $data){ $logFile = $dir.SettingValue -replace "[\\]" , "" $target = $dir.SettingValue $logfile = "/log:c:\temp\$logFile.txt" $testfile = $source + $file if(!(test-path "$Target")){ try{ New-Item -ItemType Directory -Force -Path $Target -ErrorAction Stop} catch{ $erroronscript = 1 if($errortext -eq ''''){ $errortext = "Share is not reaechable: $Target" }else{ $errortext = $errortext + "`r`nShare is not reaechable: $Target" } } } if(test-path "$Target"){ if(!(test-path $testfile)){ $erroronscript = 1 if($errortext -eq ''''){ $errortext = "ActivePos_read file source is not accessible!" }else{ $errortext = $errortext + "`r`nActivePos_read file source is not accessible!" } }else{ Start-Job -ScriptBlock { $copy = robocopy $args[0] $args[1] $args[2] /r:5 /w:120 $args[3] $LASTEXITCODE } -ArgumentList $Source,$Target,$file,$logFile } } } $resultsjobs = Get-Job | Wait-Job | Receive-Job foreach($resultjob in $resultsjobs){ if($resultjob -gt 7){ $errortext = "Robocopy exit code greater than 7!" } } Remove-Job * if (Test-Path ''C:\Temp\PScopy.ps1'') { Remove-Item ''C:\Temp\PScopy.ps1'' -Force } IF($errortext -ne ''''){ throw($errortext)}', @database_name=N'master', @output_file_name=NULL, @flags=0, @database_user_name=NULL, @server=NULL, @additional_parameters=NULL, @proxy_id=NULL, @proxy_name=NULL IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback /* Add Step */ EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Add log entry and delete file', @step_id=6, @cmdexec_success_code=0, @on_success_action=3, @on_success_step_id=0, @on_fail_action=4, @on_fail_step_id=8, @retry_attempts=0, @retry_interval=0, @os_run_priority=0, @subsystem=N'TSQL', @command=N'DECLARE @dbVersion varchar(20), @ouCode varchar(15), @PathInit varchar(255), @PathDest varchar(255), @FileName varchar(255), @BackupPath varchar(400), @Result int, @RaiseError int /* Get version of Database */ SELECT @dbVersion = ActivePos_write.upd.DatabaseVersion() /* Get OU Code */ SELECT TOP 1 @ouCode = ou_code FROM ActivePos_server.dbo.GetCurrentOU() BEGIN SET @RaiseError = 0 /* Get local path for Backup */ SELECT @PathInit = HCIP_value FROM HCITools.dbo.HCI_PARAMS WHERE HCIP_Key = ''BKP_DIR'' SET @FileName = ''ActivePos_read.''+@dbVersion+''.bak'' SET @BackupPath = @PathInit+@FileName EXECUTE Arizona.[dbo].aps_Registry_Write_Value ''HKEY_LOCAL_MACHINE'', ''SOFTWARE\HCI Solutions\HCI Install Launcher'', ''DumpSQLVer'', @dbVersion IF EXISTS(SELECT 1 FROM arizona.dbo.IT_config_setting WHERE ITCS_key = ''DumpSQLVer'') BEGIN EXEC(''UPDATE arizona.dbo.IT_config_setting SET ITCS_value = '''''' + @dbVersion + '''''' WHERE ITCS_key = ''''DumpSQLVer'''''') END ELSE BEGIN EXEC(''INSERT INTO arizona.dbo.IT_config_setting(ITCS_key,ITCS_value) VALUES(''''DumpSQLVer'''','''''' + @dbVersion + '''''')'') END /* Delete local backup */ EXEC @result = Arizona.dbo.aps_File_Delete @path = @BackupPath IF @result <> 0 RAISERROR (''Error during backup delete'',16,1) END', @database_name=N'master', @output_file_name=NULL, @flags=0, @database_user_name=NULL, @server=NULL, @additional_parameters=NULL, @proxy_id=NULL, @proxy_name=NULL IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback /* Add Step */ EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Empty step for success', @step_id=7, @cmdexec_success_code=0, @on_success_action=1, @on_success_step_id=0, @on_fail_action=4, @on_fail_step_id=8, @retry_attempts=0, @retry_interval=0, @os_run_priority=0, @subsystem=N'TSQL', @command=N'/* Empty step */ exec Get_Job_Error_Info @in_JobName = ''D91030 - Backup ActivePos_Read'', @in_Recipients = ''DBA_operator''', @database_name=N'HCITools', @output_file_name=NULL, @flags=0, @database_user_name=NULL, @server=NULL, @additional_parameters=NULL, @proxy_id=NULL, @proxy_name=NULL IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback /* Add Step */ EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Send email KO', @step_id=8, @cmdexec_success_code=0, @on_success_action=2, @on_success_step_id=0, @on_fail_action=2, @on_fail_step_id=0, @retry_attempts=0, @retry_interval=0, @os_run_priority=0, @subsystem=N'TSQL', @command=N'exec Get_Job_Error_Info @in_JobName = ''D91030 - Backup ActivePos_Read'', @in_Recipients = ''DBA_operator''', @database_name=N'HCITools', @output_file_name=NULL, @flags=0, @database_user_name=NULL, @server=NULL, @additional_parameters=NULL, @proxy_id=NULL, @proxy_name=NULL IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1 IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback /* Add Standard Schedule */ EXEC @ReturnCode = msdb.dbo.sp_add_jobschedule @job_id=@jobId, @name=N'D91030-D', @enabled=1, @freq_type=8, @freq_interval=63, @freq_subday_type=1, @freq_subday_interval=0, @freq_relative_interval=0, @freq_recurrence_factor=1, @active_start_date=20150708, @active_end_date=99991231, @active_start_time=10000, @active_end_time=235959 IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback /* Attach existing specific schedule for job */ declare @enabled_schedule int, @schedule_name nvarchar(50) declare c_schedules cursor local forward_only static for select enabled, name from msdb.dbo.sysschedules where name LIKE 'D91030%' and name LIKE '%#SPEC#' open c_schedules FETCH NEXT FROM c_schedules into @enabled_schedule, @schedule_name while @@fetch_status = 0 begin EXEC @ReturnCode = msdb.dbo.sp_attach_schedule @job_id = @jobId, @schedule_name=@schedule_name IF(@enabled_schedule = 1) begin SET @schedule_name = SUBSTRING(@schedule_name,0,LEN(@schedule_name)-5) IF EXISTS (select name from msdb.dbo.sysschedules where name = @schedule_name) EXEC @ReturnCode = msdb.dbo.sp_update_schedule @name=@schedule_name, @enabled=0 end IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback FETCH NEXT FROM c_schedules into @enabled_schedule, @schedule_name end close c_schedules deallocate c_schedules EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name = N'(local)' IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback COMMIT TRANSACTION GOTO EndSave QuitWithRollback: IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION EndSave: GO