Praca z powiadomieniami o zapytaniach
Dotyczy:programu SQL Server
Powiadomienia o zapytaniach zostały wprowadzone w programie SQL Server 2005 (9.x) i sterownikie OLE DB dla programu SQL Server. Oparta na infrastrukturze usługi SQL Service Broker wprowadzonej w programie SQL Server 2005 (9.x) powiadomienia o zapytaniach umożliwiają aplikacjom powiadamianie o zmianie danych. Ta funkcja jest przydatna w przypadku aplikacji, które udostępniają pamięć podręczną informacji z bazy danych, takiej jak aplikacja internetowa, i muszą być powiadamiane o zmianie danych źródłowych.
Korzystając z powiadomień o zapytaniach, możesz zażądać powiadomień w określonym przedziale czasu, gdy bazowe dane zapytania zmienią się. Żądanie określa opcje powiadomień, które obejmują nazwę usługi, tekst komunikatu i wartość limitu czasu serwera. Powiadomienia są dostarczane za pośrednictwem kolejki usługi Service Broker, którą aplikacje mogą sondować pod kątem dostępnych powiadomień.
Składnia ciągu opcji powiadomień zapytania to:
service=<service-name>[;(local database=<database> | broker instance=<broker instance>)]
Na przykład:
service=mySSBService;local database=mydb
Subskrypcje powiadomień przeżywają proces, który je uruchamia. Dzieje się tak, ponieważ aplikacja może utworzyć subskrypcję powiadomień, a następnie zakończyć. Subskrypcja pozostaje prawidłowa, a powiadomienie występuje, jeśli dane zmieniają się w określonym przedziale czasu. Powiadomienie jest identyfikowane przez wykonane zapytanie, opcje powiadomień i tekst wiadomości. Możesz ją anulować, ustawiając jej wartość limitu czasu na zero.
Powiadomienia są wysyłane tylko raz. Aby otrzymywać ciągłe powiadomienia o zmianach danych, utwórz nową subskrypcję, ponownie wykonując zapytanie po przetworzeniu każdego powiadomienia.
Sterownik OLE DB dla aplikacji programu SQL Server zwykle odbiera powiadomienia przy użyciu polecenia Transact-SQL RECEIVE. Używa tego polecenia do odczytywania powiadomień z kolejki skojarzonej z usługą określoną w opcjach powiadomień.
Nuta
Nazwy tabel muszą być kwalifikowane w zapytaniach, dla których wymagane jest powiadomienie. Na przykład dbo.myTable
. Nazwy tabel muszą być kwalifikowane z dwuczęściowymi nazwami. Subskrypcja jest nieprawidłowa, jeśli są używane nazwy trzech lub czterech części.
Infrastruktura powiadomień jest oparta na funkcji kolejkowania wprowadzonej w programie SQL Server 2005 (9.x). Ogólnie rzecz biorąc, powiadomienia generowane na serwerze są wysyłane za pośrednictwem tych kolejek, które mają być przetwarzane później.
Aby można było używać powiadomień o zapytaniach, na serwerze musi istnieć kolejka i usługa. Te elementy można utworzyć przy użyciu polecenia Transact-SQL, podobnego do następujących:
CREATE QUEUE myQueue
CREATE SERVICE myService ON QUEUE myQueue
([https://schemas.microsoft.com/SQL/Notifications/PostQueryNotification])
Nuta
Usługa musi używać wstępnie zdefiniowanego kontraktu, jak pokazano powyżej.
Sterownik OLE DB dla programu SQL Server
Sterownik OLE DB dla programu SQL Server obsługuje powiadomienia konsumentów po modyfikacji zestawu wierszy. Użytkownik otrzymuje powiadomienie na każdej fazie modyfikacji zestawu wierszy i przy każdej próbie zmiany.
Nuta
Przekazywanie zapytania powiadomień do serwera przy użyciu polecenia ICommand::Execute jest jedynym prawidłowym sposobem subskrybowania powiadomień za pomocą sterownika OLE DB dla programu SQL Server.
zestaw właściwości DBPROPSET_SQLSERVERROWSET
Aby obsługiwać powiadomienia o zapytaniach za pomocą ole DB, sterownik OLE DB dla programu SQL Server dodaje następujące nowe właściwości do zestawu właściwości DBPROPSET_SQLSERVERROWSET
.
Nazwa | Typ | Opis |
---|---|---|
SSPROP_QP_NOTIFICATION_TIMEOUT | VT_UI4 | Liczba sekund, przez które powiadomienie zapytania ma pozostać aktywne. Wartość domyślna to 432 000 sekund (5 dni). Wartość minimalna to 1 sekunda, a maksymalna wartość to 2^31–1 sekundy. |
SSPROP_QP_NOTIFICATION_MSGTEXT | VT_BSTR | Tekst wiadomości powiadomienia. Ten tekst jest zdefiniowany przez użytkownika i nie ma wstępnie zdefiniowanego formatu. Domyślnie ciąg jest pusty. Określ komunikat przy użyciu od 1 do 2000 znaków. |
SSPROP_QP_NOTIFICATION_OPTIONS | VT_BSTR | Opcje powiadomienia zapytania. Te opcje są określane w ciągu o nazwie =wartości składni. Użytkownik jest odpowiedzialny za tworzenie usługi i odczytywanie powiadomień poza kolejką. Wartość domyślna to pusty ciąg. |
Subskrypcja powiadomień jest zawsze zatwierdzana. Dzieje się tak niezależnie od tego, czy instrukcja była uruchamiana w transakcji użytkownika, czy w automatycznym zatwierdzaniu, czy też czy transakcja, w której instrukcja została zatwierdzona, czy wycofana. Powiadomienie serwera jest uruchamiane na dowolnym z następujących nieprawidłowych warunków powiadamiania: zmiana bazowych danych lub schematu lub po osiągnięciu limitu czasu; w zależności od tego, która wartość jest pierwsza.
Rejestracje powiadomień są usuwane natychmiast po ich wyzwoleniu. Dlatego po otrzymaniu powiadomień aplikacja musi ponownie zasubskrybować, jeśli chcesz uzyskać dalsze aktualizacje.
Inne połączenie lub wątek mogą sprawdzać kolejkę docelową pod kątem powiadomień. Na przykład:
WAITFOR (RECEIVE * FROM MyQueue); -- Where MyQueue is the queue name.
Nuta
SELECT *
nie usuwa wpisu z kolejki. Jednak RECEIVE * FROM
. Spowoduje to zatrzymanie wątku serwera, jeśli kolejka jest pusta. Jeśli w momencie wywołania występują wpisy w kolejce, zostaną one natychmiast zwrócone. W przeciwnym razie wywołanie czeka na utworzenie wpisu kolejki.
RECEIVE * FROM MyQueue
Ta instrukcja natychmiast zwraca pusty zestaw wyników, jeśli kolejka jest pusta. W przeciwnym razie zwraca wszystkie powiadomienia kolejki.
Jeśli SSPROP_QP_NOTIFICATION_MSGTEXT
i SSPROP_QP_NOTIFICATION_OPTIONS
są inne niż null i niepuste, do serwera są wysyłane nagłówki TDS powiadomień o zapytaniach, które zawierają trzy właściwości zdefiniowane powyżej. Ten nagłówek jest wysyłany z każdym wykonaniem polecenia. Jeśli jeden z nich ma wartość null (lub jest pusty), nagłówek nie jest wysyłany i DB_E_ERRORSOCCURRED
jest zgłaszany (lub DB_S_ERRORSOCCURRED
jest zgłaszany, jeśli właściwości są oznaczone jako opcjonalne). Wartość stanu jest następnie ustawiona na wartość DBPROPSTATUS_BADVALUE
. Walidacja odbywa się po wykonaniu i przygotowaniu. Podobnie DB_S_ERRORSOCCURRED
jest wywoływana, gdy właściwości powiadomienia zapytania są ustawione dla połączeń z wersjami programu SQL Server przed programem SQL Server 2005 (9.x). Wartość stanu w tym przypadku to DBPROPSTATUS_NOTSUPPORTED
.
Uruchomienie subskrypcji nie gwarantuje pomyślnego dostarczenia przyszłych komunikatów. Ponadto nie jest sprawdzana ważność określonej nazwy usługi.
Nuta
Przygotowywanie instrukcji nigdy nie spowoduje zainicjowania subskrypcji. Tylko wykonanie instrukcji osiągnie inicjację. Powiadomienia o zapytaniach nie mają wpływu na korzystanie z podstawowych usług OLE DB.
Aby uzyskać więcej informacji na temat zestawu właściwości DBPROPSET_SQLSERVERROWSET
, zobacz Właściwości i zachowania zestawu wierszy.