Udostępnij za pomocą


TWORZENIE POWIADOMIENIA O ZDARZENIU (Transact-SQL)

Dotyczy:SQL ServerAzure SQL Managed Instance

Tworzy obiekt, który wysyła informacje o zdarzeniu bazy danych lub serwera do usługi Service Broker. Powiadomienia o zdarzeniach są tworzone tylko przy użyciu instrukcji Transact-SQL.

Transact-SQL konwencje składni

Składnia

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

Nazwa powiadomienia o zdarzeniu. Nazwa powiadomienia o zdarzeniach musi być zgodna z regułami identyfikatorów i musi być unikatowa w zakresie, w którym są tworzone: SERVER, DATABASElub object_name.

SERWER

Stosuje zakres powiadomienia o zdarzeniu do bieżącego wystąpienia programu SQL Server. Jeśli zostanie określony, powiadomienie jest uruchamiane za każdym razem, gdy określone zdarzenie w klauzuli występuje w FOR dowolnym miejscu w wystąpieniu programu SQL Server.

Uwaga / Notatka

Ta opcja nie jest dostępna w zawartej bazie danych.

DATABASE

Stosuje zakres powiadomienia o zdarzeniu do bieżącej bazy danych. Jeśli zostanie określony, powiadomienie jest uruchamiane za każdym razem, gdy określone zdarzenie w klauzuli FOR występuje w bieżącej bazie danych.

QUEUE

Stosuje zakres powiadomienia do określonej kolejki w bieżącej bazie danych. QUEUE Można określić tylko wtedy, gdy FOR QUEUE_ACTIVATIONFOR BROKER_QUEUE_DISABLED określono lub jest również określony.

queue_name

Nazwa kolejki, do której ma zastosowanie powiadomienie o zdarzeniu. queue_name można określić tylko wtedy, gdy QUEUE zostanie określony.

Z FAN_IN

Nakazuje programowi SQL Server wysyłanie tylko jednego komunikatu na zdarzenie do dowolnej określonej usługi dla wszystkich powiadomień o zdarzeniach, które:

  • Są tworzone na tym samym zdarzeniu.
  • Są tworzone przez tego samego podmiotu zabezpieczeń (co zidentyfikowane przez ten sam identyfikator SID).
  • Określ tę samą usługę i broker_instance_specifier.
  • Podaj wartość WITH FAN_IN.

Na przykład są tworzone trzy powiadomienia o zdarzeniach. Wszystkie powiadomienia o zdarzeniach określają FOR ALTER_TABLE, , WITH FAN_INtę samą TO SERVICE klauzulę i są tworzone przez ten sam identyfikator SID. Po uruchomieniu ALTER TABLE instrukcji komunikaty tworzone przez te trzy powiadomienia o zdarzeniach są scalane w jeden. W związku z tym usługa docelowa odbiera tylko jeden komunikat zdarzenia.

event_type

Nazwa typu zdarzenia, który powoduje wykonanie powiadomienia o zdarzeniu. event_type może być typem zdarzeń Transact-SQL DDL, typem zdarzenia śledzenia SQL lub typem zdarzeń usługi Service Broker. Aby uzyskać listę kwalifikowanych typów zdarzeń Transact-SQL DDL, zobacz Zdarzenia DDL. Typy zdarzeń usługi Service Broker to QUEUE_ACTIVATION i BROKER_QUEUE_DISABLED. Aby uzyskać więcej informacji, zobacz Powiadomienia o zdarzeniach.

event_group

Nazwa wstępnie zdefiniowanej grupy zdarzeń Transact-SQL lub śledzenia SQL. Powiadomienie o zdarzeniu może być uruchamiane po wykonaniu dowolnego zdarzenia należącego do grupy zdarzeń. Aby uzyskać listę grup zdarzeń DDL, Transact-SQL zdarzeń, które obejmują, oraz zakres, w którym można je zdefiniować, zobacz DDL Event Groups (Grupy zdarzeń DDL).

event_group działa również jako makro, gdy CREATE EVENT NOTIFICATION instrukcja zakończy działanie, dodając typy zdarzeń, które obejmuje do sys.events widoku wykazu.

"broker_service"

Określa usługę docelową, która odbiera dane wystąpienia zdarzenia. Program SQL Server otwiera co najmniej jedną konwersację w usłudze docelowej dla powiadomienia o zdarzeniu. Ta usługa musi przestrzegać tego samego typu komunikatu zdarzenia programu SQL Server i kontraktu używanego do wysyłania komunikatu.

Konwersacje pozostają otwarte do momentu porzucenia powiadomienia o zdarzeniu. Niektóre błędy mogą spowodować zamknięcie konwersacji wcześniej. Jawne zakończenie niektórych lub wszystkich konwersacji może uniemożliwić usłudze docelowej odbieranie większej liczby komunikatów.

{ 'broker_instance_specifier' | "current database" }

Określa wystąpienie brokera usług, względem którego broker_service jest rozpoznawana. Wartość dla określonego brokera usług można uzyskać, wysyłając service_broker_guid zapytanie do kolumny sys.databases widoku wykazu. Użyj 'current database' polecenia , aby określić wystąpienie brokera usług w bieżącej bazie danych. 'current database' jest literałem ciągu bez uwzględniania wielkości liter.

Uwaga / Notatka

Ta opcja nie jest dostępna w zawartej bazie danych.

Uwagi

Usługa Service Broker zawiera typ komunikatu i kontrakt przeznaczony specjalnie dla powiadomień o zdarzeniach. W związku z tym usługa inicjująca brokera usług nie musi być tworzona, ponieważ istnieje już taka, która określa następującą nazwę kontraktu: http://schemas.microsoft.com/SQL/Notifications/PostEventNotification

Usługa docelowa, która odbiera powiadomienia o zdarzeniach, musi przestrzegać tego istniejącego kontraktu.

Ważne

Zabezpieczenia okna dialogowego usługi Service Broker należy skonfigurować pod kątem powiadomień o zdarzeniach, które wysyłają komunikaty do brokera usług na serwerze zdalnym. Zabezpieczenia okna dialogowego należy skonfigurować ręcznie zgodnie z pełnym modelem zabezpieczeń. Aby uzyskać więcej informacji, zobacz Konfigurowanie zabezpieczeń okna dialogowego dla powiadomień o zdarzeniach.

Jeśli transakcja zdarzenia, która aktywuje powiadomienie, zostanie wycofana, wysłanie powiadomienia o zdarzeniu zostanie również wycofane. Powiadomienia o zdarzeniach nie są wyzwalane przez akcję zdefiniowaną w wyzwalaczu, gdy transakcja zostanie zatwierdzona lub wycofana wewnątrz wyzwalacza. Ponieważ zdarzenia śledzenia nie są powiązane przez transakcje, powiadomienia o zdarzeniach oparte na zdarzeniach śledzenia są wysyłane niezależnie od tego, czy transakcja, która je aktywuje, jest cofana.

Jeśli konwersacja między serwerem a usługą docelową zostanie przerwana po wyzwoleniu powiadomienia o zdarzeniu, zostanie zgłoszony błąd i powiadomienie o zdarzeniu zostanie porzucone.

Transakcja zdarzenia, która pierwotnie uruchomiła powiadomienie, nie ma wpływu na powodzenie lub niepowodzenie wysyłania powiadomienia o zdarzeniu.

Wszelkie niepowodzenia wysyłania powiadomienia o zdarzeniu są rejestrowane.

Permissions

Aby utworzyć powiadomienie o zdarzeniu o zakresie bazy danych (ON DATABASE), wymaga CREATE DATABASE DDL EVENT NOTIFICATION uprawnień w bieżącej bazie danych.

Aby utworzyć powiadomienie o zdarzeniu w instrukcji DDL, która jest ograniczona do serwera (ON SERVER), wymaga CREATE DDL EVENT NOTIFICATION uprawnień na serwerze.

Aby utworzyć powiadomienie o zdarzeniu śledzenia, wymagane jest CREATE TRACE EVENT NOTIFICATION uprawnienie na serwerze.

Aby utworzyć powiadomienie o zdarzeniu, które jest ograniczone do kolejki, wymaga ALTER uprawnień w kolejce.

Przykłady

Uwaga / Notatka

W przykładach A i B identyfikator GUID w klauzuli TO SERVICE 'NotifyService' (8140a771-3c4b-4479-8ac0-81008ab17984) jest specyficzny dla komputera, na którym został skonfigurowany przykład. W tym przypadku był to GUID bazy AdventureWorks2025.

Aby skopiować i uruchomić te przykłady, należy zastąpić ten identyfikator GUID jednym z komputera i wystąpienia programu SQL Server. Jak wyjaśniono w sekcji Argumenty , możesz uzyskać wartość "broker_instance_specifier", wykonując service_broker_guid zapytanie względem kolumny sys.databases widoku wykazu.

A. Tworzenie powiadomienia o zdarzeniu o zakresie serwera

Poniższy przykład tworzy obiekty wymagane do skonfigurowania usługi docelowej przy użyciu usługi Service Broker. Usługa docelowa odwołuje się do typu komunikatu i kontraktu inicjującego usługi specjalnie dla powiadomień o zdarzeniach. Następnie zostanie utworzone powiadomienie o zdarzeniu w tej usłudze docelowej, która wysyła powiadomienie za każdym razem, gdy Object_Created wystąpi zdarzenie śledzenia w wystąpieniu programu 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. Tworzenie powiadomienia o zdarzeniu o zakresie bazy danych

Poniższy przykład tworzy powiadomienie o zdarzeniu w tej samej usłudze docelowej co w poprzednim przykładzie. Powiadomienie o zdarzeniu uruchamia się po ALTER_TABLE wystąpieniu zdarzenia w przykładowej bazie danych AdventureWorks2025.

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

C. Uzyskiwanie informacji o powiadomieniu o zdarzeniu o zakresie serwera

Poniższy przykład wysyła zapytanie sys.server_event_notifications do widoku wykazu dla metadanych dotyczących powiadomień log_ddl1 o zdarzeniach utworzonych z zakresem serwera.

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

D. Uzyskiwanie informacji o powiadomieniu o zdarzeniu o zakresie bazy danych

Poniższy przykład wysyła zapytanie sys.event_notifications do widoku wykazu dla metadanych dotyczących powiadomień Notify_ALTER_T1 o zdarzeniach utworzonych za pomocą zakresu bazy danych.

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