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
Aplikace pro správu přistupují k událostem SQL Server pomocí poskytovatele WMI pro serverové události vydáváním příkazů WMI Query Language (WQL). WQL je zjednodušená podmnožina strukturovaného dotazovacího jazyka (SQL) s některými rozšířeními specifickými pro WMI. Při použití WQL aplikace získává typ události z konkrétní instance SQL Serveru, databáze nebo databázového objektu (jediným aktuálně podporovaným objektem je fronta). Poskytovatel WMI pro serverové události převádí dotaz do oznámení o události, které je vytvořeno v cílové databázi pro oznámení o událostech zaměřených na databázi nebo objektově zaměřené, nebo v databázi master pro oznámení o událostech zaměřených na server.
Například uvažujme následující dotaz WQL:
SELECT * FROM DDL_DATABASE_LEVEL_EVENTS WHERE DatabaseName = 'AdventureWorks2022'
Z tohoto dotazu se poskytovatel WMI snaží vytvořit ekvivalent tohoto oznámení o události na cílovém serveru:
USE AdventureWorks2022;
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 v klauzuli FROM dotazu WQL (DDL_DATABASE_LEVEL_EVENTS) může být jakákoli platná událost, na které lze vytvořit oznámení o události. Argumenty v klauzulích SELECT a WHERE mohou specifikovat jakoukoli vlastnost události spojenou s událostí nebo její nadřazovací událostí. Pro seznam platných událostí a vlastností událostí viz Event Notifications (Database Engine).
Následující syntax WQL je explicitně podporována poskytovatelem WMI pro serverové události. Další syntaxe WQL může být specifikována, ale není specifická pro tohoto poskytovatele a je parsována hostskou službou WMI. Pro více informací o dotazovacím jazyce WMI viz dokumentace WQL na Microsoft Developer Network (MSDN).
Syntaxe
SELECT { event_property [ , ...n ] | * }
FROM event_type
WHERE where_condition
[ ; ]
Arguments
event_property [ , ... n ] | *
Vlastnost události. Mezi příklady patří PostTime, SPIDa LoginName. Vyhledejte každou událost uvedenou v WMI Provider pro třídy a vlastnosti Server Events , abyste zjistili, které vlastnosti má. Například událost DDL_DATABASE_LEVEL_EVENTS obsahuje DatabaseName vlastnosti a UserName . Také dědí SQLInstance, LoginName, PostTime, SPID, a ComputerName vlastnosti ze svých rodičovských událostí.
, ... n
Označuje, že event_property lze dotazovat vícekrát, odděleně čárkami.
*Specifikuje, že všechny vlastnosti spojené s událostí jsou dotazovány.
event_type
Jakákoli událost, proti které lze vytvořit oznámení o události. Pro seznam dostupných událostí viz WMI Provider pro třídy a vlastnosti Server Events. Názvy typů událostí odpovídají stejným event_type | event_group, které lze zadat při ručním vytváření oznámení o události pomocí CREATE EVENT NOTIFICATION. Příklady typů událostí zahrnují CREATE_TABLE, LOCK_DEADLOCK, DDL_USER_EVENTS, a TRC_DATABASE.
Poznámka:
Některé systémové uložené procedury, které provádějí operace podobné DDL, mohou také spouštět oznámení o událostech. Otestujte oznámení o událostech, abyste zjistili, jak reagují na systémové uložené procedury, které se spouštějí. Například CREATE TYPE příkaz i uložená procedura spustí sp_addtype oznámení o události, které se na událost vytvoří CREATE_TYPE . Uložená procedura sp_rename však nespouští žádná oznámení o událostech. Pro více informací viz DDL Events.
where_condition
WHERE Predikát dotazu na klauzuli, složený z event_property jmen a logických a srovnávacích operátorů.
where_condition určuje rozsah, ve kterém je odpovídající oznámení o události registrováno v cílové databázi. Může také fungovat jako filtr, který cílí na konkrétní schéma nebo objekt, ze kterého se dotazuje event_type. Pro více informací viz sekce Poznámky .
Pouze = operand lze použít společně s DatabaseName, SchemaName, a ObjectName. Jiné výrazy nelze použít s těmito vlastnostmi událostí.
Poznámky
where_condition syntaxe WMI poskytovatele serverových událostí určuje následující:
Rozsah, kterým se poskytovatel snaží získat specifikované event_type: úroveň serveru, databáze nebo úroveň objektu (jediný objekt v současnosti podporovaný je fronta). Nakonec tento rozsah určuje typ oznámení o události vytvořeném v cílové databázi. Tento proces se nazýval registrace událostí.
Databáze, schéma a objekt, kde je to vhodné, pro registraci.
Poskytovatel WMI pro serverové události používá algoritmus zdola nahoru, první přizpůsobení, aby vytvořil co nejužší rozsah pro základní EVENT NOTIFICATION. Algoritmus se snaží minimalizovat interní aktivitu na serveru a síťový provoz mezi instancí SQL Serveru a procesem hostitele WMI. Poskytovatel zkoumá event_type uvedené v klauzuli FROM a podmínky v ní WHERE a snaží se zaregistrovat podklad EVENT NOTIFICATION s co nejužším rozsahem. Pokud poskytovatel nemůže registrovat v nejužším rozsahu, snaží se registrovat postupně ve vyšších rozsahech, dokud registrace nakonec neuspěje. Pokud dosáhne nejvyššího rozsahu na úrovni serveru) a selže, vrátí spotřebiteli chybu.
Například pokud DatabaseName='AdventureWorks2022' je v klauzuli WHERE uvedeno, poskytovatel se pokusí zaregistrovat oznámení o události v databázi AdventureWorks2025 . Pokud databáze AdventureWorks2025 existuje a volající klient má potřebná oprávnění k vytvoření oznámení o události v AdventureWorks2025, registrace je úspěšná. Jinak se pokusí zaregistrovat oznámení o události na úrovni serveru. Registrace je úspěšná, pokud má klient WMI požadovaná oprávnění. V tomto scénáři však nejsou události vráceny klientovi, dokud není databáze vytvořena AdventureWorks2025 .
where_condition může také sloužit jako filtr, který navíc omezuje dotaz na konkrétní databázi, schéma nebo objekt. Například uvažujme následující dotaz WQL:
SELECT * FROM ALTER_TABLE
WHERE DatabaseName = 'AdventureWorks2022' AND SchemaName = 'Sales'
AND ObjectType='Table' AND ObjectName = 'SalesOrderDetail'
V závislosti na výsledku registračního procesu může být tento dotaz WQL registrován buď na úrovni databáze, nebo serveru. Nicméně i když je registrováno na úrovni serveru, poskytovatel nakonec filtruje události ALTER_TABLE , které se na tabuli Sales.SalesOrderDetail nevztahují. Jinými slovy, poskytovatel vrací pouze vlastnosti událostí ALTER_TABLE , které se odehrávají v dané konkrétní tabulce.
Pokud je specifikován složený výraz, je DatabaseName='AW1' OR DatabaseName='AW2' v rozsahu serveru zaznamenáno jedno oznámení o události místo dvou samostatných oznámení o událostech. Registrace je úspěšná, pokud má volající klient oprávnění.
Pokud SchemaName='X' AND ObjectType='Y' AND ObjectName='Z' jsou všechny uvedeny v klauzuli WHERE , je učiněn pokus o registraci oznámení o události přímo na objektu Z ve schématu X. Registrace je úspěšná, pokud má klient oprávnění. V současnosti jsou objektové události podporovány pouze ve frontách a pouze pro QUEUE_ACTIVATIONevent_type.
Ne všechny události lze dotazovat v jakémkoli konkrétním rozsahu. Například dotaz WQL na událost stopy, jako je Lock_Deadlock, nebo skupinu událostí stopy jako TRC_LOCKS, lze registrovat pouze na úrovni serveru. Podobně CREATE_ENDPOINT lze událost a DDL_ENDPOINT_EVENTS skupinu událostí registrovat pouze na úrovni serveru. Pro více informací o vhodném rozsahu registrace událostí viz Návrh oznámení o událostech. Pokus o registraci dotazu WQL, jehož event_type lze registrovat pouze na úrovni serveru, se vždy provádí na úrovni serveru. Registrace je úspěšná, pokud má klient WMI oprávnění. Jinak je klient vrácen jako chyba. V některých případech však můžete klauzuli WHERE stále použít jako filtr pro události na úrovni serveru na základě vlastností, které dané události odpovídají. Například mnoho stopových událostí má vlastnost DatabaseName , kterou lze v dané klauzuli WHERE použít jako filtr.
Serverově omezená oznámení o událostech jsou vytvářena v databázi master a lze je dotazovat na metadata pomocí zobrazení sys.server_event_notifications katalogu.
Oznámení o událostech zaměřených na databázi nebo objektově omezená jsou vytvářena ve specifikované databázi a lze je dotazovat na metadata pomocí zobrazení sys.event_notifications katalogu. (Musíte předepsat katalogový pohled odpovídajícím názvem databáze.)
Examples
Ukázky kódu v tomto článku používají ukázkovou databázi AdventureWorks2025 nebo AdventureWorksDW2025, kterou si můžete stáhnout z domovské stránky Microsoft SQL Serveru pro ukázky a komunitní projekty .
A. Dotaz na události v rozsahu serveru
Následující dotaz WQL získá všechny vlastnosti události pro jakoukoli SERVER_MEMORY_CHANGE stopovací událost, která se odehraje na instanci SQL Serveru.
SELECT * FROM SERVER_MEMORY_CHANGE
B. Dotaz na události v rozsahu databáze
Následující dotaz WQL získává specifické vlastnosti událostí pro jakoukoli událost, která se vyskytuje v databázi AdventureWorks2025 a existuje pod touto skupinou DDL_DATABASE_LEVEL_EVENTS .
SELECT SPID, SQLInstance, DatabaseName FROM DDL_DATABASE_LEVEL_EVENTS
WHERE DatabaseName = 'AdventureWorks2022'
C. Dotaz na události v databázovém rozsahu, filtrování podle schématu a objektu
Následující dotaz získá všechny vlastnosti událostí pro jakoukoli ALTER_TABLE událost, která se vyskytuje v tabulce Sales.SalesOrderDetail.
SELECT * FROM ALTER_TABLE
WHERE DatabaseName = 'AdventureWorks2022' AND SchemaName = 'Sales'
AND ObjectType='Table' AND ObjectName = 'SalesOrderDetail'