Bagikan melalui


Bekerja dengan Penyedia WMI untuk Peristiwa Server

Berlaku untuk:SQL Server

Artikel ini menyediakan panduan yang harus Anda pertimbangkan sebelum anda memprogram menggunakan Penyedia WMI untuk Peristiwa Server.

Aktifkan Service Broker

Penyedia WMI untuk Peristiwa Server berfungsi dengan menerjemahkan kueri WQL untuk peristiwa ke dalam pemberitahuan peristiwa dalam database yang Anda targetkan. Pemahaman tentang cara kerja pemberitahuan peristiwa dapat berguna bagi Anda saat pemrograman terhadap penyedia. Untuk informasi selengkapnya, lihat Konsep Penyedia WMI untuk Peristiwa Server.

Secara khusus, karena pemberitahuan peristiwa yang dibuat oleh Penyedia WMI menggunakan SQL Server untuk mengirim pesan tentang peristiwa server, layanan ini harus diaktifkan di mana pun peristiwa dihasilkan. Jika program Anda mengkueri peristiwa pada instans server, Service Broker dalam msdb instans tersebut harus diaktifkan, karena itu adalah lokasi layanan Service Broker target (bernama SQL/Notifications/ProcessWMIEventProviderNotification/v1.0) yang dibuat oleh penyedia. Jika program Anda mengkueri peristiwa dalam database atau pada objek database tertentu, Service Broker dalam database target tersebut harus diaktifkan. Jika Service Broker yang sesuai tidak diaktifkan setelah aplikasi Anda disebarkan, peristiwa apa pun yang dihasilkan oleh pemberitahuan peristiwa yang mendasar dikirim ke antrean layanan yang digunakan oleh pemberitahuan peristiwa, tetapi tidak dikembalikan ke aplikasi manajemen WMI Anda hingga Service Broker diaktifkan.

Kueri berikut menentukan broker layanan mana yang diaktifkan pada instans server, dan GUID instans broker:

SELECT name, is_broker_enabled, service_broker_guid FROM sys.databases;

GUID msdb broker layanan adalah minat khusus karena itu adalah lokasi layanan target penyedia.

Untuk mengaktifkan Service Broker dalam database, gunakan opsi set ENABLE_BROKER dari pernyataan ALTER DATABASE .

Tentukan string koneksi

Aplikasi mengarahkan Penyedia WMI untuk Peristiwa Server ke instans SQL Server dengan menyambungkan ke namespace layanan WMI yang ditentukan oleh penyedia. Layanan Windows WMI memetakan namespace layanan ini ke DLL penyedia, Sqlwep.dll, dan memuatnya ke dalam memori. Setiap instans SQL Server memiliki namespace layanan WMI sendiri, yang defaultnya adalah: \\.\root\Microsoft\SqlServer\ServerEvents\instance_name. instance_name default ke MSSQLSERVER dalam penginstalan default SQL Server.

Izin dan autentikasi server

Untuk mengakses Penyedia WMI untuk Peristiwa Server, klien tempat aplikasi manajemen WMI berasal harus sesuai dengan login atau grup yang diautentikasi Windows dalam instans SQL Server yang ditentukan dalam string koneksi aplikasi aplikasi.

Izin dan cakupan pemberitahuan peristiwa

Penyedia WMI untuk Peristiwa Server menerjemahkan kueri WQL ke dalam pemberitahuan peristiwa dalam database target. Karena itu, aplikasi panggilan tidak boleh hanya memiliki izin minimum yang diperlukan untuk mengakses penyedia, tetapi juga harus memiliki izin yang benar dalam database untuk membuat pemberitahuan peristiwa yang diperlukan. Berikut ini adalah izinnya:

  • Untuk membuat pemberitahuan peristiwa yang dilingkupkan ke database, minimal, izin CREATE DATABASE DDL EVENT NOTIFICATION di database saat ini diperlukan.

  • Untuk membuat pemberitahuan peristiwa pada pernyataan DDL yang dilingkup ke server, minimal, izin CREATE DDL EVENT NOTIFICATION di server diperlukan.

  • Untuk membuat pemberitahuan peristiwa pada peristiwa pelacakan, minimal, izin CREATE TRACE EVENT NOTIFICATION di server diperlukan.

  • Untuk membuat pemberitahuan peristiwa yang dilingkup ke antrean, minimal, diperlukan izin ALTER pada antrean.

Untuk informasi tentang bagaimana kueri WQL dilingkup, lihat Menggunakan WQL dengan Penyedia WMI untuk Peristiwa Server.

Untuk mengilustrasikan cakupan, pertimbangkan aplikasi Penyedia WMI yang menyertakan kueri WQL berikut:

SELECT * FROM ALTER_TABLE
WHERE DatabaseName = "AdventureWorks2022"
    AND SchemaName = "Person"
    AND ObjectName = "Person"
    AND ObjectType = "TABLE";

Penyedia WMI menerjemahkan kueri ini ke dalam pemberitahuan peristiwa yang dibuat dalam AdventureWorks2022 database. Ini berarti bahwa pemanggil harus memiliki izin yang diperlukan untuk membuat pemberitahuan peristiwa seperti itu, khususnya izin CREATE DATABASE DDL EVENT NOTIFICATION dalam AdventureWorks2022 database.

Jika kueri WQL menentukan pemberitahuan peristiwa yang terlingkup di tingkat server, misalnya dengan mengeluarkan kueri SELECT * FROM ALTER_TABLE, aplikasi panggilan harus memiliki izin CREATE DDL EVENT NOTIFICATION tingkat server. Pemberitahuan peristiwa yang dilingkup server disimpan dalam master database. Anda dapat menggunakan tampilan katalog sys.server_event_notifications untuk melihat metadatanya.

Catatan

Cakupan pemberitahuan peristiwa yang dibuat oleh Penyedia WMI (server, database, atau objek) pada akhirnya tergantung pada hasil proses verifikasi izin yang digunakan oleh penyedia WMI. Ini dipengaruhi oleh kumpulan izin pengguna yang memanggil penyedia dan pada verifikasi database yang sedang dikueri.

Dalam contoh sebelumnya, penyedia pertama-tama mencoba membuat pemberitahuan peristiwa yang dilingkup ke database (ON DATABASE). Jika penyedia memverifikasi bahwa database ada dan bahwa pemanggil memiliki izin yang diperlukan untuk membuat pemberitahuan peristiwa di dalamnya, pendaftaran berhasil. Jika tidak berhasil, penyedia mencoba membuat pemberitahuan peristiwa di server (ON SERVER). Dengan asumsi bahwa upaya ini berhasil, semua ALTER_TABLE peristiwa yang terjadi di server dikirim dari proses SQL Server ke proses Layanan WMI. Namun, penyedia memfilter peristiwa apa pun yang tidak berlaku untuk AdventureWorks2022 database. Meskipun proses ini berpotensi meningkatkan jumlah lalu lintas jaringan yang diperlukan untuk cakupan peristiwa, proses ini juga memungkinkan Anda dengan fleksibilitas untuk mendaftarkan kueri WQL pada database sebelum dibuat, lalu menerima data peristiwa setelah database dibuat dan aktivitas DDL dimulai di atasnya.

Izin dan verifikasi pesan

Penyedia WMI tidak mengirim pesan untuk pemberitahuan peristiwa jika kedua kondisi berikut ini benar:

  • Pengguna yang membuat pemberitahuan peristiwa melalui Penyedia WMI tidak lagi ada di database, atau tidak lagi memiliki izin yang diperlukan untuk membuat pemberitahuan peristiwa serupa.

  • Pemberitahuan peristiwa dibuat pada peristiwa berikut:

    • DROP_LOGIN

    • ALTER_LOGIN

    • DROP_USER

    • ALTER_USER

    • ADD_ROLE_MEMBER

    • DROP_ROLE_MEMBER

    • ADD_SERVER_ROLE_MEMBER

    • DROP_SERVER_ROLE_MEMBER

    • DENYatau REVOKE (Hanya berlaku untuk ALTER DATABASE, , ALTER ANY DATABASE EVENT NOTIFICATIONCREATE DATABASE DDL EVENT NOTIFICATION, CONTROL SERVER, ALTER ANY EVENT NOTIFICATION, CREATE DDL EVENT NOTIFICATION, atau CREATE TRACE EVENT NOTIFICATION izin.)

Bekerja dengan data peristiwa di sisi klien

Setelah Penyedia WMI untuk Peristiwa Server membuat pemberitahuan peristiwa yang diperlukan dalam database target, pemberitahuan peristiwa mengirimkan data peristiwa ke layanan target yang msdb bernama SQL/Notifications/ProcessWMIEventProviderNotification/v1.0. Layanan target menempatkan peristiwa ke dalam antrean yang msdb diberi nama WMIEventProviderNotificationQueue. (Baik layanan maupun antrean dibuat secara dinamis oleh penyedia ketika pertama kali terhubung ke SQL Server.) Penyedia kemudian membaca data peristiwa XML dari antrean ini dan mengubahnya menjadi format objek terkelola (MOF) sebelum mengembalikannya ke aplikasi klien. Data MOF terdiri dari properti peristiwa yang diminta oleh kueri WQL sebagai definisi kelas Common Information Model (CIM). Setiap properti memiliki jenis CIM yang sesuai. Misalnya, SPID properti dikembalikan sebagai jenis CIM Sint32. Jenis CIM untuk setiap properti tercantum di bawah setiap kelas peristiwa di Penyedia WMI untuk kelas dan properti Peristiwa Server.