Sorgu Bildirimleriyle Çalışma
Şunlar için geçerlidir:SQL ServerAzure SQL Yönetilen Örneği
Önemli
SQL Server Native Client (SNAC) şu şekilde gönderilmez:
- SQL Server 2022 (16.x) ve sonraki sürümleri
- SQL Server Management Studio 19 ve sonraki sürümleri
YENI uygulama geliştirme için SQL Server Yerel İstemcisi (SQLNCLI veya SQLNCLI11) ve SQL Server için eski Microsoft OLE DB Sağlayıcısı (SQLOLEDB) önerilmez.
Yeni projeler için aşağıdaki sürücülerden birini kullanın:
- SQL Server için Microsoft ODBC Sürücüsünü
- SQL Server için Microsoft OLE DB Sürücüsünü
SQL Server Veritabanı Altyapısı'nın (sürüm 2012 ile 2019 arasında) bir bileşeni olarak gelen SQLNCLI için, Destek Yaşam Döngüsü özel durumukonusuna bakın.
Sorgu bildirimleri SQL Server 2005 (9.x) ve SQL Server Yerel İstemcisi'nde kullanıma sunulmuştur. SQL Server 2005'te (9.x) kullanıma sunulan Hizmet Aracısı altyapısı üzerine oluşturulan sorgu bildirimleri, veriler değiştiğinde uygulamaların bilgilendirilmesini sağlar. Bu özellik özellikle Web uygulaması gibi bir veritabanından bilgi önbelleği sağlayan ve kaynak veriler değiştirildiğinde bildirilmesi gereken uygulamalar için kullanışlıdır.
Sorgu bildirimleri, bir sorgunun temel alınan verileri değiştiğinde belirtilen zaman aşımı süresi içinde bildirim isteğinde bulunmanıza olanak sağlar. Bildirim isteği, hizmet adını, ileti metnini ve sunucuya zaman aşımı değerini içeren bildirim seçeneklerini belirtir. Bildirimler, uygulamaların kullanılabilir bildirimleri yoklamasına neden olabilecek bir Hizmet Aracısı kuyruğu üzerinden teslim edilir.
Sorgu bildirimleri seçenekleri dizesinin söz dizimi şöyledir:
service=<service-name>[;(local database=<database> | broker instance=<broker instance>)]
Mesela:
service=mySSBService;local database=mydb
Bildirim abonelikleri, bir uygulama bir bildirim aboneliği oluşturup sonlandırana kadar onları başlatan işlemden daha uzun sürebilir. Abonelik geçerli kalır ve veriler abonelik oluşturulduğunda belirtilen zaman aşımı süresi içinde değişirse bildirim gerçekleşir. Yürütülen sorgu, bildirim seçenekleri ve ileti metni tarafından bir bildirim tanımlanır ve zaman aşımı değeri sıfır olarak ayarlanarak iptal edilebilir.
Bildirimler yalnızca bir kez gönderilir. Veri değişikliğinin sürekli bildirimi için, her bildirim işlendikten sonra sorgu yeniden yürütülerek yeni bir abonelik oluşturulmalıdır.
SQL Server Yerel İstemci uygulamaları genellikle bildirim seçeneklerinde belirtilen hizmetle ilişkili kuyruktan gelen bildirimleri okumak için Transact-SQL RECEIVE komutunu kullanarak bildirim alır.
Not
Tablo adlarının bildirim gerektiren sorgularda nitelenmiş olması gerekir; örneğin, dbo.myTable
. Tablo adları iki bölüm adıyla nitelenmelidir. Üç veya dört bölümlü adlar kullanılıyorsa abonelik geçersizdir.
Bildirim altyapısı, SQL Server 2005'te (9.x) kullanıma sunulan bir kuyruğa alma özelliğinin üzerine kurulmuştur. Genel olarak, sunucuda oluşturulan bildirimler daha sonra işlenmek üzere bu kuyruklar aracılığıyla gönderilir.
Sorgu bildirimlerini kullanmak için bir kuyruk ve sunucuda bir hizmet bulunmalıdır. Bunlar aşağıdakine benzer Transact-SQL kullanılarak oluşturulabilir:
CREATE QUEUE myQueue
CREATE SERVICE myService ON QUEUE myQueue
([http://schemas.microsoft.com/SQL/Notifications/PostQueryNotification])
Not
Hizmet, yukarıda gösterildiği gibi önceden tanımlanmış sözleşme http://schemas.microsoft.com/SQL/Notifications/PostQueryNotification
kullanmalıdır.
SQL Server Yerel İstemci OLE DB Sağlayıcısı
SQL Server Yerel İstemci OLE DB sağlayıcısı, satır kümesi değişikliğinde tüketici bildirimini destekler. Tüketici, satır kümesi değişikliğinin her aşamasında ve herhangi bir değişiklik girişiminde bildirim alır.
Not
ICommand::Execute ile sunucuya bildirim sorgusu geçirmek, SQL Server Yerel İstemci OLE DB sağlayıcısıyla sorgu bildirimlerine abone olmak için tek geçerli yoldur.
DBPROPSET_SQLSERVERROWSET Özellik Kümesi
SQL Server Yerel İstemcisi, OLE DB aracılığıyla sorgu bildirimlerini desteklemek için DBPROPSET_SQLSERVERROWSET özellik kümesine aşağıdaki yeni özellikleri ekler.
Ad | Tür | Açıklama |
---|---|---|
SSPROP_QP_NOTIFICATION_TIMEOUT | VT_UI4 | Sorgu bildiriminin etkin kalacağı saniye sayısı. Varsayılan değer 432000 saniyedir (5 gün). En düşük değer 1 saniye, maksimum değer ise 2^31-1 saniyedir. |
SSPROP_QP_NOTIFICATION_MSGTEXT | VT_BSTR | Bildirimin ileti metni. Bu kullanıcı tanımlıdır ve önceden tanımlanmış bir biçimi yoktur. Varsayılan olarak, dize boş olur. 1-2000 karakterlik bir ileti belirtebilirsiniz. |
SSPROP_QP_NOTIFICATION_OPTIONS | VT_BSTR | Sorgu bildirim seçenekleri. Bunlar, adı=değer söz dizimine sahip bir dizede belirtilir. Kullanıcı, hizmeti oluşturmaktan ve kuyruktan bildirimleri okumaktan sorumludur. Varsayılan değer boş bir dizedir. |
Bildirim aboneliği, deyimin bir kullanıcı işleminde mi yoksa otomatik işlemede mi yoksa deyimin çalıştırıldığı veya geri alınıp alınmadığına bakılmaksızın her zaman işlenir. Sunucu bildirimi, aşağıdaki geçersiz bildirim koşullarından herhangi birini tetikler: temel alınan verilerin veya şemanın değiştirilmesi veya zaman aşımı süresine ulaşıldığında; hangisi önceyse. Bildirim kayıtları tetiklenir tetiklenmez silinir. Bu nedenle, bildirimleri aldıktan sonra uygulamanın daha fazla güncelleştirme almak istemesi durumunda yeniden abone olması gerekir.
Başka bir bağlantı veya iş parçacığı, bildirimler için hedef kuyruğu denetleyebilir. Mesela:
WAITFOR (RECEIVE * FROM MyQueue); // Where MyQueue is the queue name.
SELECT * öğesinin girdiyi Kuyruktan silmez, ancak RECEIVE * FROM tarafından silindiğini unutmayın. Bu, kuyruk boşsa bir sunucu iş parçacığını durdurur. Çağrı sırasında kuyruk girdileri varsa, bunlar hemen döndürülür; aksi takdirde çağrı, bir kuyruk girişi yapılana kadar bekler.
RECEIVE * FROM MyQueue
Bu deyim, kuyruk boşsa hemen boş bir sonuç kümesi döndürür; aksi takdirde tüm kuyruk bildirimlerini döndürür.
SSPROP_QP_NOTIFICATION_MSGTEXT ve SSPROP_QP_NOTIFICATION_OPTIONS NULL olmayan ve boş olmayan sorgu bildirimleri yukarıda tanımlanan üç özelliği içeren TDS üst bilgisi, komutun her yürütülmesiyle birlikte sunucuya gönderilir. Bunlardan biri null (veya boş) ise, üst bilgi gönderilmez ve DB_E_ERRORSOCCURRED oluşturulur (veya özellikler isteğe bağlı olarak işaretlenirse DB_S_ERRORSOCCURRED) ve durum değeri DBPROPSTATUS_BADVALUE olarak ayarlanır. Doğrulama, Yürüt/Hazırla'da gerçekleşir. Benzer şekilde, SQL Server 2005 (9.x) öncesi SQL Server sürümlerine bağlantılar için sorgu bildirim özellikleri ayarlandığında DB_S_ERRORSOCCURRED oluşturulur. Bu durumda durum değeri DBPROPSTATUS_NOTSUPPORTED.
Aboneliğin başlatılması, sonraki iletilerin başarıyla teslim edileceğini garanti etmez. Ayrıca, belirtilen hizmet adının geçerliliğiyle ilgili bir denetim yapılmaz.
Not
Deyimlerin hazırlanması aboneliğin başlatılmasına hiçbir zaman neden olmaz; yalnızca deyim yürütmesi bunu başaracaktır ve sorgu bildirimleri OLE DB çekirdek hizmetlerinin kullanımından etkilenmez.
DBPROPSET_SQLSERVERROWSET özellik kümesi hakkında daha fazla bilgi için bkz. Satır Kümesi Özellikleri ve Davranışları.
SQL Server Yerel İstemci ODBC Sürücüsü
SQL Server Yerel İstemci ODBC sürücüsü, SQLGetStmtAttr
SQL_SOPT_SS_QUERYNOTIFICATION_MSGTEXT
SQL_SOPT_SS_QUERYNOTIFICATION_OPTIONS
SQL_SOPT_SS_QUERYNOTIFICATION_TIMEOUT
SQL_SOPT_SS_QUERYNOTIFICATION_MSGTEXT ve SQL_SOPT_SS_QUERYNOTIFICATION_OPTIONS NULL değilse, komut her yürütülürken yukarıda tanımlanan üç özniteliği içeren TDS üst bilgisi sorgu bildirimleri sunucuya gönderilir. Bunlardan biri null ise üst bilgi gönderilmez ve SQL_SUCCESS_WITH_INFO döndürülür. Doğrulama, sqlexecdirect
Not
Hazırlama deyimleri aboneliğin başlatılmasına hiçbir zaman neden olmaz; abonelik, deyim yürütme tarafından başlatılabilir.
Özel Durumlar ve Kısıtlamalar
Bildirimler için aşağıdaki veri türleri desteklenmez:
Metin
ntext
resim
Bu türlerden herhangi birini döndüren bir sorgu için bildirim isteğinde bulunulması durumunda bildirim hemen başlatılır ve bildirim aboneliğinin mümkün olmadığını belirtir.
Bir toplu işlem veya saklı yordam için abonelik isteği yapılırsa, toplu işlem veya saklı yordam içinde yürütülen her deyim için ayrı bir abonelik isteği yapılır. EXECUTE deyimleri bir bildirim kaydetmez, ancak yürütülen komuta bildirim isteği gönderir. Bir toplu iş ise, bağlam yürütülen deyimlere uygulanır ve yukarıda açıklanan kurallar geçerlidir.
Aynı kullanıcı tarafından aynı veritabanı bağlamında gönderilen ve aynı şablona, aynı parametre değerlerine, aynı bildirim kimliğine ve mevcut etkin aboneliğin aynı teslim konumuna sahip bildirim sorgusunun gönderilmesi, mevcut aboneliği yenileyerek belirtilen yeni zaman aşımını sıfırlar. Bu, aynı sorgular için bildirim istenirse yalnızca bir bildirim gönderileceği anlamına gelir. Bu, toplu işte çoğaltılan bir sorguya veya birden çok kez çağrılan saklı yordamdaki bir sorguya uygulanır.