Sql-Server

觸發器以查找刪除作業代理歷史記錄

  • June 26, 2018

我們正在嘗試調試 SQL 代理作業歷史記錄每 8 小時被刪除一次的原因。在閱讀以下文章時,它提出了許多很棒的想法,例如:

  • 創建觸發器以檢查哪個應用程序正在刪除作業歷史記錄
  • 檢查我們是否有一個可能正在清除作業歷史記錄的作業
  • 檢查是否正在手動使用 msdb 數據庫中的 sp_purge_jobhistory 儲存過程來刪除 SQL Server 代理作業歷史記錄

在文章中,他們創建的觸發器返回以下內容作為“應用程序名稱”值:

  • SQLAgent - 步驟歷史記錄器
  • SQLAgent - 作業管理器

我將如何創建這樣的觸發器?

這是創建審計表和包含您請求的資訊的審計觸發器的程式碼。我已經對此進行了測試,它給了我SQLAgent - Job Manager列下的值AppName。當作業執行時,這會持續記錄,它會刪除我歷史記錄中的數據。(我將其更改為在歷史記錄中保留 2 行以強制將其刪除以進行測試。)

因此,該功能APP_NAME()確實是您想要的。

您可以通過 BateTech 在 Stack Exchange 上找到與此相關的更多資訊。

CREATE TABLE msdb.dbo.HistoryPurgeReport 
(PurgeID INT Identity(1, 1) PRIMARY KEY, [instance_id] [int] NOT NULL, [job_id] [uniqueidentifier] NOT NULL, 
[step_id] [int] NOT NULL, [step_name] [sysname] NOT NULL, [sql_message_id] [int] NOT NULL, 
[sql_severity] [int] NOT NULL, [message] [nvarchar](4000) NULL, [run_status] [int] NOT NULL, 
[run_date] [int] NOT NULL, [run_time] [int] NOT NULL, [run_duration] [int] NOT NULL, 
[operator_id_emailed] [int] NOT NULL, [operator_id_netsent] [int] NOT NULL, [operator_id_paged] [int] NOT NULL, 
[retries_attempted] [int] NOT NULL, [server] [sysname] NOT NULL, UpdatedBy NVARCHAR(128), UpdatedOn DATETIME, 
AppName nvarchar(255), HostName nvarchar(255), ContextInfo nvarchar(255))
GO

USE MSDB

CREATE TRIGGER trg_HistoryPurgeReport ON msdb.dbo.sysjobhistory
AFTER DELETE
AS
BEGIN
   INSERT INTO HistoryPurgeReport ([instance_id], [job_id], [step_id], [step_name], [sql_message_id], [sql_severity], 
   [message], [run_status], [run_date], [run_time], [run_duration], [operator_id_emailed], [operator_id_netsent], 
   [operator_id_paged], [retries_attempted], [server], UpdatedBy, UpdatedOn, AppName, HostName, ContextInfo)
   SELECT [instance_id], [job_id], [step_id], [step_name], [sql_message_id], [sql_severity], 
   [message], [run_status], [run_date], [run_time], [run_duration], [operator_id_emailed], [operator_id_netsent], 
   [operator_id_paged], [retries_attempted], [server], SUSER_SNAME(), getdate(), APP_NAME(), HOST_NAME(), CONTEXT_INFO()
   FROM deleted
END
GO

引用自:https://dba.stackexchange.com/questions/210161