Bagikan melalui


Menggunakan WQL dengan Penyedia WMI untuk Peristiwa Server

Berlaku untuk:SQL Server

Aplikasi manajemen mengakses peristiwa SQL Server menggunakan Penyedia WMI untuk Peristiwa Server dengan mengeluarkan pernyataan WMI Query Language (WQL). WQL adalah subset sederhana dari bahasa kueri terstruktur (SQL), dengan beberapa ekstensi khusus WMI. Dalam menggunakan WQL, aplikasi mengambil jenis peristiwa terhadap instans SQL Server tertentu, database, atau objek database (satu-satunya objek yang saat ini didukung adalah antrean). Penyedia WMI untuk Peristiwa Server menerjemahkan kueri ke dalam pemberitahuan peristiwa yang dibuat dalam database target untuk pemberitahuan peristiwa yang terlingkup dalam database atau cakupan objek, atau dalam master database untuk pemberitahuan peristiwa yang dilingkup server.

Misalnya, pertimbangkan kueri WQL berikut:

SELECT * FROM DDL_DATABASE_LEVEL_EVENTS WHERE DatabaseName = 'AdventureWorks2022'

Dari kueri ini, Penyedia WMI mencoba menghasilkan pemberitahuan peristiwa ini yang setara di server target:

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

Argumen dalam FROM klausul kueri WQL (DDL_DATABASE_LEVEL_EVENTS) dapat menjadi peristiwa yang valid di mana pemberitahuan peristiwa dapat dibuat. Argumen dalam SELECT klausa dan WHERE dapat menentukan properti peristiwa apa pun yang terkait dengan peristiwa atau peristiwa induknya. Untuk daftar peristiwa dan properti peristiwa yang valid, lihat Pemberitahuan Peristiwa (Mesin Database).

Sintaks WQL berikut didukung secara eksplisit oleh Penyedia WMI untuk Peristiwa Server. Sintaks WQL tambahan mungkin ditentukan, tetapi tidak spesifik untuk penyedia ini dan diurai sebagai gantinya oleh layanan host WMI. Untuk informasi selengkapnya tentang Bahasa Kueri WMI, lihat dokumentasi WQL di Microsoft Developer Network (MSDN).

Sintaks

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

Argumen

event_property [ , ... n ] | *

Properti peristiwa. Contohnya termasuk PostTime, SPID, dan LoginName. Cari setiap peristiwa yang tercantum di WMI Provider untuk kelas dan properti Peristiwa Server untuk menentukan properti mana yang dipegangnya. Misalnya, peristiwa DDL_DATABASE_LEVEL_EVENTS menyimpan DatabaseName properti dan UserName . Ini juga mewarisi SQLInstanceproperti , , LoginNamePostTime, SPID, dan ComputerName dari peristiwa induknya.

  • , ... N

    Menunjukkan bahwa event_property dapat dikueri beberapa kali, dipisahkan oleh koma.

  • *

    Menentukan bahwa semua properti yang terkait dengan peristiwa dikueri.

event_type

Setiap peristiwa di mana pemberitahuan peristiwa dapat dibuat. Untuk daftar peristiwa yang tersedia, lihat Penyedia WMI untuk kelas dan properti Peristiwa Server. nama jenis peristiwa sesuai dengan event_group event_type | yang sama yang dapat ditentukan saat Anda membuat pemberitahuan peristiwa secara manual dengan menggunakan .CREATE EVENT NOTIFICATION Contoh jenis peristiwa termasuk CREATE_TABLE, , LOCK_DEADLOCKDDL_USER_EVENTS, dan TRC_DATABASE.

Catatan

Prosedur tersimpan sistem tertentu yang melakukan operasi seperti DDL juga dapat mengaktifkan pemberitahuan peristiwa. Uji pemberitahuan peristiwa Anda untuk menentukan responsnya terhadap prosedur tersimpan sistem yang dijalankan. Misalnya, CREATE TYPE pernyataan dan sp_addtype prosedur tersimpan keduanya akan mengaktifkan pemberitahuan peristiwa yang dibuat pada CREATE_TYPE peristiwa. Namun, prosedur tersimpan sp_rename tidak mengaktifkan pemberitahuan peristiwa apa pun. Untuk informasi selengkapnya, lihat Peristiwa DDL.

where_condition

WHERE Predikat kueri klausa, terdiri dari nama event_property dan operator logis dan perbandingan. where_condition menentukan cakupan di mana pemberitahuan peristiwa terkait terdaftar dalam database target. Ini juga dapat bertindak sebagai filter untuk menargetkan skema atau objek tertentu untuk mengkueri event_type. Untuk informasi selengkapnya, lihat bagian Keterangan .

Hanya operan yang = dapat digunakan bersama dengan DatabaseName, , SchemaNamedan ObjectName. Ekspresi lain tidak dapat digunakan dengan properti peristiwa ini.

Keterangan

Where_condition sintaks Penyedia WMI untuk Peristiwa Server menentukan hal berikut:

  • Cakupan tempat penyedia mencoba mengambil event_type yang ditentukan: tingkat server, tingkat database, atau tingkat objek (satu-satunya objek yang saat ini didukung adalah antrean). Pada akhirnya, cakupan ini menentukan jenis pemberitahuan peristiwa yang dibuat dalam database target. Proses ini disebut pendaftaran pemberitahuan peristiwa.

  • Database, skema, dan objek, jika sesuai, tempat mendaftar.

Penyedia WMI untuk Peristiwa Server menggunakan algoritma bottom-up dan first-fit untuk menghasilkan cakupan sesempit mungkin untuk yang mendasar EVENT NOTIFICATION. Algoritma mencoba meminimalkan aktivitas internal pada server dan lalu lintas jaringan antara instans SQL Server dan proses host WMI. Penyedia memeriksa event_type yang ditentukan dalam FROM klausul dan kondisi dalam WHERE klausul, dan mencoba mendaftarkan yang mendasarinya EVENT NOTIFICATION dengan cakupan sesempit mungkin. Jika penyedia tidak dapat mendaftar pada cakupan tersempit, penyedia mencoba mendaftar pada cakupan yang berturut-turut lebih tinggi sampai pendaftaran akhirnya berhasil. Jika mencapai cakupan tertinggi tingkat server) dan gagal, ia mengembalikan kesalahan kepada konsumen.

Misalnya, jika DatabaseName='AdventureWorks2022' ditentukan dalam WHERE klausa, penyedia mencoba mendaftarkan pemberitahuan peristiwa dalam AdventureWorks2022 database. AdventureWorks2022 Jika database ada dan klien panggilan memiliki izin yang diperlukan untuk membuat pemberitahuan peristiwa di AdventureWorks2022, pendaftaran berhasil. Jika tidak, upaya dilakukan untuk mendaftarkan pemberitahuan peristiwa di tingkat server. Pendaftaran berhasil jika klien WMI memiliki izin yang diperlukan. Namun, dalam skenario ini, peristiwa tidak dikembalikan ke klien hingga AdventureWorks2022 database dibuat.

where_condition juga dapat bertindak sebagai filter untuk membatasi kueri ke database, skema, atau objek tertentu. Misalnya, pertimbangkan kueri WQL berikut:

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

Bergantung pada hasil proses pendaftaran, kueri WQL ini mungkin terdaftar baik di tingkat database atau server. Namun, bahkan jika terdaftar di tingkat server, penyedia pada akhirnya memfilter peristiwa apa pun ALTER_TABLE yang tidak berlaku untuk Sales.SalesOrderDetail tabel. Dengan kata lain, penyedia hanya mengembalikan properti ALTER_TABLE peristiwa yang terjadi pada tabel tertentu.

Jika ekspresi gabungan seperti DatabaseName='AW1' OR DatabaseName='AW2' ditentukan, upaya dilakukan untuk mendaftarkan satu pemberitahuan peristiwa di cakupan server alih-alih dua pemberitahuan peristiwa terpisah. Pendaftaran berhasil jika klien panggilan memiliki izin.

Jika SchemaName='X' AND ObjectType='Y' AND ObjectName='Z' semua ditentukan dalam WHERE klausul, upaya dilakukan untuk mendaftarkan pemberitahuan peristiwa langsung pada objek Z dalam skema X. Pendaftaran berhasil jika klien memiliki izin. Saat ini, peristiwa tingkat objek hanya didukung pada antrean, dan hanya untuk QUEUE_ACTIVATIONevent_type.

Tidak semua peristiwa dapat dikueri pada cakupan tertentu. Misalnya, kueri WQL pada peristiwa pelacakan seperti Lock_Deadlock, atau grup peristiwa pelacakan seperti TRC_LOCKS, hanya dapat didaftarkan di tingkat server. Demikian pula, CREATE_ENDPOINT peristiwa dan DDL_ENDPOINT_EVENTS grup peristiwa juga hanya dapat didaftarkan di tingkat server. Untuk informasi selengkapnya tentang cakupan yang sesuai untuk mendaftarkan peristiwa, lihat Merancang Pemberitahuan Peristiwa. Upaya untuk mendaftarkan kueri WQL yang event_type nya hanya dapat didaftarkan di tingkat server selalu dilakukan di tingkat server. Pendaftaran berhasil jika klien WMI memiliki izin. Jika tidak, kesalahan dikembalikan ke klien. Namun, dalam beberapa kasus, Anda masih dapat menggunakan WHERE klausul sebagai filter untuk peristiwa tingkat server berdasarkan properti yang sesuai dengan peristiwa. Misalnya, banyak peristiwa jejak memiliki DatabaseName properti yang dapat digunakan dalam WHERE klausul sebagai filter.

Pemberitahuan peristiwa cakupan server dibuat dalam master database dan dapat dikueri untuk metadata dengan menggunakan tampilan katalog sys.server_event_notifications .

Pemberitahuan peristiwa cakupan database atau cakupan objek dibuat dalam database yang ditentukan dan dapat dikueri untuk metadata dengan menggunakan tampilan katalog sys.event_notifications . (Anda harus mengawali tampilan katalog dengan nama database yang sesuai.)

Contoh

Sampel kode Transact-SQL dalam artikel ini menggunakan AdventureWorks2022 database sampel atau AdventureWorksDW2022 , yang dapat Anda unduh dari halaman beranda Sampel Microsoft SQL Server dan Proyek Komunitas.

J. Kueri untuk peristiwa di cakupan server

Kueri WQL berikut mengambil semua properti peristiwa untuk setiap SERVER_MEMORY_CHANGE peristiwa pelacakan yang terjadi pada instans SQL Server.

SELECT * FROM SERVER_MEMORY_CHANGE

B. Kueri untuk peristiwa di cakupan database

Kueri WQL berikut mengambil properti peristiwa tertentu untuk setiap peristiwa yang terjadi dalam AdventureWorks2022 database dan ada di DDL_DATABASE_LEVEL_EVENTS bawah grup peristiwa.

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

C. Kueri untuk peristiwa di lingkup database, pemfilteran menurut skema dan objek

Kueri berikut mengambil semua properti peristiwa untuk setiap ALTER_TABLE peristiwa yang terjadi pada tabel Sales.SalesOrderDetail.

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