Sdílet prostřednictvím


Práce s oznámeními dotazů

platí pro:SQL Serverazure SQL Managed Instance

Důležitý

SQL Server Native Client (SNAC) není dodáván s:

  • SQL Server 2022 (16.x) a novější verze
  • SQL Server Management Studio 19 a novější verze

Pro vývoj nových aplikací se nedoporučuje nativní klient SQL Serveru (SQLNCLI nebo SQLNCLI11) a starší zprostředkovatel Microsoft OLE DB pro SQL Server (SQLOLEDB).

Pro nové projekty použijte jeden z následujících ovladačů:

Informace o SQLNCLI, které se dodává jako součást databázového stroje SQL Serveru (verze 2012 až 2019), naleznete v tomto support lifecycle exception.

Oznámení dotazů byla zavedena v SYSTÉMU SQL Server 2005 (9.x) a SQL Server Native Client. Založená na infrastruktuře Service Broker zavedené v SQL Serveru 2005 (9.x), oznámení dotazů umožňují aplikacím dostávat oznámení o změně dat. Tato funkce je zvlášť 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.

Oznámení dotazů umožňují požadovat oznámení během zadaného časového limitu, když se podkladová data dotazu změní. Žádost o oznámení určuje možnosti oznámení, mezi které patří název služby, text zprávy a hodnota časového limitu pro server. 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 inicializuje, protože aplikace může vytvořit odběr oznámení a poté ukončit. Předplatné zůstane platné a k oznámení dojde v případě, že se data změní během časového limitu zadaného při vytvoření předplatného. Oznámení je identifikováno dotazem, možnostmi oznámení a textem zprávy a může být zrušeno nastavením hodnoty časového limitu na nulu.

Oznámení se odesílají jenom jednou. Pro průběžné oznámení o změně dat musí být nové předplatné vytvořeno opětovným spuštěním dotazu po zpracování každého oznámení.

Nativní klientské aplikace SQL Serveru obvykle přijímají oznámení pomocí příkazu Transact-SQL RECEIVE ke čtení oznámení z fronty přidružené ke službě uvedené 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é se dvěma názvy částí. 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í vygenerovaná na serveru se odesílají prostřednictvím těchto front, které se mají zpracovat později.

Pokud chcete používat oznámení dotazů, fronta a služba musí na serveru existovat. Můžete je vytvořit pomocí Transact-SQL podobných následujícímu:

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

Poznámka

Služba musí používat předdefinovaný kontrakt http://schemas.microsoft.com/SQL/Notifications/PostQueryNotification, jak je znázorněno výše.

Zprostředkovatel OLE DB nativního klienta SQL Serveru

Zprostředkovatel OLE DB nativního klienta SQL Serveru podporuje oznámení příjemců o ú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í zprostředkovatele OLE DB nativního klienta SQL Serveru.

Sada vlastností DBPROPSET_SQLSERVERROWSET

Aby bylo možné podporovat oznámení dotazů prostřednictvím OLE DB, sql Server Native Client 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 432000 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í. Toto je definováno uživatelem a nemá žádný předdefinovaný formát.

Ve výchozím nastavení je řetězec prázdný. Zprávu můžete zadat pomocí 1–2000 znaků.
SSPROP_QP_NOTIFICATION_OPTIONS VT_BSTR Možnosti oznámení dotazu. Ty jsou zadané 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í je vždy potvrzen bez ohledu na to, zda příkaz běžel v transakci uživatele, nebo v automatickém potvrzení 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í. Při přijímání oznámení se proto musí aplikace znovu přihlásit k odběru, pokud chce 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.   

Všimněte si, že funkce SELECT * neodstraní položku z fronty, ale funkce RECEIVE * FROM provede. Pokud je fronta prázdná, zastaví se vlákno serveru. Pokud v době volání existují položky fronty, vrátí se okamžitě; jinak volání čeká, 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 obsahující tři vlastnosti definované výše 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 DB_S_ERRORSOCCURRED, pokud jsou vlastnosti označené jako volitelné) a stavová hodnota je nastavená na DBPROPSTATUS_BADVALUE. Ověření probíhá při spuštění nebo 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.

Zahájení odběru nezaručuje úspěšné doručení následných zpráv. Kromě toho 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; Pouze provádění příkazů dosáhne tohoto a oznámení dotazu nebudou ovlivněna použitím základních služeb OLE DB.

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

Ovladač ODBC nativního klienta SQL Serveru

Ovladač ODBC nativního klienta SQL Serveru podporuje oznámení dotazů prostřednictvím přidání tří nových atributů do SQLGetStmtAttr a sqlSetStmtAttr funkcí:

  • SQL_SOPT_SS_QUERYNOTIFICATION_MSGTEXT

  • SQL_SOPT_SS_QUERYNOTIFICATION_OPTIONS

  • SQL_SOPT_SS_QUERYNOTIFICATION_TIMEOUT

Pokud SQL_SOPT_SS_QUERYNOTIFICATION_MSGTEXT a SQL_SOPT_SS_QUERYNOTIFICATION_OPTIONS nemají hodnotu NULL, odešle se na server při každém spuštění příkazu hlavička TDS s třemi atributy definovanými výše. Pokud je některý z nich null, hlavička se neodesílají a SQL_SUCCESS_WITH_INFO se vrátí. K ověření dochází u funkce SQLPrepare, SqlExecDirecta SqlExecute, všechny chyby, pokud atributy nejsou platné. Podobně platí, že pokud jsou tyto atributy oznámení dotazu nastaveny pro verze SQL Serveru před SQL Serverem 2005 (9.x), spuštění selže s SQL_SUCCESS_WITH_INFO.

Poznámka

Příkazy prepare nikdy nezpůsobí zahájení předplatného; předplatné je možné zahájit spuštěním příkazu.

Zvláštní případy a omezení

Oznámení nepodporují následující datové typy:

  • textové

  • textu

  • obrázku

Pokud se vytvoří žádost o oznámení pro dotaz, který vrátí některý z těchto typů, oznámení se aktivuje okamžitě a určí, že odběr oznámení není možný.

Pokud se pro dávku nebo uloženou proceduru vytvoří žádost o předplatné, pro každý příkaz spuštěný v dávce nebo uložené proceduře se provede samostatná žádost o předplatné. Příkazy EXECUTE nezaregistrují oznámení, ale pošlou žádost o oznámení na spuštěný příkaz. Pokud se jedná o dávku, použije se kontext na spouštěné příkazy a platí stejná pravidla, která jsou popsána výše.

Odeslání dotazu na oznámení, které odeslal stejný uživatel ve stejném kontextu databáze a má stejnou šablonu, stejné hodnoty parametrů, stejné ID oznámení a stejné umístění doručení existujícího aktivního předplatného, obnoví stávající předplatné a resetuje nový zadaný časový limit. To znamená, že pokud je požadováno oznámení pro stejné dotazy, odešle se pouze jedno oznámení. To by platilo pro dotaz duplikovaný v dávce nebo dotaz v uložené proceduře, který se volal několikrát.

Viz také

funkce nativního klienta SQL Serveru