Not
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
gäller för:SQL Server
Azure SQL Managed Instance
Skapar ett objekt som skickar information om en databas- eller serverhändelse till en Service Broker-tjänst. Händelsemeddelanden skapas endast med hjälp av Transact-SQL-instruktioner.
Transact-SQL syntaxkonventioner
Syntax
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
Namnet på händelsemeddelandet. Ett händelsemeddelandenamn måste följa reglerna för identifierare och måste vara unikt inom omfånget där de skapas: SERVER, DATABASEeller object_name.
SERVER
Tillämpar omfånget för händelsemeddelandet på den aktuella instansen av SQL Server. Om det anges utlöses meddelandet när den angivna händelsen i FOR -satsen inträffar var som helst i SQL Server-instansen.
Anmärkning
Det här alternativet är inte tillgängligt i en innesluten databas.
DATABAS
Tillämpar omfånget för händelsemeddelandet på den aktuella databasen. Om det anges utlöses meddelandet när den angivna händelsen i FOR satsen inträffar i den aktuella databasen.
QUEUE
Tillämpar omfånget för meddelandet på en specifik kö i den aktuella databasen.
QUEUE kan endast anges om FOR QUEUE_ACTIVATION eller FOR BROKER_QUEUE_DISABLED också anges.
queue_name
Namnet på kön som händelsemeddelandet gäller för.
queue_name kan endast anges om QUEUE det har angetts.
MED_IN
Instruerar SQL Server att endast skicka ett meddelande per händelse till en angiven tjänst för alla händelsemeddelanden som:
- Skapas på samma händelse.
- Skapas av samma huvudnamn (som identifierats av samma SID).
- Ange samma tjänst och broker_instance_specifier.
- Ange
WITH FAN_IN.
Till exempel skapas tre händelseaviseringar. Alla händelsemeddelanden anger FOR ALTER_TABLE, WITH FAN_IN, samma TO SERVICE sats och skapas av samma SID. När en ALTER TABLE instruktion körs sammanfogas de meddelanden som skapas av dessa tre händelsemeddelanden till en. Därför tar måltjänsten bara emot ett meddelande om händelsen.
event_type
Namnet på en händelsetyp som gör att händelsemeddelandet körs.
event_type kan vara en Transact-SQL DDL-händelsetyp, en SQL Trace-händelsetyp eller en Service Broker-händelsetyp. En lista över kvalificerande Transact-SQL DDL-händelsetyper finns i DDL-händelser. Service Broker-händelsetyper är QUEUE_ACTIVATION och BROKER_QUEUE_DISABLED. Mer information finns i Händelseaviseringar.
event_group
Namnet på en fördefinierad grupp med Transact-SQL- eller SQL Trace-händelsetyper. Ett händelsemeddelande kan utlösas efter körning av alla händelser som tillhör en händelsegrupp. En lista över DDL-händelsegrupper, de Transact-SQL händelser som de täcker och det omfång där de kan definieras finns i DDL-händelsegrupper.
event_group fungerar också som ett makro när instruktionen CREATE EVENT NOTIFICATION är klar genom att lägga till de händelsetyper som beskrivs i sys.events katalogvyn.
"broker_service"
Anger måltjänsten som tar emot händelseinstansdata. SQL Server öppnar en eller flera konversationer till måltjänsten för händelsemeddelandet. Den här tjänsten måste uppfylla samma meddelandetyp och kontrakt för SQL Server-händelser som används för att skicka meddelandet.
Konversationerna förblir öppna tills händelsemeddelandet tas bort. Vissa fel kan göra att konversationerna stängs tidigare. Att avsluta vissa eller alla konversationer explicit kan hindra måltjänsten från att ta emot fler meddelanden.
{ "broker_instance_specifier" | "aktuell databas" }
Anger en tjänstkoordinatorinstans som broker_service har lösts mot. Värdet för en specifik tjänstkoordinator kan hämtas genom att fråga kolumnen i service_broker_guidsys.databases katalogvyn. Använd 'current database' för att ange instansen för tjänstutjämning i den aktuella databasen.
'current database' är en skiftlägesokänslig strängliteral.
Anmärkning
Det här alternativet är inte tillgängligt i en innesluten databas.
Anmärkningar
Service Broker innehåller en meddelandetyp och ett kontrakt som är specifikt för händelsemeddelanden. Därför behöver inte en Service Broker-initierande tjänst skapas eftersom det redan finns en som anger följande kontraktnamn: http://schemas.microsoft.com/SQL/Notifications/PostEventNotification
Måltjänsten som tar emot händelsemeddelanden måste uppfylla det befintliga kontraktet.
Viktigt!
Dialogsäkerhet för Service Broker ska konfigureras för händelsemeddelanden som skickar meddelanden till en tjänstkoordinator på en fjärrserver. Dialogsäkerhet måste konfigureras manuellt enligt den fullständiga säkerhetsmodellen. Mer information finns i Konfigurera dialogsäkerhet för händelsemeddelanden.
Om en händelsetransaktion som aktiverar ett meddelande återställs återställs också sändningen av händelsemeddelandet. Händelsemeddelanden utlöses inte av en åtgärd som definierats i en utlösare när transaktionen checkas in eller återställs i utlösaren. Eftersom spårningshändelser inte är bundna av transaktioner skickas händelsemeddelanden baserade på spårningshändelser oavsett om transaktionen som aktiverar dem återställs.
Om konversationen mellan servern och måltjänsten bryts efter att ett händelsemeddelande utlöses rapporteras ett fel och händelsemeddelandet tas bort.
Händelsetransaktionen som ursprungligen startade meddelandet påverkas inte av att händelsemeddelandet har skickats eller misslyckats.
Eventuella fel vid sändning av ett händelsemeddelande loggas.
Permissions
För att skapa en händelseavisering som är begränsad till databasen (ON DATABASE) krävs CREATE DATABASE DDL EVENT NOTIFICATION behörighet i den aktuella databasen.
Om du vill skapa ett händelsemeddelande på en DDL-instruktion som är begränsad till servern (ON SERVER) måste du ha CREATE DDL EVENT NOTIFICATION behörighet på servern.
Om du vill skapa ett händelsemeddelande för en spårningshändelse måste du ha CREATE TRACE EVENT NOTIFICATION behörighet på servern.
Om du vill skapa en händelseavisering som är begränsad till en kö kräver ALTER du behörighet i kön.
Examples
Anmärkning
I Exempel A och B är GUID i TO SERVICE 'NotifyService' -satsen (8140a771-3c4b-4479-8ac0-81008ab17984) specifik för den dator där exemplet har konfigurerats. För det exemplet var det GUID för AdventureWorks2025-databasen.
Om du vill kopiera och köra dessa exempel måste du ersätta detta GUID med ett från datorn och SQL Server-instansen. Som beskrivs i avsnittet Argument kan du hämta "broker_instance_specifier" genom att service_broker_guid fråga kolumnen i sys.databases katalogvyn.
A. Skapa ett händelsemeddelande som är serveromfång
I följande exempel skapas de objekt som krävs för att konfigurera en måltjänst med hjälp av Service Broker. Måltjänsten refererar till meddelandetypen och kontraktet för den initierande tjänsten specifikt för händelsemeddelanden. Sedan skapas ett händelsemeddelande på måltjänsten som skickar ett meddelande när en Object_Created spårningshändelse inträffar på SQL Server-instansen.
--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. Skapa ett händelsemeddelande som är databasomfång
I följande exempel skapas ett händelsemeddelande på samma måltjänst som i föregående exempel. Händelsenotisen utlöses efter att en ALTER_TABLE händelse inträffat i AdventureWorks2025:s exempeldatabas.
CREATE EVENT NOTIFICATION Notify_ALTER_T1
ON DATABASE
FOR ALTER_TABLE
TO SERVICE 'NotifyService', '8140a771-3c4b-4479-8ac0-81008ab17984';
C. Hämta information om ett händelsemeddelande som är serveromfång
I följande exempel frågas sys.server_event_notifications katalogvyn efter metadata om händelsemeddelanden log_ddl1 som har skapats med serveromfång.
SELECT *
FROM sys.server_event_notifications
WHERE name = 'log_ddl1';
D. Hämta information om ett händelsemeddelande som är databasomfång
I följande exempel frågas sys.event_notifications katalogvyn efter metadata om händelsemeddelanden Notify_ALTER_T1 som har skapats med databasomfång.
SELECT *
FROM sys.event_notifications
WHERE name = 'Notify_ALTER_T1';