web-dev-qa-db-ja.com

SQL Serverエージェントのログアクションとジョブに対して行われた変更

SQL Serverエージェントジョブに対して行われた変更を追跡する方法はありますか?

あなたが誰かがあなたの仕事の設定で遊んでいると信じる理由があった場合。誰がそれを行ったのか、個々のジョブにどこから変更が加えられたのかを追跡するにはどうすればよいですか?

私は拡張イベントの線に沿って考えています。

5
Peter

簡単にするために、sysjobs、sysjobsteps、およびsysjobschedulesを追跡するとします。監視したい他のテーブルがあるかもしれません。

オプション1:SQL監査(Enterprise Editionが必要)

USE [master]
GO

-- Audit
CREATE SERVER AUDIT [jobs]
TO FILE 
(   FILEPATH = N'PathToSomeFolder'
    ,MAXSIZE = 0 MB
    ,MAX_ROLLOVER_FILES = 2147483647
    ,RESERVE_DISK_SPACE = OFF
)
WITH
(   QUEUE_DELAY = 1000
    ,ON_FAILURE = CONTINUE
    ,AUDIT_GUID = 'e807469a-6c9d-43f1-af46-cf7b89ba898d'
)
ALTER SERVER AUDIT [jobs] WITH (STATE = ON)
GO

USE [msdb]
GO

CREATE DATABASE AUDIT SPECIFICATION [job_changes]
FOR SERVER AUDIT [jobs]
ADD (UPDATE ON OBJECT::[dbo].[sysjobs] BY [public]),
ADD (UPDATE ON OBJECT::[dbo].[sysjobsteps] BY [public]),
ADD (UPDATE ON OBJECT::[dbo].[sysjobschedules] BY [public])
WITH (STATE = ON)
GO

監査によって取得されたデータは次のようになります: SQL Audit

オプション2:拡張イベントセッション

-- Step 1: extract object_id for the following tables
SELECT object_id 
from sys.tables
WHERE name IN ('sysjobs','sysjobsteps','sysjobschedules');

-- Step 2: use those object_ids in the following session:
CREATE EVENT SESSION [capture_job_changes] ON SERVER
ADD EVENT sqlserver.lock_acquired (
    SET collect_database_name = (0)
        ,collect_resource_description = (1)
    ACTION(sqlserver.client_app_name, sqlserver.is_system, sqlserver.server_principal_name)
    WHERE (
        [package0].[equal_boolean]([sqlserver].[is_system], (0)) -- user SPID
        AND [package0].[equal_uint64]([resource_type], (5)) -- OBJECT
        AND [package0].[equal_uint64]([database_id], (4))  -- msdb
        AND (
               [object_id] = 1125579048 -- sysjobs
            OR [object_id] = 1269579561 -- sysjobsteps
            OR [object_id] = 1477580302 -- sysjobschedules
        )
        AND (
               [mode] = (8) -- IX
            OR [mode] = (5) -- X
        )
    )
)
WITH (
     MAX_MEMORY = 20480 KB
    ,EVENT_RETENTION_MODE = ALLOW_MULTIPLE_EVENT_LOSS
    ,MAX_DISPATCH_LATENCY = 30 SECONDS
    ,MAX_EVENT_SIZE = 0 KB
    ,MEMORY_PARTITION_MODE = NONE
    ,TRACK_CAUSALITY = OFF
    ,STARTUP_STATE = OFF
);
GO

-- Step 3: add a convenient target to the session (file target?)

XEセッションのデータは次のようになります。 XE session

この2番目のオプションに関して、私は同様の主題( tracking object usage )に関するブログ投稿を書いて、テクニックの詳細を説明しました。基本的に、IX/Xロックは基礎となるテーブルの更新と見なすことができます。

このセッションは最低限の内容をキャプチャしますが、SQLテキストやコンピュータ名など、意味のあるものをキャプチャするために、さらにフィールド/アクションを追加できます。

4
spaghettidba