Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Van toepassing op:SQL Server
Dit artikel geeft richtlijnen waar je rekening mee moet houden voordat je programmeert met de WMI Provider for Server Events.
Enable Service Broker
De WMI Provider for Server Events werkt door WQL-query's voor events te vertalen naar gebeurtenismeldingen in de database waarop je je richt. Inzicht in hoe gebeurtenismeldingen werken kan nuttig zijn bij het programmeren tegen de provider. Voor meer informatie, zie WMI Provider voor Server Events-concepten.
In het bijzonder omdat de gebeurtenismeldingen die door de WMI-provider worden gemaakt SQL Server gebruiken om berichten over servergebeurtenissen te verzenden, moet deze dienst worden ingeschakeld waar de gebeurtenissen worden gegenereerd. Als je programma gebeurtenissen op een serverinstantie navraagt, moet de Service Broker in msdb die instantie ingeschakeld zijn, omdat dat de locatie is van de doelservice Broker (genaamd SQL/Notifications/ProcessWMIEventProviderNotification/v1.0) die door de provider wordt aangemaakt. Als je programma gebeurtenissen in een database of op een bepaald databaseobject opvraagt, moet de Service Broker in die doeldatabase ingeschakeld zijn. Als de bijbehorende Service Broker niet is ingeschakeld nadat je applicatie is uitgerold, worden alle gebeurtenissen die door de onderliggende gebeurtenismelding worden gegenereerd naar de wachtrij van de dienst die door de gebeurtenismelding wordt gebruikt, maar worden ze pas teruggestuurd naar je WMI-beheerapplicatie als Service Broker is ingeschakeld.
De volgende query bepaalt welke servicebrokers zijn ingeschakeld op een serverinstantie, en de broker-instantie GUID:
SELECT name, is_broker_enabled, service_broker_guid FROM sys.databases;
De servicebroker GUID is msdb bijzonder interessant omdat dat de locatie is van de doeldienst van de aanbieder.
Om Service Broker in een database in te schakelen, gebruikt u de ENABLE_BROKER SET-optie van de ALTER DATABASE-instructie .
Specificeer een verbindingsstring
Applicaties sturen de WMI-provider voor servergebeurtenissen naar een instantie van SQL Server door verbinding te maken met een door de provider gedefinieerde WMI-naamruimte. De Windows WMI-service mappt deze naamruimte naar de provider DLL, Sqlwep.dll, en laadt deze in het geheugen. Elke instantie van SQL Server heeft zijn eigen WMI-naamruimte, die standaard is: \\.\root\Microsoft\SqlServer\ServerEvents\instance_name. instance_name standaard MSSQLSERVER in een standaardinstallatie van SQL Server.
Rechten en serverauthenticatie
Om toegang te krijgen tot de WMI Provider for Server Events, moet de client waarop een WMI-beheerapplicatie afkomstig is, overeenkomen met Windows-geauthenticeerde login of groep in de instantie van SQL Server die is gespecificeerd in de verbindingsstring van de applicatie.
Machtigingen en eventmeldingsscope
De WMI Provider for Server Events vertaalt WQL-query's naar gebeurtenismeldingen in de doeldatabase. Hierdoor moet de aanroepende applicatie niet alleen de vereiste minimale rechten hebben om toegang te krijgen tot de provider, maar ook de juiste rechten in de database om de vereiste gebeurtenismeldingen te maken. De volgende zijn de toestemmingen:
Om een gebeurtenismelding te maken die aan de database is gekoppeld, is minimaal de toestemming CREATE DATABASE DDL EVENT NOTIFICATION vereist in de huidige database.
Om een gebeurtenismelding te maken op een DDL-instructie die naar de server is gericht, is minimaal de toestemming CREATE DDL EVENT NOTIFICATION op de server vereist.
Om een gebeurtenismelding op een trace-event te maken, is minimaal de toestemming CREATE TRACE EVENT NOTIFICATION in de server vereist.
Om een gebeurtenismelding te maken die beperkt is naar een wachtrij, is minimaal een ALTER-toestemming op de wachtrij vereist.
Voor informatie over hoe WQL-queries worden ingedeeld, zie Using WQL with the WMI Provider for Server Events.
Om de scope te illustreren, beschouw een WMI Provider-applicatie die de volgende WQL-query bevat:
SELECT * FROM ALTER_TABLE
WHERE DatabaseName = "AdventureWorks2022"
AND SchemaName = "Person"
AND ObjectName = "Person"
AND ObjectType = "TABLE";
De WMI-provider vertaalt deze query naar een gebeurtenismelding die in de AdventureWorks2025 database wordt aangemaakt. Dit betekent dat de aanroeper de vereiste rechten moet hebben om zo'n gebeurtenismelding te maken, specifiek de toestemming CREATE DATABASE DDL EVENT NOTIFICATION in de AdventureWorks2025 database.
Als een WQL-query een gebeurtenismelding specificeert die op serverniveau is gescoped, bijvoorbeeld door de query SELECT * FROM ALTER_TABLE te doen, moet de aanroepende applicatie de server-niveau CREATE DDL EVENT NOTIFICATION toestemming hebben. Server-scoped gebeurtenismeldingen worden opgeslagen in de master database. Je kunt de catalogusweergave van sys.server_event_notifications gebruiken om hun metadata te bekijken.
Opmerking
De reikwijdte van de gebeurtenismelding die door de WMI-provider (server, database of object) wordt gemaakt, hangt uiteindelijk af van het resultaat van het verificatieproces voor toestemmingen dat door de WMI-provider wordt gebruikt. Dit wordt beïnvloed door de permissieset van de gebruiker die de provider aanroept en door de verificatie van de database die wordt geraadpleegd.
In het vorige voorbeeld probeert de provider eerst een gebeurtenismelding te maken die is beperkt tot de database (ON DATABASE). Als de provider verifieert dat de database bestaat en dat de aanroeper de benodigde rechten heeft om een gebeurtenismelding te maken, is de registratie succesvol. Als het niet lukt, probeert de provider een gebeurtenismelding op de server te maken (ON SERVER). Aangenomen dat deze poging succesvol is, worden alle ALTER_TABLE gebeurtenissen die op de server plaatsvinden van het SQL Server-proces naar het WMI Service-proces gestuurd. De aanbieder filtert echter alle gebeurtenissen die niet op de AdventureWorks2025 database van toepassing zijn. Hoewel dit proces mogelijk de hoeveelheid netwerkverkeer die nodig is voor de scope van het evenement mogelijk vergroot, biedt dit proces u ook de flexibiliteit om WQL-queries op databases te registreren voordat ze worden aangemaakt, en vervolgens gebeurtenisgegevens te ontvangen nadat de database is aangemaakt en DDL-activiteit erop begint.
Rechten en berichtverificatie
De WMI-provider stuurt geen berichten voor gebeurtenismeldingen als beide volgende voorwaarden waar zijn:
De gebruiker die de gebeurtenismelding via de WMI-provider heeft gemaakt, bestaat niet langer in de database, of heeft niet langer de vereiste toestemming om een vergelijkbare gebeurtenismelding te maken.
De evenementmeldingen worden gemaakt op de volgende evenementen:
DROP_LOGINALTER_LOGINDROP_USERALTER_USERADD_ROLE_MEMBERDROP_ROLE_MEMBERADD_SERVER_ROLE_MEMBERDROP_SERVER_ROLE_MEMBERDENYofREVOKE(Alleen van toepassing opALTER DATABASE,ALTER ANY DATABASE EVENT NOTIFICATION,CREATE DATABASE DDL EVENT NOTIFICATION, ,CONTROL SERVER,ALTER ANY EVENT NOTIFICATION, ,CREATE DDL EVENT NOTIFICATION, ofCREATE TRACE EVENT NOTIFICATIONpermissies.)
Werk met gebeurtenisdata aan de clientzijde
Nadat de WMI Provider for Server Events de vereiste gebeurtenismelding in de doeldatabase heeft gemaakt, stuurt de gebeurtenismelding gebeurtenisgegevens naar de doeldienst die msdbSQL/Notifications/ProcessWMIEventProviderNotification/v1.0 heet. De doelservice plaatst het evenement in een wachtrij die msdbWMIEventProviderNotificationQueue heet. (Zowel de service als de wachtrij worden dynamisch aangemaakt door de provider wanneer deze voor het eerst verbinding maakt met SQL Server.) De provider leest vervolgens de XML-gebeurtenisgegevens uit deze wachtrij en transformeert deze naar managed object format (MOF) voordat deze wordt teruggestuurd naar de clientapplicatie. De MOF-gegevens bestaan uit de eigenschappen van het event dat door de WQL-query wordt opgevraagd als een Common Information Model (CIM) klassedefinitie. Elke eigenschap heeft een overeenkomstig CIM-type. Bijvoorbeeld, de SPID eigenschap wordt teruggegeven als CIM-type Sint32. De CIM-types voor elke eigenschap worden vermeld onder elke gebeurtenisklasse in WMI Provider for Server Events classes and properties.