Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
platí pro:SQL Server
azure SQL Managed Instance
Vytvoří objekt, který odesílá informace o události databáze nebo serveru do služby Service Broker. Oznámení událostí se vytvářejí jenom pomocí příkazů Transact-SQL.
Syntaxe
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
Název oznámení události. Název oznámení události musí splňovat pravidla pro identifikátory a musí být jedinečný v rámci oboru, ve kterém jsou vytvořeny: SERVER, DATABASEnebo object_name.
SERVER
Použije obor oznámení události na aktuální instanci SQL Serveru. Pokud je zadáno, oznámení se aktivuje vždy, když zadaná událost v FOR klauzuli nastane kdekoli v instanci SQL Serveru.
Poznámka:
Tato možnost není dostupná v databázi s omezením.
DATABASE
Použije obor oznámení události na aktuální databázi. Pokud je zadáno, oznámení se aktivuje vždy, když se zadaná událost v FOR klauzuli vyskytuje v aktuální databázi.
QUEUE
Použije obor oznámení na konkrétní frontu v aktuální databázi.
QUEUE lze zadat pouze v případě, že FOR QUEUE_ACTIVATION je FOR BROKER_QUEUE_DISABLED zadán nebo je také zadán.
queue_name
Název fronty, na kterou se vztahuje oznámení události.
queue_name lze zadat pouze v případě, že QUEUE je zadán.
S FAN_IN
Dává SQL Serveru pokyn, aby všem oznámením o událostech odeslal pouze jednu zprávu na každou zadanou službu:
- Vytvoří se ve stejné události.
- Jsou vytvořeny stejným objektem zabezpečení (jak je identifikováno stejným identifikátorem SID).
- Zadejte stejnou službu a broker_instance_specifier.
- Zadejte
WITH FAN_IN.
Vytvoří se například tři oznámení událostí. Všechna oznámení událostí určují FOR ALTER_TABLE, WITH FAN_IN, stejnou TO SERVICE klauzuli a jsou vytvořeny stejným identifikátorem SID.
ALTER TABLE Při spuštění příkazu se zprávy vytvořené těmito třemi oznámeními událostí sloučí do jednoho. Cílová služba proto obdrží pouze jednu zprávu události.
event_type
Název typu události, který způsobí spuštění oznámení události.
event_type může být typ události Transact-SQL DDL, typ události trasování SQL nebo typ události Service Broker. Seznam opravňujících Transact-SQL typů událostí DDL najdete v tématu Události DDL. Typy událostí služby Service Broker jsou QUEUE_ACTIVATION a BROKER_QUEUE_DISABLED. Další informace najdete v tématu Oznámení událostí.
event_group
Název předdefinované skupiny Transact-SQL nebo typů událostí trasování SQL. Oznámení o události se může aktivovat po spuštění jakékoli události, která patří do skupiny událostí. Seznam skupin událostí DDL, Transact-SQL události, které pokrývají, a rozsah, ve kterém je možné definovat, najdete v tématu Skupiny událostí DDL.
event_group také funguje jako makro, jakmile CREATE EVENT NOTIFICATION se příkaz dokončí, přidáním typů událostí, které pokrývá do sys.events zobrazení katalogu.
"broker_service"
Určuje cílovou službu, která přijímá data instance události. SQL Server otevře jednu nebo více konverzací cílové službě pro oznámení události. Tato služba musí respektovat stejný typ zprávy událostí SQL Serveru a kontrakt, který se používá k odeslání zprávy.
Konverzace zůstanou otevřené, dokud se oznámení o události nepřeřadí. Některé chyby můžou způsobit dřívější zavření konverzací. Ukončení některých nebo všech konverzací explicitně může cílové službě zabránit v příjmu více zpráv.
{ 'broker_instance_specifier' | Aktuální databáze }
Určuje instanci zprostředkovatele služeb, pro kterou se přeloží broker_service . Hodnotu pro konkrétního zprostředkovatele služeb lze získat dotazováním service_broker_guid sloupce sys.databases zobrazení katalogu. Slouží 'current database' k určení instance služby Service Broker v aktuální databázi.
'current database' je řetězcový literál nerozlišující velká a malá písmena.
Poznámka:
Tato možnost není dostupná v databázi s omezením.
Poznámky
Service Broker obsahuje typ zprávy a kontrakt speciálně pro oznámení událostí. Proto se služba Service Broker iniciující službu nemusí vytvářet, protože ta již existuje, která určuje následující název kontraktu: http://schemas.microsoft.com/SQL/Notifications/PostEventNotification
Cílová služba, která přijímá oznámení událostí, musí respektovat tento existující kontrakt.
Důležité
Zabezpečení dialogového okna Service Broker by mělo být nakonfigurováno pro oznámení událostí, která odesílají zprávy zprostředkovateli služeb na vzdáleném serveru. Zabezpečení dialogového okna musí být nakonfigurováno ručně podle úplného modelu zabezpečení. Další informace naleznete v tématu Konfigurace zabezpečení dialogového okna pro oznámení událostí.
Pokud se vrátí zpět transakce události, která aktivuje oznámení, bude odeslání oznámení události vráceno zpět. Oznámení událostí se neaktivují akcí definovanou v triggeru, když je transakce potvrzena nebo vrácena zpět uvnitř triggeru. Vzhledem k tomu, že události trasování nejsou vázány transakcemi, oznámení událostí založená na událostech trasování se odesílají bez ohledu na to, jestli se transakce, která je aktivuje, vrátí zpět.
Pokud se konverzace mezi serverem a cílovou službou po spuštění oznámení o události přeruší, oznámí se chyba a oznámení o události se zahodí.
Transakce události, která původně spustila oznámení, není ovlivněna úspěchem nebo selháním odeslání oznámení události.
Zaprotokoluje se případná chyba při odesílání oznámení o události.
Povolení
Chcete-li vytvořit oznámení události, které je vymezeno na databázi (ON DATABASE), vyžaduje CREATE DATABASE DDL EVENT NOTIFICATION oprávnění v aktuální databázi.
Chcete-li vytvořit oznámení události v příkazu DDL, který je vymezen na server (ON SERVER), vyžaduje CREATE DDL EVENT NOTIFICATION oprávnění na serveru.
Chcete-li vytvořit oznámení události pro událost trasování, vyžaduje CREATE TRACE EVENT NOTIFICATION oprávnění na serveru.
Chcete-li vytvořit oznámení události, které je vymezeno na frontu, vyžaduje ALTER oprávnění pro frontu.
Examples
Poznámka:
V příkladech A a B je identifikátor GUID v TO SERVICE 'NotifyService' klauzuli (8140a771-3c4b-4479-8ac0-81008ab17984) specifický pro počítač, na kterém byl příklad nastaven. V tomto případě to byl GUID pro databázi AdventureWorks2025.
Pokud chcete tyto příklady zkopírovat a spustit, musíte tento identifikátor GUID nahradit jedním z počítačů a instance SYSTÉMU SQL Server. Jak je vysvětleno v části Argumenty , můžete získat broker_instance_specifier dotazováním service_broker_guid sloupce sys.databases zobrazení katalogu.
A. Vytvoření oznámení události s vymezeným oborem serveru
Následující příklad vytvoří požadované objekty pro nastavení cílové služby pomocí Service Broker. Cílová služba odkazuje na typ zprávy a kontrakt iniciační služby speciálně pro oznámení událostí. Pak se v cílové službě vytvoří oznámení o události, která odesílá oznámení vždy, když Object_Created dojde k události trasování v instanci SQL Serveru.
--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. Vytvoření oznámení události s vymezeným oborem databáze
Následující příklad vytvoří oznámení události ve stejné cílové službě jako předchozí příklad. Oznámení o události se spustí poté, co se událost ALTER_TABLE odehraje v databázi AdventureWorks2025.
CREATE EVENT NOTIFICATION Notify_ALTER_T1
ON DATABASE
FOR ALTER_TABLE
TO SERVICE 'NotifyService', '8140a771-3c4b-4479-8ac0-81008ab17984';
C. Získání informací o oznámení události s vymezeným oborem serveru
Následující příklad dotazuje sys.server_event_notifications zobrazení katalogu na metadata o oznámení log_ddl1 událostí, které bylo vytvořeno s oborem serveru.
SELECT *
FROM sys.server_event_notifications
WHERE name = 'log_ddl1';
D. Získání informací o oznámení události s vymezeným oborem databáze
Následující příklad dotazuje sys.event_notifications zobrazení katalogu na metadata o oznámení Notify_ALTER_T1 událostí, které bylo vytvořeno s oborem databáze.
SELECT *
FROM sys.event_notifications
WHERE name = 'Notify_ALTER_T1';