We have the AO Clustering - HA&DR Hybrid configuration. Out of dozen databases only this one database/application is encountering this. The dilemma that we have a Sql Agent Job scheduled to run on the PRIMARY ( active) but for some reason it also runs on the SECONDARY (inactive) yet pointing correctly the to PRIMARY ( active) which usually doubles the records being inserted after we FTP from an external machine. YET - we cannot connect to SECONDARY or manually run the stored procedure, but the SQL Agent Job seems to be able to override and supersede AO!!!! According to Bren Ozar's video: https://youtu.be/YNyY_A5733E?t=12m58s --- jobs & security cant fail over HA SyncMirroring Any ideas ? Anyone else having this I'm wondering if a hotfix is needed. TIA George Sean, Bren Ozar's video gave me some new leads but confirming it and identifying why it still happens and even the agent job gets re-enabled on the secondary and run's in parallel is still a mystery. when it should return "The database EEOutageTracking is not accessible. (ObjectExplorer)" . its a 1-step sql server agent job exec SP_ATSImport ----- how can I attach/paste the code ? [![enter image description here][1]][1] [1]: https://i.sstatic.net/ECluL.jpg USE [EEOutageTracking] GO /****** Object: StoredProcedure [dbo].[SP_ATSImport] Script Date: 8/19/2016 2:49:36 PM ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO --- Lewycky Dec 10, 2014: modifications for date header record to verify file xmitted --- is correct and recent ALTER PROCEDURE [dbo].[SP_ATSImport] AS BEGIN BEGIN SET XACT_ABORT ,NOCOUNT ON; DECLARE @starttrancount int; BEGIN TRY IF @@TRANCOUNT > 0 --- added BEGIN ROLLBACK TRANSACTION; END; SELECT @starttrancount = @@TRANCOUNT; ---- SET @starttrancount = 0; --<----------- ---- SET @starttrancount = @@TRANCOUNT; ---- should be zero and not trancount IF @starttrancount = 0 BEGIN BEGIN TRANSACTION ATSIMPORT; END; DECLARE @dtCurrent datetime; SET @dtCurrent = GETDATE( ); ----------Lewycky 12/2/14: added to handle verifying incoming file FTPd from ATS that it was sent the date ---------- SP_ATSImport is scheduled to run. Should be same date! DECLARE @datestring char( 08 ); SET @datestring = CONVERT( varchar( 8 ) ,GETDATE( ) ,112 ); ---------- ------ FOR FUTURE USE --EXEC sp_configure 'show advanced options', 1 --GO --RECONFIGURE --GO --EXEC sp_configure 'xp_cmdshell', 1 --GO --RECONFIGURE --GO --exec sp_configure --go --exec sp_configure 'Ole Automation Procedures', 1 ---- Configuration option 'Ole Automation Procedures' changed from 0 to 1. Run the RECONFIGURE statement to install. --go --reconfigure --go DECLARE @filename varchar( 40 ); -- In FTP Scheduled DOS job: the file from AS/400 is placed in this subdir under this filename -- indicating FTP was successful -- PRODUCTION SET @filename = 'S:\ATSJobs\Archive\ATSToday.txt'; --- where FTP placed file ( FTPATSProd.CMD ) -------------------------------------------------------------------------------------------------- -- use for TESTING BELOW on 10.8.86.78 -- SET @filename = 'E:\ATSJobs\Archive\ATSTodayX.txt'; --- on 10.8.86.78 ----SET @filename = 'C:\ATSJobs\Archive\ATSTodayX.txt'; --- where FTP placed file ( FTPATSProd.CMD ) -------------------------------------------------------------------------------------------------- -- PROD SET @filename = 'S:\ATSJobs\Archive\ATSToday.txt'; --- where FTP placed file ( FTPATSProd.CMD ) --*&SET @filename = 'E:\ATSJobs\Archive\ATSToday.txt'; --- where FTP placed file ( FTPATSProd.CMD ) SET @filename = 'D:\ATS2EandEJobs\Archive\ATSToday.txt'; --- where FTP placed file on 10.9.76.27 ( FTPATSProd.CMD ) DECLARE @i int; EXEC master..xp_fileexist @Filename ,@i OUT; IF @i = 1 BEGIN IF OBJECT_ID( 'tempdb..#tempfile' )IS NOT NULL BEGIN DROP TABLE #tempfile; END; DECLARE @TotalRecordsForImport int , @EmptyInput char( 1 ); CREATE TABLE #tempfile( Inputline varchar( 250 )); EXEC ( 'bulk INSERT #tempfile FROM "'+@filename+'"' ); SET @EmptyInput = 'N'; SET @TotalRecordsForImport = ( SELECT COUNT( * ) FROM #tempfile ); IF @TotalRecordsForImport = 0 BEGIN SET @EmptyInput = 'Y'; --- used to report if FTPd file is empty END; --------- immediately delete the ATSToday.txt file after bulk inserted -------- EXEC xp_cmdshell 'del "S:\ATSJobs\ATS_Yada20141010_1652.txt" ' END; ELSE BEGIN SET @TotalRecordsForImport = 0; SET @EmptyInput = 'N'; --- indicates file not received since count will also be zero END; -------------------------------------------------------------------------------- ----------Lewycky 12/2/14: added to handle verifying incoming file FTPd from ATS that it was sent the date ---------- SP_ATSImport is scheduled to run. Should be same date! ------------------------------ IF @i = 1 BEGIN DECLARE @ATSDateIn varchar( 08 ); DECLARE @DateCheck varchar( 300 ); SET @DateCheck = ( SELECT TOP 1 * FROM #tempfile ); SET @ATSDateIn = CAST( SUBSTRING( @DateCheck ,1 ,8 )AS char ); ----------Lewycky 12/2/14: added to handle verifying incoming file FTPd from ATS that it was sent the date ---------- SP_ATSImport is scheduled to run. Should be same date! IF @ATSDateIn <> @datestring BEGIN SET @TotalRecordsForImport = 9999999; --- overriding logic for zero in code below with ambiguous value for bypass code SET @EmptyInput = 'X'; --- Dummy override value not to interfere with logic below EXEC sp_SendCDOSysMail END; END; -------------------------------------------------------------------------------- ---- SPECIAL LOGIC if file is empty with zero records - drop temp and rollback IF @TotalRecordsForImport = 0 AND @EmptyInput = 'Y' BEGIN EXEC sp_SendCDOSysMail '[email protected]' ,'[email protected],[email protected],[email protected],[email protected],[email protected]' ,'' ,'ATS Input file received is empty' ,''; ----- still keep the file ????? END; -------------------------------------------------------------------------------- ---- LOGIC if file is NOT received via STEP - drop temp and rollback IF @TotalRecordsForImport = 0 AND @EmptyInput <> 'Y' BEGIN EXEC sp_SendCDOSysMail END; -- Reverse special value back to Zero to prevent INSERTs IF @EmptyInput = 'X' BEGIN SET @TotalRecordsForImport = 0; --- reverse override value of 9999999 for Date conflict END; ---- if valid file insert and archive the flat file with a date & time stamp ----- Bypass if "X" signifying Date Stamp on input file isn't run date IF @TotalRecordsForImport > 1 BEGIN INSERT INTO EEOutageTracking.dbo.ATStoAFCSpearInterface( EMPL_ID , C_EMPL_FIRST_INIT , C_EMPL_MIDD_INIT , C_EMPL_LAST_NAME , C_FORM_DATE , C_CODE_1 , C_HOURS_1 , C_JOB_NO_1 , C_CODE_2 , C_HOURS_2 , C_JOB_NO_2 , C_CODE_3 , C_HOURS_3 , C_JOB_NO_3 , C_CODE_4 , C_HOURS_4 , C_JOB_NO_4 , C_CODE_5 , C_HOURS_5 , C_JOB_NO_5 , C_CODE_6 , C_HOURS_6 , C_JOB_NO_6 , C_CODE_7 , C_HOURS_7 , C_JOB_NO_7 , C_CODE_8 , C_HOURS_8 , C_JOB_NO_8 , C_CODE_9 , C_HOURS_9 , C_JOB_NO_9 , C_CODE_10 , C_HOURS_10 , C_JOB_NO_10 , C_CODE_11 , C_HOURS_11 , C_JOB_NO_11 , C_CODE_12 , C_HOURS_12 , C_JOB_NO_12 , C_START_DATE , C_END_DATE , C_MOD_FLAG , C_WORK_SHIFT , C_LAST_UPDATE_DATE , C_UPDATED_BY ) SELECT CAST( SUBSTRING( InputLine ,1 ,6 )AS char ) , CAST( SUBSTRING( InputLine ,7 ,1 )AS char ) , CAST( SUBSTRING( InputLine ,8 ,1 )AS char ) , CAST( SUBSTRING( InputLine ,9 ,16 )AS char ) , SUBSTRING( InputLine ,29 ,4 ) + '-' + SUBSTRING( InputLine ,25 ,2 ) + '-' + SUBSTRING( InputLine ,27 ,2 ) , CAST( SUBSTRING( InputLine ,33 ,3 )AS char ) , --CODE 1 CAST( SUBSTRING( InputLine ,36 ,4 )AS char ) , CAST( SUBSTRING( InputLine ,40 ,5 )AS char ) , CAST( SUBSTRING( InputLine ,45 ,3 )AS char ) , CAST( SUBSTRING( InputLine ,48 ,4 )AS char ) , CAST( SUBSTRING( InputLine ,52 ,5 )AS char ) , CAST( SUBSTRING( InputLine ,57 ,3 )AS char ) , CAST( SUBSTRING( InputLine ,60 ,4 )AS char ) , CAST( SUBSTRING( InputLine ,64 ,5 )AS char ) , CAST( SUBSTRING( InputLine ,69 ,3 )AS char ) , CAST( SUBSTRING( InputLine ,72 ,4 )AS char ) , CAST( SUBSTRING( InputLine ,76 ,4 )AS char ) , CAST( SUBSTRING( InputLine ,81 ,3 )AS char ) , CAST( SUBSTRING( InputLine ,84 ,4 )AS char ) , CAST( SUBSTRING( InputLine ,88 ,5 )AS char ) , CAST( SUBSTRING( InputLine ,93 ,3 )AS char ) , CAST( SUBSTRING( InputLine ,96 ,4 )AS char ) , CAST( SUBSTRING( InputLine ,100 ,5 )AS char ) , --jobno 6 CAST( SUBSTRING( InputLine ,105 ,3 )AS char ) , CAST( SUBSTRING( InputLine ,108 ,4 )AS char ) , CAST( SUBSTRING( InputLine ,112 ,5 )AS char ) , CAST( SUBSTRING( InputLine ,117 ,3 )AS char ) , CAST( SUBSTRING( InputLine ,120 ,4 )AS char ) , CAST( SUBSTRING( InputLine ,124 ,5 )AS char ) , CAST( SUBSTRING( InputLine ,129 ,3 )AS char ) , CAST( SUBSTRING( InputLine ,132 ,4 )AS char ) , CAST( SUBSTRING( InputLine ,136 ,5 )AS char ) , CAST( SUBSTRING( InputLine ,141 ,3 )AS char ) , CAST( SUBSTRING( InputLine ,144 ,4 )AS char ) , CAST( SUBSTRING( InputLine ,148 ,5 )AS char ) , CAST( SUBSTRING( InputLine ,153 ,3 )AS char ) , CAST( SUBSTRING( InputLine ,156 ,4 )AS char ) , CAST( SUBSTRING( InputLine ,160 ,5 )AS char ) , CAST( SUBSTRING( InputLine ,165 ,3 )AS char ) , CAST( SUBSTRING( InputLine ,168 ,4 )AS char ) , CAST( SUBSTRING( InputLine ,172 ,5 )AS char ) , --jobno 12 CASE WHEN SUBSTRING( InputLine ,177 ,12 ) = '000000000000' THEN NULL ELSE SUBSTRING( InputLine ,181 ,4 ) + '-' + SUBSTRING( InputLine ,177 ,2 ) + '-' + SUBSTRING( InputLine ,179 ,2 ) + ' ' + SUBSTRING( InputLine ,185 ,2 ) + ':' + SUBSTRING( InputLine ,187 ,2 ) END , CASE WHEN SUBSTRING( InputLine ,189 ,12 ) = '000000000000' THEN NULL ELSE SUBSTRING( InputLine ,193 ,4 ) + '-' + SUBSTRING( InputLine ,189 ,2 ) + '-' + SUBSTRING( InputLine ,191 ,2 ) + ' ' + SUBSTRING( InputLine ,197 ,2 ) + ':' + SUBSTRING( InputLine ,199 ,2 ) END , --SUBSTRING( InputLine ,181 ,4 ) + '-' + SUBSTRING( InputLine ,177 ,2 ) + '-' + SUBSTRING( InputLine ,179 ,2 ) + ' ' + SUBSTRING( InputLine ,185 ,2 ) + ':' + SUBSTRING( InputLine ,187 ,2 ) , --SUBSTRING( InputLine ,193 ,4 ) + '-' + SUBSTRING( InputLine ,189 ,2 ) + '-' + SUBSTRING( InputLine ,191 ,2 ) + ' ' + SUBSTRING( InputLine ,197 ,2 ) + ':' + SUBSTRING( InputLine ,199 ,2 ) , CAST( SUBSTRING( InputLine ,201 ,1 )AS char ) , CAST( SUBSTRING( InputLine ,202 ,9 )AS char ) , SUBSTRING( InputLine ,215 ,4 ) + '-' + SUBSTRING( InputLine ,211 ,2 ) + '-' + SUBSTRING( InputLine ,213 ,2 ) , CAST( SUBSTRING( InputLine ,219 ,9 )AS char ) --CAST( SUBSTRING( InputLine ,220 ,1 )AS char ) , --CAST( SUBSTRING( InputLine ,221 ,16 )AS varchar ) FROM #tempfile WHERE SUBSTRING( INPUTLINE ,1 ,8 ) <> @ATSDateIn; ----- exclude the header record containing the date stamp ---- Lewycky ---- dbo.ATSStaging; --DROP TABLE #tempfile created from the flat file DROP TABLE #tempfile; SELECT @starttrancount = @@TRANCOUNT; IF @starttrancount --- set to 1 from begin trans ---@starttrancount <> 0 AND @TotalRecordsForImport > 0 BEGIN COMMIT TRANSACTION ATSIMPORT; --- relocated **& Lewycky EXEC sp_SendCDOSysMail '[email protected]' ,'[email protected],[email protected],[email protected],[email protected],[email protected]' ,'' ,'ATS loaded successfully' ,''; END; ELSE BEGIN ROLLBACK TRANSACTION; END; END; -- RENAME INPUT FILE ATSToday.txt WITH DATE & TIME STAMP AND ARCHIVE IT IF @TotalRecordsForImport > 0 BEGIN --- create string to copy or rename file with a date and time stamp DECLARE @dt datetime , @SQLstmt varchar( 250 ); SET @dt = GETDATE( ); -- Important: double quotes ARE NEEDED around full filenames from & to work in T-SQL -- George -- Important: double quotes ARE NEEDED around full filenames from & to work in T-SQL -- George --------------------------------------------------------------------------------------------------------------- ----SET @SQLstmt = 'MOVE /Y "' + @filename + '"' + ' "S:\ATSJobs\Archive\ATS_Archive' + CONVERT( varchar( 15 ) ,@dt ,112 ) + '_' + REPLACE( CONVERT( char( 5 ) ,GETDATE( ) ,108 ) ,':' ,'' ) + '.txt' + '"'; ----EXEC xp_cmdshell @SQLstmt; ------------------------------ DECLARE @oFS int; DECLARE @FS int; DECLARE @oFol int; DECLARE @oFC int; DECLARE @ERR int; DECLARE @FD int; DECLARE @oFil int; DECLARE @Path varchar( 255 ); DECLARE @Path1 varchar( 255 ); --DECLARE @FileName VARCHAR(255) DECLARE @NumFiles int; DECLARE @RetCode int; DECLARE @ErrObject int; --- DECLARE @src varchar( 250 ) , @desc varchar( 2000 ); DECLARE @source varchar( 255 ) , @dest varchar( 255 ); DECLARE @newname varchar( 250 ); SET @dt = GETDATE( ); --------------------------------------------------------------------------------------------------------------- SET @newname = 'ATS_Archive' + CONVERT( varchar( 15 ) ,@dt ,112 ) + '_' + REPLACE( CONVERT( char( 5 ) ,GETDATE( ) ,108 ) ,':' ,'' ) + '.txt'; EXEC @RetCode = sp_OACreate 'Scripting.FileSystemObject' ,@oFS OUTPUT; IF @RetCode <> 0 BEGIN -- ROLLBACK TRANSACTION; EXEC sp_OAGetErrorInfo @oFS ,@src OUT ,@desc OUT; EXEC sp_SendCDOSysMail '[email protected]' ,'[email protected],[email protected]' ,'' ,'ATS - Unable to archive incoming file (1 Create)' ,''; RAISERROR( 'Object Creation Failed 0x%x, %s, %s' ,16 ,1 ,@retcode ,@src ,@desc ); RETURN; END; SET @Path = 'D:\ATS2EandEJobs\Archive\ATSToday.txt'; SET @Path1 = 'D:\ATS2EandEJobs\Archive\' + @newname; --&SET @Path = 'E:\ATSJobs\Archive\ATSToday.txt'; --&SET @Path1 = 'E:\ATSJobs\Archive\' + @newname; EXEC @RetCode = sp_OAMethod @oFS ,'GetFile' ,@oFol OUTPUT ,@Path; IF @RetCode <> 0 BEGIN -- ROLLBACK TRANSACTION; EXEC sp_SendCDOSysMail ' EXEC sp_OAGetErrorInfo @oFS ,@src OUT ,@desc OUT; RAISERROR( 'OA Get File failed 0x%x, %s, %s' ,16 ,1 ,@retcode ,@src ,@desc ); RETURN; END; -- http://www.vbforums.com/showthread.php?367306-Move-file-with-sp_OAMethod EXECUTE @err = sp_OAMethod @ofs ,'MoveFile' ,NULL ,@Path ,@Path1; IF @RetCode <> 0 BEGIN -- ROLLBACK TRANSACTION; EXEC sp_SendCDOSysMail EXEC sp_OAGetErrorInfo @oFS ,@src OUT ,@desc OUT; RAISERROR( 'OA Move File Failed 0x%x, %s, %s' ,16 ,1 ,@retcode ,@src ,@desc ); RETURN; END; ------------------------------ END; ------------------------------------------------------------------------------------------------------------------- ----- DELETE ATSTODAY.TXT to be ready for next run - message already emailed above ----- NOTHING TO ARCHIVE - also for when Import job is accdentally re-run without the FTP preceding it ------------------------------------------------------------------------------------------------------------------- IF @TotalRecordsForImport = 0 ------------AND @EmptyInput - culprit ? 10/15 **& ------------ = ------------ 'Y' BEGIN SELECT @starttrancount = @@TRANCOUNT; IF @starttrancount > 0 BEGIN ROLLBACK TRANSACTION; END; --- create string to copy or rename file with a date and time stamp --DECLARE -- @SQLstmt2 varchar( 250 ); --SET @dt = GETDATE( ); ---- Important: For Deletes quotes are NOT NEEEDED around filenames to work in T-SQL -- George ---- Important: For Deletes quotes are NOT NEEEDED around filenames to work in T-SQL -- George ----------------------------------------------------------------------------------------------------------------- --SET @SQLstmt2 = 'del S:\ATSJobs\Archive\ATSToday.txt'; --EXEC xp_cmdshell @SQLstmt2; ----EXEC sp_SendCDOSysMail ---------------------------------------------------------------------------------------------------------------------------------- -- using OLE to delete the file DECLARE @Result int; DECLARE @FSO_Token int; EXEC @Result = sp_OACreate 'Scripting.FileSystemObject' ,@FSO_Token OUTPUT; EXEC @Result = sp_OAMethod @FSO_Token ,'DeleteFile' ,NULL ,'D:\ATS2EandEJobs\Archive\ATSToday.txt'; --&EXEC @Result = sp_OAMethod @FSO_Token ,'DeleteFile' ,NULL ,'E:\ATSJobs\Archive\ATSToday.txt'; EXEC @Result = sp_OADestroy @FSO_Token; END; END TRY BEGIN CATCH BEGIN SELECT @starttrancount = @@TRANCOUNT; IF @starttrancount > 0 BEGIN ROLLBACK TRANSACTION; END; ---- IF SP needs to be aborted for whatever reason ----------- Delete input file if problem encountered ----------- -- using OLE to delete the file DECLARE @Result2 int; DECLARE @FSO_Token2 int; EXEC @Result = sp_OACreate 'Scripting.FileSystemObject' ,@FSO_Token2 OUTPUT; --EXEC @Result = sp_OAMethod @FSO_Token2 ,'DeleteFile' ,NULL ,'D:\ATS2EandEJobs\Archive\ATSToday.txt'; --&EXEC @Result = sp_OAMethod @FSO_Token2 ,'DeleteFile' ,NULL ,'E:\ATSJobs\Archive\ATSToday.txt'; EXEC @Result = sp_OADestroy @FSO_Token2; ----------- Delete input file if problem encountered ----------- EXEC sp_SendCDOSysMail END; DECLARE @ErrorNumber int , @ErrorMessage nvarchar( 4000 ) , @ErrorProcedure nvarchar( 4000 ) , @ErrorLine int; SET @ErrorNumber = ERROR_NUMBER( ); SET @ErrorMessage = ERROR_MESSAGE( ); SET @ErrorProcedure = ERROR_PROCEDURE( ); SET @ErrorLine = ERROR_LINE( ); RAISERROR( 'An error occurred within transaction. Error Number : %d Error Message : %s Procedure : %s Line Number : %d' ,16 ,1 ,@ErrorNumber ,@ErrorMessage ,@ErrorProcedure ,@ErrorLine ); -------------- EXEC SP_SendICESErrorEmail @ErrorNumber ,@ErrorMessage ,@ErrorProcedure ,@ErrorLine ,'' ,'Daily ATS Import'; END CATCH; END; END;