This set of scripts is designed to log scheduled processes

Tables

Scheduled Data Process Log Table

dbo.process_log
CREATE TABLE [dbo].[process_log](
	[RunDateTime] [datetime] NOT NULL,
	[Process] [varchar](200) NOT NULL,
	[DisplayName] [varchar](200) NULL,
	[Schedule] [varchar](200) NULL,
	[AffectedTables] [varchar](4000) NULL,
	[AfftecedViews] [varchar](4000) NULL,
 CONSTRAINT [PK_process_log] PRIMARY KEY CLUSTERED 
(
	[RunDateTime] ASC,
	[Process] ASC
)
GO

Azure Data Factory Incremental Prcoess Log Table

More information can be found at: https://learn.microsoft.com/en-us/azure/data-factory/tutorial-incremental-copy-overview

dbo.adf_level
CREATE TABLE [dbo].[adf_level](
	[ProcessName] [varchar](200) NOT NULL,
	[TableName] [varchar](200) NOT NULL,
	[RunDateTime] [datetime] NOT NULL,
	[DataDateTime] [datetime] NULL,
 CONSTRAINT [PK_process_level] PRIMARY KEY CLUSTERED 
(
	[ProcessName] ASC,
	[TableName] ASC,
	[RunDateTime] ASC
)
GO

ALTER TABLE [dbo].[adf_level] ADD  CONSTRAINT [DF_adf_level_RunDateTime]  DEFAULT (getdate()) FOR [RunDateTime]
GO

Views

Scheduled Data Process View

dbo.vScheduledProcesses
CREATE VIEW [dbo].[vScheduledProcesses] as
SELECT	DPL.DisplayName as [Display Name],
		DPL.[Process] as [Process],
		DPL.[Schedule],
		CAST(MD.MaxDateTime as Date) as [Last Run Date],
		CAST(MD.MaxDateTime as Time) as [Last Run Time],
		CASE 
			WHEN DPL.Schedule='Daily' AND DATEDIFF(DAY,MD.MaxDateTime,GETDATE())>1 THEN 'Issue'
			WHEN DPL.Schedule='Daily' AND DATEDIFF(DAY,MD.MaxDateTime,GETDATE())<=1 THEN 'OK'
			WHEN DPL.Schedule='Weekly' AND DATEDIFF(DAY,MD.MaxDateTime,GETDATE())>7 THEN 'Issue'
			WHEN DPL.Schedule='Weekly' AND DATEDIFF(DAY,MD.MaxDateTime,GETDATE())<=7 THEN 'OK'
			ELSE NULL
		END as [Status],
		DPL.AffectedTables as [Affected Tables],
		DPL.AfftecedViews as [Affected Views]
FROM [dbo].[process_log] DPL
INNER JOIN (SELECT Process, MAX([RunDateTime]) as MaxDateTime FROM dbo.process_log GROUP BY Process) MD ON DPL.Process=MD.Process AND DPL.RunDateTime=MD.MaxDateTime
GO

Stored Procedures

Daily Jobs

dbo.DailyJobs
CREATE PROCEDURE [dbo].[DailyJobs]
AS
BEGIN
	-- This procedure is scheduled to run every day on the SQL Server Agent
	
	-- Execute other Stored Procedures here:
	
		-- Description of stored procedure
		BEGIN TRY
			{ sql_statement | statement_block };
		END TRY
		BEGIN CATCH
   		RAISERROR ('{SQL Statement Name} was unable to run',1,0);
		END CATCH
		
	-- Log Maintenance
	DELETE DPL
	FROM [dbo].[process_log] DPL
	INNER JOIN (SELECT Process, MAX(RunDateTime) MaxDateTime FROM [dbo].[process_log] GROUP BY Process) DD ON DPL.Process=DD.Process
	WHERE DPL.Schedule='Daily' 
		AND DPL.RunDateTime<DATEADD(MONTH,-1,GETDATE())
		AND DPL.RunDateTime<DD.MaxDateTime
	;

	DELETE APL
	FROM [dbo].[adf_level] APL
	INNER JOIN (SELECT ProcessName, MAX(RunDateTime) MaxDateTime FROM [dbo].[adf_level] GROUP BY ProcessName) DD ON APL.ProcessName=DD.ProcessName
	WHERE RunDateTime<DATEADD(MONTH,-1,GETDATE())
		AND RunDateTime<DD.MaxDateTime
	;

END
GO

Weekly Jobs

dbo.WeeklyJobs
CREATE PROCEDURE [dbo].[WeeklyJobs]
AS
BEGIN
	-- This procedure is scheduled to run every week on the SQL Server Agent
		
		-- Execute other Stored Procedures here: -- Description of stored procedure
		BEGIN TRY
			{ sql_statement | statement_block };
		END TRY
		BEGIN CATCH
  			RAISERROR('{SQL Statement Name} was unable to run',1,0);
		END CATCH

	-- Log Maintenance
	DELETE DPL
	FROM [dbo].[process_log] DPL
	INNER JOIN (SELECT Process, MAX(RunDateTime) MaxDateTime FROM [dbo].[process_log] GROUP BY Process) DD ON DPL.Process=DD.Process
	WHERE DPL.Schedule='Weekly' 
		AND DPL.RunDateTime<DATEADD(MONTH,-1,GETDATE())
		AND DPL.RunDateTime<DD.MaxDateTime
	;

END
GO
  • No labels