Bagikan melalui


Sampel: Membuat Pemberitahuan Agen SQL Server dengan Penyedia WMI

Berlaku untuk: SQL Server

Salah satu cara umum untuk menggunakan Penyedia Acara WMI adalah dengan membuat pemberitahuan SQL Server Agent yang merespons peristiwa tertentu. Sampel berikut menyajikan pemberitahuan sederhana yang menyimpan peristiwa grafik kebuntuan XML dalam tabel untuk analisis nanti. SQL Server Agent mengirimkan permintaan WQL, menerima peristiwa WMI, dan menjalankan pekerjaan sebagai respons terhadap peristiwa tersebut. Perhatikan bahwa, meskipun beberapa objek Service Broker terlibat dalam pemrosesan pesan pemberitahuan, Penyedia Peristiwa WMI menangani detail pembuatan dan pengelolaan objek ini.

Contoh

Pertama, tabel dibuat dalam AdventureWorks2022 database untuk menahan peristiwa grafik kebuntuan. Tabel berisi dua kolom: Kolom AlertTime menyimpan waktu pemberitahuan berjalan, dan DeadlockGraph kolom menyimpan dokumen XML yang berisi grafik kebuntuan.

Kemudian, pemberitahuan dibuat. Skrip pertama-tama membuat pekerjaan yang akan dijalankan pemberitahuan, menambahkan langkah pekerjaan ke pekerjaan, dan menargetkan pekerjaan ke instans SQL Server saat ini. Skrip kemudian membuat pemberitahuan.

Langkah pekerjaan mengambil properti instans TextData peristiwa WMI dan menyisipkan nilai tersebut ke DeadlockGraph dalam kolom DeadlockEvents tabel. SQL Server secara implisit mengonversi string menjadi format XML. Karena langkah pekerjaan menggunakan subsistem Transact-SQL, langkah pekerjaan tidak menentukan proksi.

Pemberitahuan menjalankan pekerjaan setiap kali peristiwa pelacakan grafik kebuntuan akan dicatat. Untuk pemberitahuan WMI, SQL Server Agent membuat kueri pemberitahuan menggunakan namespace layanan dan pernyataan WQL yang ditentukan. Untuk pemberitahuan ini, SQL Server Agent memantau instans default di komputer lokal. Pernyataan WQL meminta peristiwa apa pun DEADLOCK_GRAPH dalam instans default. Untuk mengubah instans yang dipantau pemberitahuan, ganti nama instans untuk MSSQLSERVER di @wmi_namespace pemberitahuan.

Catatan

Agar SQL Server Agent menerima peristiwa WMI, Service Broker harus diaktifkan di msdb dan AdventureWorks2022.

USE AdventureWorks2022;
GO

IF OBJECT_ID('DeadlockEvents', 'U') IS NOT NULL
DROP TABLE DeadlockEvents;
GO

CREATE TABLE DeadlockEvents (
    AlertTime DATETIME,
    DeadlockGraph XML
);
GO

Tambahkan pekerjaan agar pemberitahuan berjalan.

EXEC msdb.dbo.sp_add_job @job_name = N'Capture Deadlock Graph',
    @enabled = 1,
    @description = N'Job for responding to DEADLOCK_GRAPH events';
GO

Tambahkan langkah pekerjaan yang menyisipkan waktu saat ini dan grafik kebuntuan ke DeadlockEvents dalam tabel.

EXEC msdb.dbo.sp_add_jobstep @job_name = N'Capture Deadlock Graph',
    @step_name = N'Insert graph into LogEvents',
    @step_id = 1,
    @on_success_action = 1,
    @on_fail_action = 2,
    @subsystem = N'TSQL',
    @command = N'INSERT INTO DeadlockEvents
                (AlertTime, DeadlockGraph)
                VALUES (getdate(), N''$(ESCAPE_SQUOTE(WMI(TextData)))'')',
    @database_name = N'AdventureWorks2022';
GO

Atur server pekerjaan untuk pekerjaan ke instans SQL Server saat ini.

EXEC msdb.dbo.sp_add_jobserver @job_name = N'Capture Deadlock Graph';
GO

Tambahkan pemberitahuan yang merespons semua DEADLOCK_GRAPH peristiwa untuk instans default. Untuk memantau kebuntuan untuk instans yang berbeda, ubah MSSQLSERVER ke nama instans.

EXEC msdb.dbo.sp_add_alert @name = N'Respond to DEADLOCK_GRAPH',
    @wmi_namespace = N'\\.\root\Microsoft\SqlServer\ServerEvents\MSSQLSERVER',
    @wmi_query = N'SELECT * FROM DEADLOCK_GRAPH',
    @job_name = 'Capture Deadlock Graph';
GO

Uji sampel

Untuk melihat pekerjaan berjalan, memicu kebuntuan. Di SQL Server Management Studio, buka dua tab Kueri SQL dan sambungkan kedua kueri ke instans yang sama. Jalankan skrip berikut ini di salah satu tab kueri. Skrip ini menghasilkan satu tataan hasil dan selesai.

USE AdventureWorks2022;
GO

BEGIN TRANSACTION;
GO

SELECT TOP (1) Name
FROM Production.Product WITH (XLOCK);
GO

Jalankan skrip berikut di tab kueri kedua. Skrip ini menghasilkan satu tataan hasil dan kemudian memblokir, menunggu untuk memperoleh kunci pada Production.Product.

USE AdventureWorks2022;
GO

BEGIN TRANSACTION;
GO

SELECT TOP (1) Name
FROM Production.Location WITH (XLOCK);
GO

SELECT TOP (1) Name
FROM Production.Product WITH (XLOCK);
GO

Jalankan skrip berikut ini di tab kueri pertama. Skrip ini memblokir, menunggu untuk memperoleh kunci pada Production.Location. Setelah waktu habis yang singkat, SQL Server akan memilih skrip ini atau skrip dalam sampel sebagai korban kebuntuan dan mengakhiri transaksi.

SELECT TOP(1) Name FROM Production.Location WITH (XLOCK);
GO

Setelah memicu kebuntuan, tunggu beberapa saat agar SQL Server Agent mengaktifkan pemberitahuan dan menjalankan pekerjaan. Periksa konten DeadlockEvents tabel dengan menjalankan skrip berikut:

SELECT * FROM DeadlockEvents;
GO

Kolom DeadlockGraph harus berisi dokumen XML yang memperlihatkan semua properti peristiwa grafik kebuntuan.