Exemple : Créer une alerte SQL Server Agent avec le fournisseur WMI
S'applique à : SQL Server
Une façon courante d'utiliser le fournisseur d'événements WMI consiste à créer des alertes de l'Agent SQL Server qui répondent à des événements spécifiques. L'exemple suivant présente une alerte simple qui enregistre les événements du graphique de blocage XML dans une table pour leur analyse ultérieure. L'Agent SQL Server soumet une demande WQL, reçoit des événements WMI et exécute un travail en réponse à l'événement. Remarquez que, bien que plusieurs objets Service Broker soient impliqués dans le traitement du message de notification, le fournisseur d'événements WMI gère les détails de la création et de la gestion de ces objets.
Exemple
En premier lieu, une table est créée dans la base de données AdventureWorks2022
pour contenir l'événement du graphique du blocage. La table contient deux colonnes : la colonne AlertTime
contient l'heure à laquelle l'alerte s'exécute et la colonne DeadlockGraph
contient le document XML qui inclut le graphique du blocage.
Ensuite, l'alerte est créée. Le script crée d’abord le travail que l’alerte exécutera, ajoute une étape de travail au travail et cible le travail à l’instance actuelle de SQL Server. Le script crée alors l'alerte.
L’étape de travail récupère la TextData
propriété de l’instance d’événement WMI et insère cette valeur dans la DeadlockGraph
colonne de la DeadlockEvents
table. SQL Server convertit implicitement la chaîne au format XML. Étant donné que l’étape de travail utilise le sous-système Transact-SQL, l’étape de travail ne spécifie pas de proxy.
L'alerte exécute le travail chaque fois qu'un événement de trace du graphique du blocage est consigné. Pour une alerte WMI, l'Agent SQL Server crée une requête de notification à l'aide de l'espace de noms et de l'instruction WQL spécifiés. Pour cette alerte, l'Agent SQL Server analyse l'instance par défaut sur l'ordinateur local. L'instruction WQL demande un événement DEADLOCK_GRAPH
quelconque dans l'instance par défaut. Pour modifier l'instance que l'alerte surveille, substituez le nom de l'instance pour MSSQLSERVER
dans le @wmi_namespace
pour l'alerte.
Remarque
Pour que SQL Server Agent reçoive des événements WMI, Service Broker doit être activé dans msdb
et AdventureWorks2022
.
USE AdventureWorks2022;
GO
IF OBJECT_ID('DeadlockEvents', 'U') IS NOT NULL
DROP TABLE DeadlockEvents;
GO
CREATE TABLE DeadlockEvents (
AlertTime DATETIME,
DeadlockGraph XML
);
GO
Ajoutez un travail pour que l’alerte s’exécute.
EXEC msdb.dbo.sp_add_job @job_name = N'Capture Deadlock Graph',
@enabled = 1,
@description = N'Job for responding to DEADLOCK_GRAPH events';
GO
Ajoutez une étape de travail qui insère l’heure actuelle et le graphique d’interblocage dans la DeadlockEvents
table.
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
Définissez le serveur de travaux pour le travail sur l’instance actuelle de SQL Server.
EXEC msdb.dbo.sp_add_jobserver @job_name = N'Capture Deadlock Graph';
GO
Ajoutez une alerte qui répond à tous les DEADLOCK_GRAPH
événements de l’instance par défaut. Pour surveiller les interblocages d’une autre instance, remplacez MSSQLSERVER
le nom de l’instance.
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
Tester l’exemple
Pour voir le travail s'exécuter, provoquez un blocage. Dans SQL Server Management Studio, ouvrez deux onglets requête SQL et connectez les deux requêtes à la même instance. Exécutez le script ci-dessous sous l'un des onglets de requête. Ce script produit un jeu de résultats et se termine.
USE AdventureWorks2022;
GO
BEGIN TRANSACTION;
GO
SELECT TOP (1) Name
FROM Production.Product WITH (XLOCK);
GO
Exécutez le script suivant dans le deuxième onglet de requête. Ce script produit un jeu de résultats, puis bloque, en attendant d’acquérir un verrou sur 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
Exécutez le script suivant dans le premier onglet de requête. Ce script bloque, en attendant d’acquérir un verrou sur Production.Location
. Après un court délai d’attente, SQL Server choisit ce script ou le script dans l’exemple comme victime d’interblocage et termine la transaction.
SELECT TOP(1) Name FROM Production.Location WITH (XLOCK);
GO
Après avoir provoqué le blocage, attendez un certain temps que l'Agent SQL Server active l'alerte et exécute le travail. Examinez le contenu de la table DeadlockEvents
en exécutant le script suivant :
SELECT * FROM DeadlockEvents;
GO
La colonne DeadlockGraph
doit contenir un document XML qui indique toutes les propriétés de l'événement du graphique du blocage.