Delen via


GEBEURTENISMELDING MAKEN (Transact-SQL)

Van toepassing op:SQL ServerAzure SQL Managed Instance

Hiermee maakt u een object waarmee informatie over een database- of server-gebeurtenis naar een Service Broker-service wordt verzonden. Gebeurtenismeldingen worden alleen gemaakt met behulp van Transact-SQL instructies.

Transact-SQL syntaxis-conventies

Syntaxis

CREATE EVENT NOTIFICATION event_notification_name
ON { SERVER | DATABASE | QUEUE queue_name }
[ WITH FAN_IN ]
FOR { event_type | event_group } [ , ...n ]
TO SERVICE 'broker_service' , { 'broker_instance_specifier' | 'current database' }
[ ; ]

Arguments

event_notification_name

De naam van de gebeurtenismelding. De naam van een gebeurtenismelding moet voldoen aan de regels voor id's en moet uniek zijn binnen het bereik waarin ze worden gemaakt: SERVER, DATABASEof object_name.

SERVER

Hiermee past u het bereik van de gebeurtenismelding toe op het huidige exemplaar van SQL Server. Indien opgegeven, wordt de melding geactiveerd wanneer de opgegeven gebeurtenis in de FOR component zich ergens in het exemplaar van SQL Server voordoet.

Opmerking

Deze optie is niet beschikbaar in een ingesloten database.

DATABASE

Hiermee past u het bereik van de gebeurtenismelding toe op de huidige database. Indien opgegeven, wordt de melding geactiveerd wanneer de opgegeven gebeurtenis in de FOR component plaatsvindt in de huidige database.

QUEUE

Hiermee wordt het bereik van de melding toegepast op een specifieke wachtrij in de huidige database. QUEUE kan alleen worden opgegeven als FOR QUEUE_ACTIVATION of FOR BROKER_QUEUE_DISABLED ook is opgegeven.

queue_name

De naam van de wachtrij waarop de gebeurtenismelding van toepassing is. queue_name kan alleen worden opgegeven als QUEUE deze is opgegeven.

MET FAN_IN

Geeft SQL Server de opdracht om slechts één bericht per gebeurtenis te verzenden naar een opgegeven service voor alle gebeurtenismeldingen die:

  • Worden gemaakt op dezelfde gebeurtenis.
  • Worden gemaakt met dezelfde principal (zoals geïdentificeerd door dezelfde SID).
  • Geef dezelfde service en broker_instance_specifier op.
  • Geef WITH FAN_IN op.

Er worden bijvoorbeeld drie gebeurtenismeldingen gemaakt. Alle gebeurtenismeldingen geven FOR ALTER_TABLE, WITH FAN_INdezelfde TO SERVICE component op en worden gemaakt door dezelfde SID. Wanneer een ALTER TABLE instructie wordt uitgevoerd, worden de berichten die door deze drie gebeurtenismeldingen worden gemaakt, samengevoegd in één. Daarom ontvangt de doelservice slechts één bericht van de gebeurtenis.

event_type

De naam van een gebeurtenistype waardoor de gebeurtenismelding wordt uitgevoerd. event_type kan een Transact-SQL DDL-gebeurtenistype, een SQL Trace-gebeurtenistype of een Service Broker-gebeurtenistype zijn. Zie DDL-gebeurtenissen voor een lijst met in aanmerking komende Transact-SQL DDL-gebeurtenistypen. Service Broker-gebeurtenistypen zijn QUEUE_ACTIVATION en BROKER_QUEUE_DISABLED. Zie Gebeurtenismeldingen voor meer informatie.

event_group

De naam van een vooraf gedefinieerde groep van Transact-SQL- of SQL Trace-gebeurtenistypen. Een gebeurtenismelding kan worden geactiveerd na uitvoering van een gebeurtenis die deel uitmaakt van een gebeurtenisgroep. Zie DDL-gebeurtenisgroepen voor een lijst met DDL-gebeurtenisgroepen, de Transact-SQL gebeurtenissen die ze behandelen en het bereik waarop ze kunnen worden gedefinieerd.

event_group fungeert ook als macro, wanneer de CREATE EVENT NOTIFICATION instructie is voltooid, door de gebeurtenistypen toe te voegen die worden behandeld aan de sys.events catalogusweergave.

'broker_service'

Hiermee geeft u de doelservice op die de gegevens van het gebeurtenisexemplaren ontvangt. SQL Server opent een of meer gesprekken naar de doelservice voor de gebeurtenismelding. Deze service moet voldoen aan hetzelfde berichttype en contract voor SQL Server-gebeurtenissen dat wordt gebruikt om het bericht te verzenden.

De gesprekken blijven geopend totdat de gebeurtenismelding wordt verwijderd. Bepaalde fouten kunnen ertoe leiden dat de gesprekken eerder worden gesloten. Het beëindigen van sommige of alle gesprekken kan verhinderen dat de doelservice meer berichten ontvangt.

{ 'broker_instance_specifier' | 'huidige database' }

Hiermee geeft u een servicebrokerexemplaren op waarmee broker_service is opgelost. De waarde voor een specifieke servicebroker kan worden verkregen door een query uit te voeren op de service_broker_guid kolom van de sys.databases catalogusweergave. Hiermee 'current database' geeft u het servicebrokerexemplaren op in de huidige database. 'current database' is een letterlijke letterlijke tekenreeks die niet hoofdlettergevoelig is.

Opmerking

Deze optie is niet beschikbaar in een ingesloten database.

Opmerkingen

Service Broker bevat een berichttype en een contract dat specifiek is bedoeld voor gebeurtenismeldingen. Daarom hoeft er geen Service Broker-initiërende service te worden gemaakt omdat er al een bestaat die de volgende contractnaam opgeeft: http://schemas.microsoft.com/SQL/Notifications/PostEventNotification

De doelservice die gebeurtenismeldingen ontvangt, moet aan dit vooraf bestaande contract voldoen.

Belangrijk

Service Broker-dialoogvensterbeveiliging moet worden geconfigureerd voor gebeurtenismeldingen die berichten verzenden naar een servicebroker op een externe server. De beveiliging van dialoogvensters moet handmatig worden geconfigureerd volgens het volledige beveiligingsmodel. Zie Dialoogvensterbeveiliging configureren voor gebeurtenismeldingen voor meer informatie.

Als een gebeurtenistransactie die een melding activeert, wordt teruggedraaid, wordt het verzenden van de gebeurtenismelding ook teruggedraaid. Gebeurtenismeldingen worden niet geactiveerd door een actie die is gedefinieerd in een trigger wanneer de transactie wordt doorgevoerd of teruggedraaid binnen de trigger. Omdat traceringsgebeurtenissen niet afhankelijk zijn van transacties, worden gebeurtenismeldingen op basis van traceringsgebeurtenissen verzonden, ongeacht of de transactie die deze activeert, wordt teruggedraaid.

Als het gesprek tussen de server en de doelservice wordt verbroken nadat een gebeurtenismelding is geactiveerd, wordt er een fout gerapporteerd en wordt de gebeurtenismelding verwijderd.

De gebeurtenistransactie die oorspronkelijk de melding heeft gestart, wordt niet beïnvloed door het slagen of mislukken van het verzenden van de gebeurtenismelding.

Elke fout bij het verzenden van een gebeurtenismelding wordt vastgelegd.

Permissions

Als u een gebeurtenismelding wilt maken die is gericht op de database (ON DATABASE), moet u toestemming in de huidige database hebben CREATE DATABASE DDL EVENT NOTIFICATION .

Als u een gebeurtenismelding wilt maken op een DDL-instructie die is gericht op de server (ON SERVER), moet u toestemming op de server hebben CREATE DDL EVENT NOTIFICATION .

Als u een gebeurtenismelding wilt maken voor een tracerings gebeurtenis, moet u toestemming op de server hebben CREATE TRACE EVENT NOTIFICATION .

Als u een gebeurtenismelding wilt maken die is gericht op een wachtrij, moet u toestemming voor de wachtrij hebben ALTER .

Voorbeelden

Opmerking

In voorbeelden A en B is de GUID in de TO SERVICE 'NotifyService' component (8140a771-3c4b-4479-8ac0-81008ab17984) specifiek voor de computer waarop het voorbeeld is ingesteld. In dat geval was het de GUID voor de AdventureWorks2025-database.

Als u deze voorbeelden wilt kopiëren en uitvoeren, moet u deze GUID vervangen door een van uw computer en SQL Server-exemplaar. Zoals uitgelegd in de sectie Argumenten , kunt u de 'broker_instance_specifier' verkrijgen door een query uit te voeren op de service_broker_guid kolom van de sys.databases catalogusweergave.

Eén. Een gebeurtenismelding maken die is gericht op de server

In het volgende voorbeeld worden de vereiste objecten gemaakt voor het instellen van een doelservice met behulp van Service Broker. De doelservice verwijst naar het berichttype en het contract van de initiërende service, specifiek voor gebeurtenismeldingen. Vervolgens wordt er een gebeurtenismelding gemaakt op die doelservice die een melding verzendt wanneer er een Object_Created traceringsevenement plaatsvindt op het exemplaar van SQL Server.

--Create a queue to receive messages.
CREATE QUEUE NotifyQueue;
GO

--Create a service on the queue that references
--the event notifications contract.
CREATE SERVICE NotifyService
    ON QUEUE NotifyQueue ([http://schemas.microsoft.com/SQL/Notifications/PostEventNotification]);
GO

--Create a route on the service to define the address
--to which Service Broker sends messages for the service.
CREATE ROUTE NotifyRoute
WITH SERVICE_NAME = 'NotifyService',
     ADDRESS = 'LOCAL';
GO

--Create the event notification.
CREATE EVENT NOTIFICATION log_ddl1
    ON SERVER
    FOR Object_Created
    TO SERVICE 'NotifyService', '8140a771-3c4b-4479-8ac0-81008ab17984';

B. Een gebeurtenismelding maken die is gericht op de database

In het volgende voorbeeld wordt een gebeurtenismelding gemaakt voor dezelfde doelservice als in het vorige voorbeeld. De gebeurtenismelding verschijnt nadat een ALTER_TABLE gebeurtenis plaatsvindt in de voorbeelddatabase van AdventureWorks2025.

CREATE EVENT NOTIFICATION Notify_ALTER_T1
    ON DATABASE
    FOR ALTER_TABLE
    TO SERVICE 'NotifyService', '8140a771-3c4b-4479-8ac0-81008ab17984';

C. Informatie ophalen over een gebeurtenismelding met serverbereik

In het volgende voorbeeld wordt een query uitgevoerd op de sys.server_event_notifications catalogusweergave voor metagegevens over gebeurtenismeldingen log_ddl1 die zijn gemaakt met serverbereik.

SELECT *
FROM sys.server_event_notifications
WHERE name = 'log_ddl1';

D. Informatie ophalen over een gebeurtenismelding met databasebereik

In het volgende voorbeeld wordt een query uitgevoerd op de sys.event_notifications catalogusweergave voor metagegevens over gebeurtenismeldingen Notify_ALTER_T1 die zijn gemaakt met databasebereik.

SELECT *
FROM sys.event_notifications
WHERE name = 'Notify_ALTER_T1';