Delen via


Werken met querymeldingen

van toepassing op:SQL ServerAzure SQL Managed Instance

Belangrijk

SQL Server Native Client (SNAC) wordt niet geleverd met:

  • SQL Server 2022 (16.x) en latere versies
  • SQL Server Management Studio 19 en latere versies

De SQL Server Native Client (SQLNCLI of SQLNCLI11) en de verouderde Microsoft OLE DB-provider voor SQL Server (SQLOLEDB) worden niet aanbevolen voor de ontwikkeling van nieuwe toepassingen.

Gebruik een van de volgende stuurprogramma's voor nieuwe projecten:

Voor SQLNCLI die als onderdeel van SQL Server Database Engine (versies 2012 tot en met 2019) wordt geleverd, raadpleegt u deze uitzondering voor de levenscyclus van ondersteuning.

Querymeldingen zijn geïntroduceerd in SQL Server 2005 (9.x) en SQL Server Native Client. Op basis van de Service Broker-infrastructuur die is geïntroduceerd in SQL Server 2005 (9.x), kunnen querymeldingen toepassingen op de hoogte stellen wanneer gegevens zijn gewijzigd. Deze functie is met name handig voor toepassingen die een cache met informatie uit een database bieden, zoals een webtoepassing, en moeten worden gewaarschuwd wanneer de brongegevens worden gewijzigd.

Met querymeldingen kunt u binnen een opgegeven time-outperiode een melding aanvragen wanneer de onderliggende gegevens van een query worden gewijzigd. De aanvraag voor melding geeft de meldingsopties op, waaronder de servicenaam, berichttekst en time-outwaarde voor de server. Meldingen worden bezorgd via een Service Broker-wachtrij die toepassingen kunnen peilen naar beschikbare meldingen.

De syntaxis van de tekenreeks voor querymeldingen is:

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

Bijvoorbeeld:

service=mySSBService;local database=mydb

Meldingsabonnementen overleven het proces waarmee ze worden gestart, omdat een toepassing een meldingsabonnement kan maken en vervolgens wordt beëindigd. Het abonnement blijft geldig en de melding wordt weergegeven als de gegevens worden gewijzigd binnen de time-outperiode die is opgegeven toen het abonnement werd gemaakt. Een melding wordt geïdentificeerd door de query die wordt uitgevoerd, de meldingsopties en de berichttekst, en kan worden geannuleerd door de time-outwaarde ervan in te stellen op nul.

Meldingen worden slechts eenmaal verzonden. Voor continue melding van gegevenswijziging moet een nieuw abonnement worden gemaakt door de query opnieuw uit te voeren nadat elke melding is verwerkt.

SQL Server Native Client-toepassingen ontvangen doorgaans meldingen met behulp van de opdracht Transact-SQL ONTVANGEN om meldingen te lezen uit de wachtrij die is gekoppeld aan de service die is opgegeven in de meldingsopties.

Notitie

Tabelnamen moeten worden gekwalificeerd in query's waarvoor een melding is vereist, bijvoorbeeld dbo.myTable. Tabelnamen moeten worden gekwalificeerd met twee onderdeelnamen. Abonnement is ongeldig als er drie- of vierdelige namen worden gebruikt.

De meldingsinfrastructuur is gebouwd op basis van een wachtrijfunctie die is geïntroduceerd in SQL Server 2005 (9.x). Over het algemeen worden meldingen die op de server worden gegenereerd, verzonden via deze wachtrijen die later moeten worden verwerkt.

Als u querymeldingen wilt gebruiken, moet een wachtrij en een service aanwezig zijn op de server. Deze kunnen worden gemaakt met behulp van Transact-SQL vergelijkbaar met de volgende:

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

Notitie

De service moet gebruikmaken van het vooraf gedefinieerde contract http://schemas.microsoft.com/SQL/Notifications/PostQueryNotification zoals hierboven wordt weergegeven.

OLE DB-provider van SQL Server Native Client

De OLE DB-provider van de SQL Server Native Client ondersteunt consumentenmeldingen bij het wijzigen van rijensets. De consument ontvangt een melding in elke fase van het wijzigen van de rijenset en bij elke poging tot wijziging.

Notitie

Het doorgeven van een meldingenquery aan de server met ICommand::Voer is de enige geldige manier om u te abonneren op querymeldingen met de OLE DB-provider van de SYSTEEMeigen SQL Server-client.

De eigenschapsset DBPROPSET_SQLSERVERROWSET

Ter ondersteuning van querymeldingen via OLE DB voegt SQL Server Native Client de volgende nieuwe eigenschappen toe aan de DBPROPSET_SQLSERVERROWSET eigenschappenset.

Naam Type Beschrijving
SSPROP_QP_NOTIFICATION_TIMEOUT VT_UI4 Het aantal seconden dat de querymelding actief moet blijven.

De standaardwaarde is 432000 seconden (5 dagen). De minimumwaarde is 1 seconde en de maximumwaarde is 2^31-1 seconden.
SSPROP_QP_NOTIFICATION_MSGTEXT VT_BSTR De berichttekst van de melding. Dit is door de gebruiker gedefinieerd en heeft geen vooraf gedefinieerde indeling.

De tekenreeks is standaard leeg. U kunt een bericht opgeven met 1-2000 tekens.
SSPROP_QP_NOTIFICATION_OPTIONS VT_BSTR De opties voor querymeldingen. Deze worden opgegeven in een tekenreeks met naam=waarde syntaxis. De gebruiker is verantwoordelijk voor het maken van de service en het lezen van meldingen uit de wachtrij.

De standaardwaarde is een lege tekenreeks.

Het meldingsabonnement wordt altijd doorgevoerd, ongeacht of de instructie is uitgevoerd in een gebruikerstransactie of in automatische doorvoer of of de transactie waarin de instructie is doorgevoerd of teruggedraaid. De servermelding wordt geactiveerd op een van de volgende ongeldige meldingsvoorwaarden: wijziging van onderliggende gegevens of schema, of wanneer de time-outperiode is bereikt; wat het eerst is. Meldingsregistraties worden verwijderd zodra ze worden geactiveerd. Bij het ontvangen van meldingen moet de toepassing zich daarom opnieuw abonneren voor het geval ze verdere updates willen ontvangen.

Een andere verbinding of thread kan de doelwachtrij controleren op meldingen. Bijvoorbeeld:

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

Houd er rekening mee dat SELECT * de vermelding niet uit de wachtrij verwijdert, maar RECEIVE * FROM wel. Hiermee wordt een serverthread geblokkeerd als de wachtrij leeg is. Als er wachtrijvermeldingen zijn op het moment van de oproep, worden ze onmiddellijk geretourneerd; anders wacht de oproep totdat er een wachtrijvermelding wordt gemaakt.

RECEIVE * FROM MyQueue  

Deze instructie retourneert onmiddellijk een lege resultatenset als de wachtrij leeg is; anders worden alle wachtrijmeldingen geretourneerd.

Als SSPROP_QP_NOTIFICATION_MSGTEXT en SSPROP_QP_NOTIFICATION_OPTIONS niet null en niet leeg zijn, wordt de TDS-header met de drie hierboven gedefinieerde eigenschappen naar de server verzonden met elke uitvoering van de opdracht. Als een van beide null (of leeg) is, wordt de header niet verzonden en wordt DB_E_ERRORSOCCURRED gegenereerd (of DB_S_ERRORSOCCURRED als de eigenschappen zijn gemarkeerd als optioneel) en de statuswaarde is ingesteld op DBPROPSTATUS_BADVALUE. De validatie vindt plaats op Execute/Prepare. Op dezelfde manier wordt DB_S_ERRORSOCCURRED gegenereerd wanneer de eigenschappen van de querymelding zijn ingesteld voor verbindingen met SQL Server-versies vóór SQL Server 2005 (9.x). De statuswaarde in dit geval is DBPROPSTATUS_NOTSUPPORTED.

Het initiëren van een abonnement garandeert niet dat volgende berichten met succes worden bezorgd. Bovendien wordt er geen controle uitgevoerd op de geldigheid van de opgegeven servicenaam.

Notitie

Het voorbereiden van instructies leidt er nooit toe dat het abonnement wordt gestart; alleen de uitvoering van de instructie bereikt dit en querymeldingen worden niet beïnvloed door het gebruik van OLE DB-kernservices.

Zie eigenschappen en gedragvoor meer informatie over de DBPROPSET_SQLSERVERROWSET eigenschappenset.

ODBC-stuurprogramma voor systeemeigen SQL Server-client

Het ODBC-stuurprogramma sql Server Native Client ondersteunt querymeldingen door drie nieuwe kenmerken toe te voeren aan de SQLGetStmtAttr en SQLSetStmtAttr-functies:

  • SQL_SOPT_SS_QUERYNOTIFICATION_MSGTEXT

  • SQL_SOPT_SS_QUERYNOTIFICATION_OPTIONS

  • SQL_SOPT_SS_QUERYNOTIFICATION_TIMEOUT

Als SQL_SOPT_SS_QUERYNOTIFICATION_MSGTEXT en SQL_SOPT_SS_QUERYNOTIFICATION_OPTIONS niet NULL zijn, wordt de TDS-header met de drie hierboven gedefinieerde kenmerken naar de server verzonden wanneer de opdracht wordt uitgevoerd. Als een van beide null is, wordt de header niet verzonden en wordt SQL_SUCCESS_WITH_INFO geretourneerd. De validatie vindt plaats op SQLPrepare-functie, SqlExecDirecten SqlExecute-, die allemaal mislukken als de kenmerken niet geldig zijn. Als deze querymeldingskenmerken zijn ingesteld voor SQL Server-versies vóór SQL Server 2005 (9.x), mislukt de uitvoering met SQL_SUCCESS_WITH_INFO.

Notitie

Voorbereidingsinstructies zorgen er nooit voor dat het abonnement wordt geïnitieerd; het abonnement kan worden geïnitieerd door de uitvoering van de instructie.

Speciale gevallen en beperkingen

De volgende gegevenstypen worden niet ondersteund voor meldingen:

  • tekst

  • afbeelding

Als er een meldingsaanvraag wordt gedaan voor een query die een van deze typen retourneert, wordt de melding onmiddellijk geactiveerd, waarbij wordt opgegeven dat meldingsabonnement niet mogelijk was.

Als er een abonnementsaanvraag wordt ingediend voor een batch- of opgeslagen procedure, wordt er een afzonderlijke abonnementsaanvraag gedaan voor elke instructie die wordt uitgevoerd in de batch of opgeslagen procedure. MET EXECUTE-instructies wordt geen melding geregistreerd, maar wordt de meldingsaanvraag verzonden naar de uitgevoerde opdracht. Als het een batch is, wordt de context toegepast op de uitgevoerde instructies en zijn dezelfde regels die hierboven worden beschreven van toepassing.

Het verzenden van een query voor meldingen die door dezelfde gebruiker in dezelfde databasecontext zijn ingediend en dezelfde sjabloon, dezelfde parameterwaarden, dezelfde meldings-id en dezelfde leveringslocatie van een bestaand actief abonnement heeft, verlengt het bestaande abonnement en stelt de nieuwe opgegeven time-out opnieuw in. Dit betekent dat als er een melding wordt aangevraagd voor identieke query's, er slechts één melding wordt verzonden. Dit geldt voor een query die in een batch wordt gedupliceerd of een query in een opgeslagen procedure die meerdere keren is aangeroepen.

Zie ook

systeemeigen SQL Server-clientfuncties