Udostępnij za pośrednictwem


Przy użyciu WQL w dostawca WMI dla zdarzenia serwera

Dostęp do aplikacji SQL Server zdarzenia przy użyciu dostawca WMI dla zdarzenia serwera wykonując instrukcje języka WQL (język kwerend usługi WMI). WQL jest podzbiorem uproszczony język structured query language (SQL), niektóre rozszerzenia specyficzne dla usługi WMI.Korzystając z WQL, aplikacja pobiera typ zdarzenie dla określonego wystąpienie SQL Server, bazy danych lub obiektu bazy danych (tylko aktualnie obsługiwany jest kolejki). Dostawca WMI dla zdarzenie Server przetwarza kwerendę na powiadomienie o zdarzeniu utworzone w miejsce docelowe bazie danych dla powiadomień o zdarzeniach o zakresie bazy danych lub obiektu o zakresie lub w wzorzec bazy danych dla powiadomień o zdarzeniach o zakresie serwera.

Na przykład należy wziąć pod uwagę następujące kwerendy WQL:

SELECT * FROM DDL_DATABASE_LEVEL_EVENTS WHERE DatabaseName = 'AdventureWorks'

Z tej kwerendy, dostawca WMI podejmie próbę uzyskania odpowiednik tego zdarzenie powiadomienie na serwerze miejsce docelowem:

USE AdventureWorks ;
GO

CREATE EVENT NOTIFICATION SQLWEP_76CF38C1_18BB_42DD_A7DC_C8820155B0E9
    ON DATABASE
    WITH FAN_IN
    FOR DDL_DATABASE_LEVEL_EVENTS
    TO SERVICE 
        'SQL/Notifications/ProcessWMIEventProviderNotification/v1.0',
        'A7E5521A-1CA6-4741-865D-826F804E5135';
GO

Argument w FROM Klauzula (kwerendy WQLDDL_DATABASE_LEVEL_EVENTS) mogą być dowolne prawidłowe zdarzenie od których można tworzyć powiadomienie o zdarzeniu. Argumenty SELECT i WHERE klauzule można określić wszelkie właściwość zdarzenie związane z zdarzenie lub jej zdarzenie nadrzędnej. Aby uzyskać listę prawidłowych zdarzeń i właściwości zdarzeń Zobacz Dostawca WMI dla zdarzenia serwera klasy i właściwości.

Następującej składni WQL jest obsługiwana przez dostawca WMI jawnie dla zdarzenia serwera.Można określić dodatkowe składni WQL, ale nie jest specyficzna dla tego dostawca i jest zamiast tego analizowany przez hosta usługa WMI.Aby uzyskać więcej informacji na temat języka kwerend WMI Zobacz WQL można znaleźć w dokumentacji na Microsoft Developer Network (MSDN).

SELECT { event_property [ ,...n ] | * }
FROM event_type 
WHERE where_condition 

Argumenty

  • event_property
    Jest to właściwość zdarzenie.Przykłady PostTime, SPID, a LoginName. Każde zdarzenie na liście wyszukiwania Dostawca WMI dla zdarzenia serwera klasy i właściwości , aby określić właściwości, które posiada.Na przykład, zdarzenie DDL_DATABASE_LEVEL_EVENTS przechowuje DatabaseName i UserName właściwości. Dziedziczy ona również SQLInstance, LoginName, PostTime, SPID, a ComputerName właściwości z jego zdarzeń obiektu nadrzędnego.

  • ,...n
    Wskazuje, że event_property może być kierowane kwerendy wiele razy, oddzielając je średnikami.

  • *
    Określa, że wszystkie właściwości skojarzone z zdarzenie są badane.

  • event_type
    Czy wszystkie zdarzenie, które mogą być tworzone powiadomienie o zdarzeniu.Aby wyświetlić listę dostępnych zdarzeń Zobacz Dostawca WMI dla zdarzenia serwera klasy i właściwości. Należy zauważyć, że event type odnoszą się do tej samej nazwy event_type | event_group które można określić podczas ręcznego tworzenia powiadomienie o zdarzeniu przy użyciu CREATE zgłoszenia zdarzenie. Przykłady event type Dołącz CREATE_TABLE LOCK_DEADLOCK, DDL_USER_EVENTS i TRC_DATABASE.

    Uwaga

    Niektóre systemu procedur przechowywanych, które wykonują operacje DDL podobne może również wystrzelić zdarzenie powiadomienia.Test sieci zdarzenie powiadomienia do ustalenia ich reakcji systemu przechowywane procedury, które są uruchamiane.Na przykład, instrukcja CREATE typ i sp_addtype procedura przechowywana będzie zarówno ognia powiadomienie o zdarzeniu utworzonego zdarzenie CREATE_TYPE.Jednak sp_rename przechowywane procedury nie uruchomienie dowolnego zdarzenie powiadomienia.Aby uzyskać więcej informacji zobaczDDL Events.

  • where_condition
    Czy predykatu kwerendy klauzulę WHERE składa się z event_property nazwy i logicznej i operatory porównania. The where_condition determines the zakres in which the corresponding powiadomienie o zdarzeniu is registered in the miejsce docelowe database. Może także działać jako filtr do określonego schematu lub obiektu, z którego do kwerendy event_type. Aby uzyskać więcej informacji zobacz sekcję Spostrzeżenia w dalszej części tego tematu.

    Tylko = argument może być używany wraz z DatabaseName, SchemaName, a ObjectName. Inne wyrażenia nie może być używany z tych właściwości zdarzenie.

Remarks

The where_condition of the WMI dostawca for Server Events syntax determines the following:

  • Za pomocą których dostawca próbuje pobrać określonego zakres event_type: poziom serwera, poziom bazy danych lub poziomu obiektu (tylko aktualnie obsługiwany jest kolejki). Ostatecznie, ten zakres Określa rodzaj powiadomienie o zdarzeniu utworzone w miejsce docelowe bazie danych.Ten proces nazywany powiadomienie o zdarzeniu rejestracji.

  • Baza danych, schematu i obiektu, gdzie jest to właściwe, na którym należy zarejestrować.

Dostawca WMI dla zdarzenia Server używa algorytmu dół góra, pierwsze dopasowanie do wyprodukowania najwęższy zakres możliwych do podstawowej powiadomienie o zdarzeniu.Algorytm próbuje zminimalizować działanie wewnętrzne na serwerze i ruch sieciowy między wystąpienie SQL Server a proces hosta usługi WMI. Sprawdza, czy dostawca event_type określone w klauzula FROM i warunków w klauzula WHERE i usiłuje zarejestrować podstawowej powiadomienie o zdarzeniu z najwęższy zakres możliwych. Jeśli dostawca nie może zarejestrować się w najwęższy zakres, będzie próbował zarejestrować się w kolejno wyższe zakresów do czasu na koniec rejestracji powiedzie się.Jeżeli zostanie osiągnięty zakres najwyższego poziom serwera) i kończy się niepowodzeniem, zwracany jest błąd do konsumenta.

Na przykład jeśli NazwaBazyDanych =**"AdventureWorks"**jest określony w klauzula WHERE, dostawca usiłuje zarejestrować powiadomienie o zdarzeniu w AdventureWorks Baza danych. Jeśli AdventureWorks Baza danych istnieje i czy klient wywołujący ma wymagane uprawnienia do tworzenia powiadomienie o zdarzeniu w AdventureWorks, rejestracji zakończyło się pomyślnie. W przeciwnym razie jest podjęta próba zarejestrowania powiadamianie o zdarzeniach poziom serwera.Rejestracja się powiedzie, jeśli klient WMI ma wymagane uprawnienia.Jednak w tym scenariuszu zdarzenia nie są zwracane do klient, dopóki AdventureWorks Baza danych została utworzona.

The where_condition can also act as a filter to additionally limit the query to a specific database, schema, or object.Na przykład należy wziąć pod uwagę następujące kwerendy WQL:

SELECT * FROM ALTER_TABLE 
WHERE DatabaseName = 'AdventureWorks' AND SchemaName = 'Sales' 
    AND ObjectType='Table' AND ObjectName = 'SalesOrderDetail'

W zależności od wyniku procesu rejestracji tej kwerendy WQL może być zarejestrowane poziom bazy danych lub serwera.Jednak nawet wtedy, gdy jest on zarejestrowany poziom serwera, dostawca ostatecznie filtruje żadnego ALTER_TABLE zdarzenia, które nie mają zastosowania do AdventureWorks.Sales.SalesOrderDetail Tabela. Innymi słowy, dostawca zwraca tylko właściwości ALTER_TABLE zdarzenia występujące w określonej tabela.

Jeśli złożone wyrażenie, takie jak DatabaseName='AW1' LUB DatabaseName='AW2' jest określony, próby rejestracji pojedynczej powiadomienie o zdarzeniu w zakresie serwera zamiast dwóch oddzielnych powiadomienie o zdarzeniu s. Rejestracja się powiedzie, jeśli klient wywołujący ma uprawnienia.

Jeśli SchemaName='X' AND ObjectType='Y' AND ObjectName='Z' zostały określone w WHERE Klauzula, podjęta próba zarejestrować zdarzenie powiadomienie bezpośrednio na obiekcie Z w schemacie X. Rejestracja się powiedzie, jeśli klient ma uprawnienia.Należy zauważyć, że obecnie zdarzeń poziom obiektu są obsługiwane tylko dla kolejek i tylko w przypadku QUEUE_ACTIVATION event_type.

Należy zauważyć, że nie wszystkie zdarzenia mogą być kierowane kwerendy w dowolnym z określonego zakres.Na przykład kwerendy WQL zdarzenie śledzenia, takiego jak Lock_Deadlock lub grupy śledzenia zdarzeń takich jak TRC_LOCKS, mogą być rejestrowane tylko poziom serwera.Podobnie, zdarzenie CREATE_ENDPOINT DDL_ENDPOINT_EVENTS grupy zdarzeń można również rejestrować i tylko poziom serwera.Aby uzyskać więcej informacji na temat odpowiedni zakres rejestrowania zdarzeń Zobacz Designing Event Notifications. Próba zarejestrowania WQL kwerendy, których event_type tylko może zostać zarejestrowana na serwerze poziom jest zawsze wykonywane poziom serwera. Rejestracja się powiedzie, jeśli klient WMI ma uprawnienia.W przeciwnym razie do klient zwracany jest błąd.W niektórych przypadkach jednak można nadal używać klauzula WHERE jako filtr dla zdarzeń poziom serwera na podstawie właściwości odpowiadające zdarzenie.Na przykład mieć wielu zdarzeń śledzenia DatabaseName właściwość, które mogą być używane jako filtr w klauzula WHERE.

Powiadomień o zdarzeniach serwera o zakresie są tworzone w wzorzec bazy danych i może być kierowane kwerendy metadane za pomocą sys.server_event_notifications Służy do wyświetlania katalogu.

Powiadomienia o zakresie bazy danych lub obiektu o zakresie zdarzenie są tworzone w określonej bazie danych i może być kierowane kwerendy metadane za pomocą sys.event_notifications Służy do wyświetlania katalogu. (Należy poprzedzać prefiksem w widoku wykazu z odpowiadającą jej nazwą bazy danych.)

Przykłady

A.Podczas badania zdarzeń na serwerze zakres

Następujące kwerendy WQL pobiera wszystkie właściwości zdarzenia dla każdego SERVER_MEMORY_CHANGE zdarzenie śledzenia w wystąpieniu programu SQL Server.

SELECT * FROM SERVER_MEMORY_CHANGE

B.Podczas badania zdarzenia w bazie danych zakres

Następujące kwerendy WQL pobiera właściwości określonego zdarzenie dla dowolnego zdarzenie, występujący w AdventureWorks bazy danych i istnieje w obszarze DDL_DATABASE_LEVEL_EVENTS Grupa zdarzenie.

SELECT SPID, SQLInstance, DatabaseName FROM DDL_DATABASE_LEVEL_EVENTS 
WHERE DatabaseName = 'AdventureWorks' 

C.Podczas badania zdarzeń w zakresie bazy danych, filtrowanie według schematu i obiektów

Następująca kwerenda pobiera wszystkie właściwości zdarzenia dla każdego ALTER_TABLE zdarzenie w tabela AdventureWorks.Sales.SalesOrderDetail.

SELECT * FROM ALTER_TABLE 
WHERE DatabaseName = 'AdventureWorks' AND SchemaName = 'Sales' 
    AND ObjectType='Table' AND ObjectName = 'SalesOrderDetail'