Werken met querymeldingen
van toepassing op:SQL Server-
OLE DB-stuurprogramma downloaden
Querymeldingen zijn geïntroduceerd in SQL Server 2005 (9.x) en OLE DB-stuurprogramma voor SQL Server. Op basis van de SQL 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 handig voor toepassingen die een cache met gegevens uit een database bieden, zoals een webtoepassing, en moeten worden gewaarschuwd wanneer de brongegevens worden gewijzigd.
Door querymeldingen te gebruiken, kunt u binnen een opgegeven time-outperiode meldingen aanvragen wanneer de onderliggende gegevens van een query worden gewijzigd. De aanvraag 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. Dat komt doordat een toepassing een meldingsabonnement kan maken en vervolgens kan beëindigen. Het abonnement blijft geldig en de melding treedt op als de gegevens binnen de opgegeven time-outperiode veranderen. Er wordt een melding geïdentificeerd door de query die wordt uitgevoerd, de meldingsopties en de berichttekst. U kunt deze annuleren door de time-outwaarde in te stellen op nul.
Meldingen worden slechts eenmaal verzonden. Als u voortdurend op de hoogte wilt worden gesteld van gegevenswijzigingen, maakt u een nieuw abonnement door de query opnieuw uit te voeren nadat elke melding is verwerkt.
OLE DB-stuurprogramma voor SQL Server-toepassingen ontvangt doorgaans meldingen met behulp van de opdracht Transact-SQL RECEIVE. Deze opdracht wordt gebruikt 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 tweedelige namen. 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, moeten er een wachtrij en een service aanwezig zijn op de server. Deze items kunnen worden gemaakt met behulp van de opdracht Transact-SQL, vergelijkbaar met de volgende items:
CREATE QUEUE myQueue
CREATE SERVICE myService ON QUEUE myQueue
([https://schemas.microsoft.com/SQL/Notifications/PostQueryNotification])
Notitie
De service moet gebruikmaken van het vooraf gedefinieerde contract, zoals hierboven wordt weergegeven.
OLE DB-stuurprogramma voor SQL Server
Het OLE DB-stuurprogramma voor SQL Server ondersteunt consumentenmeldingen bij het wijzigen van rijensets. De consument ontvangt een melding in elke fase van het wijzigen van rijensets 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 het OLE DB-stuurprogramma voor SQL Server.
DBPROPSET_SQLSERVERROWSET eigenschappenset
Ter ondersteuning van querymeldingen via OLE DB voegt het OLE DB-stuurprogramma voor SQL Server 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 432.000 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. Deze tekst is door de gebruiker gedefinieerd en heeft geen vooraf gedefinieerde indeling. De tekenreeks is standaard leeg. Geef een bericht op met 1 tot 2000 tekens. |
SSPROP_QP_NOTIFICATION_OPTIONS | VT_BSTR | De opties voor querymeldingen. Deze opties 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. Dit gebeurt ongeacht of de instructie is uitgevoerd in een gebruikerstransactie of in autocommit, 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. Wanneer u dus meldingen ontvangt, moet de toepassing zich opnieuw abonneren als u verdere updates wilt ontvangen.
Een andere verbinding of thread kan de doelwachtrij controleren op meldingen. Bijvoorbeeld:
WAITFOR (RECEIVE * FROM MyQueue); -- Where MyQueue is the queue name.
Notitie
SELECT *
verwijdert de vermelding niet uit de wachtrij.
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
Met deze instructie wordt onmiddellijk een lege resultatenset geretourneerd 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. Deze header wordt verzonden bij elke uitvoering van de opdracht. Als een van deze waarden null (of leeg) is, wordt de header niet verzonden en wordt DB_E_ERRORSOCCURRED
verhoogd (of DB_S_ERRORSOCCURRED
wordt verhoogd als de eigenschappen beide zijn gemarkeerd als optioneel). De statuswaarde wordt vervolgens ingesteld op DBPROPSTATUS_BADVALUE
. De validatie vindt plaats bij het uitvoeren en voorbereiden. 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 starten van een abonnement garandeert niet dat toekomstige berichten met succes worden bezorgd. Er wordt ook geen controle uitgevoerd op de geldigheid van de opgegeven servicenaam.
Notitie
Als u instructies voorbereidt, wordt het abonnement nooit gestart. Alleen de uitvoering van de instructie wordt initiëren. Querymeldingen zijn niet van invloed op het gebruik van OLE DB-kernservices.
Zie Eigenschappen en gedrag van rijensetsvoor meer informatie over de DBPROPSET_SQLSERVERROWSET
eigenschappenset.