Sdílet prostřednictvím


Práce s oznámeními dotazů

platí pro:SQL Server

Stáhnout ovladač OLE DB

Oznámení dotazů byla zavedena v SYSTÉMU SQL Server 2005 (9.x) a ovladač OLE DB pro SQL Server. Na základě infrastruktury SLUŽBY SQL Service Broker zavedené v SYSTÉMU SQL Server 2005 (9.x) umožňují oznámení dotazů aplikacím dostávat oznámení o změně dat. Tato funkce je užitečná pro aplikace, které poskytují mezipaměť informací z databáze, jako je webová aplikace, a musí být upozorněni při změně zdrojových dat.

Pomocí oznámení dotazů můžete požadovat oznámení v zadaném časovém limitu, když se podkladová data dotazu změní. Požadavek určuje možnosti oznámení, mezi které patří název služby, text zprávy a hodnota časového limitu serveru. Oznámení se doručují prostřednictvím fronty Service Broker, kterou můžou aplikace dotazovat na dostupná oznámení.

Syntaxe řetězce možností oznámení dotazu je:

service=<service-name>[;(local database=<database> | broker instance=<broker instance>)]

Například:

service=mySSBService;local database=mydb

Odběry oznámení mají za sebou proces, který je spustí. Důvodem je to, že aplikace může vytvořit odběr oznámení a pak ukončit. Předplatné zůstane platné a k oznámení dojde v případě, že se data v zadaném časovém limitu změní. Dotaz se identifikuje při spuštění dotazu, možnostech oznámení a textu zprávy. Můžete ho zrušit nastavením jeho hodnoty časového limitu na nulu.

Oznámení se odesílají jenom jednou. Pokud chcete být neustále upozorněni na změny dat, vytvořte nové předplatné opětovným spuštěním dotazu po zpracování každého oznámení.

Ovladač OLE DB pro aplikace SYSTÉMU SQL Server obvykle přijímá oznámení pomocí příkazu Transact-SQL RECEIVE. Tento příkaz používá ke čtení oznámení z fronty, která je přidružená ke službě zadané v možnostech oznámení.

Poznámka

Názvy tabulek musí být kvalifikované v dotazech, pro které se vyžaduje oznámení. Například dbo.myTable. Názvy tabulek musí být kvalifikované pomocí dvoudílných názvů. Předplatné je neplatné, pokud se použijí názvy tří nebo čtyř částí.

Infrastruktura oznámení je postavená na funkci fronty představené v SYSTÉMU SQL Server 2005 (9.x). Obecně platí, že oznámení generovaná na serveru se odesílají prostřednictvím těchto front, aby se později zpracovávala.

Pokud chcete používat oznámení dotazů, musí na serveru existovat fronta a služba. Tyto položky je možné vytvořit pomocí příkazu Transact-SQL, podobně jako následující:

CREATE QUEUE myQueue
CREATE SERVICE myService ON QUEUE myQueue
([https://schemas.microsoft.com/SQL/Notifications/PostQueryNotification])

Poznámka

Služba musí používat předdefinovaný kontrakt, jak je znázorněno výše.

Ovladač OLE DB pro SQL Server

Ovladač OLE DB pro SQL Server podporuje oznámení příjemců při úpravě sady řádků. Příjemce obdrží oznámení v každé fázi úpravy sady řádků a při jakékoli pokusu o změnu.

Poznámka

Předání dotazu na oznámení serveru pomocí příkazu ICommand::Execute je jediným platným způsobem přihlášení k odběru oznámení dotazů pomocí ovladače OLE DB pro SQL Server.

sada vlastností DBPROPSET_SQLSERVERROWSET

Aby bylo možné podporovat oznámení dotazů prostřednictvím OLE DB, ovladač OLE DB pro SQL Server přidá do sady vlastností DBPROPSET_SQLSERVERROWSET následující nové vlastnosti.

Jméno Typ Popis
SSPROP_QP_NOTIFICATION_TIMEOUT VT_UI4 Počet sekund, po které má oznámení dotazu zůstat aktivní.

Výchozí hodnota je 432 000 sekund (5 dní). Minimální hodnota je 1 sekunda a maximální hodnota je 2^31-1 sekundy.
SSPROP_QP_NOTIFICATION_MSGTEXT VT_BSTR Text zprávy oznámení. Tento text je definovaný uživatelem a nemá žádný předdefinovaný formát.

Ve výchozím nastavení je řetězec prázdný. Zadejte zprávu pomocí 1 až 2 000 znaků.
SSPROP_QP_NOTIFICATION_OPTIONS VT_BSTR Možnosti oznámení dotazu. Tyto možnosti jsou zadány v řetězci s název=hodnota syntaxe. Uživatel zodpovídá za vytvoření služby a čtení oznámení z fronty.

Výchozí hodnota je prázdný řetězec.

Odběr oznámení se vždy potvrdí. Dochází k tomu bez ohledu na to, zda příkaz běžel v transakci uživatele, nebo v automatickém příkazu nebo zda transakce, ve které byl příkaz spuštěn potvrzen nebo vrácen zpět. Oznámení serveru se aktivuje při některé z následujících neplatných podmínek oznámení: změna podkladových dat nebo schématu nebo dosažení časového limitu; podle toho, co je první.

Registrace oznámení se odstraní, jakmile se aktivují. Takže při příjmu oznámení se aplikace musí znovu přihlásit k odběru, pokud chcete získat další aktualizace.

Oznámení v cílové frontě může zkontrolovat jiné připojení nebo vlákno. Například:

WAITFOR (RECEIVE * FROM MyQueue); -- Where MyQueue is the queue name.

Poznámka

SELECT * neodstraní položku z fronty. RECEIVE * FROM to ale dělá. Pokud je fronta prázdná, zastaví se vlákno serveru. Pokud v době volání existují položky fronty, vrátí se okamžitě. V opačném případě volání počká, dokud se nespraví položka fronty.

RECEIVE * FROM MyQueue

Tento příkaz okamžitě vrátí prázdnou sadu výsledků, pokud je fronta prázdná. V opačném případě vrátí všechna oznámení fronty.

Pokud jsou SSPROP_QP_NOTIFICATION_MSGTEXT a SSPROP_QP_NOTIFICATION_OPTIONS neprázdné a neprázdné, odešle se na server hlavička TDS oznámení dotazu, která obsahuje tři vlastnosti definované výše. Tato hlavička se odešle při každém spuštění příkazu. Pokud je některý z nich null (nebo prázdný), hlavička se neodesílají a DB_E_ERRORSOCCURRED je vyvolána (nebo je vyvolána DB_S_ERRORSOCCURRED, pokud jsou obě vlastnosti označené jako volitelné). Hodnota stavu je pak nastavena na DBPROPSTATUS_BADVALUE. K ověření dojde při spuštění a přípravě. Podobně se DB_S_ERRORSOCCURRED vyvolá při nastavení vlastností oznámení dotazu pro připojení k verzím SQL Serveru před SQL Serverem 2005 (9.x). Hodnota stavu v tomto případě je DBPROPSTATUS_NOTSUPPORTED.

Spuštění předplatného nezaručuje úspěšné doručení budoucích zpráv. Také není provedena žádná kontrola platnosti zadaného názvu služby.

Poznámka

Příprava příkazů nikdy nezpůsobí zahájení předplatného. Inicializace dosáhne pouze spuštění příkazu. Na oznámení dotazů nemá vliv použití základních služeb OLE DB.

Další informace o DBPROPSET_SQLSERVERROWSET sady vlastností naleznete v tématu Vlastnosti sady řádků a chování.

Viz také

ovladač OLE DB pro funkce SQL Serveru