Arbeta med frågemeddelanden
gäller för:SQL Server
Frågemeddelanden introducerades i SQL Server 2005 (9.x) och OLE DB-drivrutinen för SQL Server. Med sql Service Broker-infrastrukturen som introducerades i SQL Server 2005 (9.x) tillåter frågemeddelanden att program meddelas när data har ändrats. Den här funktionen är användbar för program som tillhandahåller en cache med information från en databas, till exempel ett webbprogram, och som måste meddelas när källdata ändras.
Genom att använda frågemeddelanden kan du begära meddelanden inom en angiven tidsgräns när underliggande data för en fråga ändras. Begäran anger meddelandealternativen, som inkluderar tjänstnamnet, meddelandetexten och tidsgränsvärdet till servern. Meddelanden levereras via en Service Broker-kö som program kan söka efter tillgängliga meddelanden.
Syntaxen för frågemeddelandens alternativsträng är:
service=<service-name>[;(local database=<database> | broker instance=<broker instance>)]
Till exempel:
service=mySSBService;local database=mydb
Meddelandeprenumerationer överlever processen som startar dem. Det beror på att ett program kan skapa en meddelandeprenumeration och sedan avsluta. Prenumerationen förblir giltig och meddelandet inträffar om data ändras inom den angivna tidsgränsen. Ett meddelande identifieras av den körda frågan, meddelandealternativen och meddelandetexten. Du kan avbryta det genom att ange dess timeout-värde till noll.
Meddelanden skickas bara en gång. Om du vill få kontinuerliga meddelanden om dataändringar skapar du en ny prenumeration genom att köra frågan igen när varje meddelande har bearbetats.
OLE DB-drivrutinen för SQL Server-program tar vanligtvis emot meddelanden med hjälp av kommandot Transact-SQL RECEIVE. Det använder det här kommandot för att läsa meddelanden från kön som är associerad med den tjänst som anges i meddelandealternativen.
Not
Tabellnamn måste vara kvalificerade i frågor för vilka meddelanden krävs. Till exempel dbo.myTable
. Tabellnamn måste vara kvalificerade med tvådelade namn. Prenumerationen är ogiltig om namn i tre eller fyra delar används.
Meddelandeinfrastrukturen bygger på en köfunktion som introducerades i SQL Server 2005 (9.x). I allmänhet skickas meddelanden som genereras på servern via dessa köer för att bearbetas senare.
Om du vill använda frågemeddelanden måste en kö och en tjänst finnas på servern. Dessa objekt kan skapas med hjälp av kommandot Transact-SQL, ungefär som följande:
CREATE QUEUE myQueue
CREATE SERVICE myService ON QUEUE myQueue
([https://schemas.microsoft.com/SQL/Notifications/PostQueryNotification])
Not
Tjänsten måste använda det fördefinierade kontraktet enligt ovan.
OLE DB-drivrutin för SQL Server
OLE DB-drivrutinen för SQL Server stöder konsumentmeddelanden vid raduppsättningsändring. Konsumenten får ett meddelande i varje fas av raduppsättningsändringen och om eventuella ändringsförsök.
Not
Att skicka en meddelandefråga till servern med ICommand::Execute är det enda giltiga sättet att prenumerera på frågemeddelanden med OLE DB-drivrutinen för SQL Server.
DBPROPSET_SQLSERVERROWSET egenskapsuppsättning
För att stödja frågemeddelanden via OLE DB lägger OLE DB-drivrutinen för SQL Server till följande nya egenskaper i egenskapsuppsättningen DBPROPSET_SQLSERVERROWSET
.
Namn | Typ | Beskrivning |
---|---|---|
SSPROP_QP_NOTIFICATION_TIMEOUT | VT_UI4 | Antalet sekunder som frågemeddelandet ska vara aktivt. Standardvärdet är 432 000 sekunder (5 dagar). Minimivärdet är 1 sekund och det maximala värdet är 2^31–1 sekunder. |
SSPROP_QP_NOTIFICATION_MSGTEXT | VT_BSTR | Meddelandetexten i meddelandet. Den här texten är användardefinierad och har inget fördefinierat format. Som standard är strängen tom. Ange ett meddelande med 1 till 2 000 tecken. |
SSPROP_QP_NOTIFICATION_OPTIONS | VT_BSTR | Alternativ för frågemeddelanden. Dessa alternativ anges i en sträng med namn=värde syntax. Användaren ansvarar för att skapa tjänsten och läsa meddelanden utanför kön. Standardvärdet är en tom sträng. |
Meddelandeprenumerationen har alltid checkats in. Det sker oavsett om -instruktionen kördes i en användartransaktion eller i autocommit eller om transaktionen där -instruktionen kördes eller återställdes. Servermeddelandet utlöses på något av följande ogiltiga meddelandevillkor: ändring av underliggande data eller schema, eller när tidsgränsen nås; beroende på vilket som är först.
Aviseringsregistreringar tas bort så snart de har utlösts. När du tar emot meddelanden måste programmet prenumerera igen om du vill få ytterligare uppdateringar.
En annan anslutning eller tråd kan kontrollera målkön för meddelanden. Till exempel:
WAITFOR (RECEIVE * FROM MyQueue); -- Where MyQueue is the queue name.
Not
SELECT *
tar inte bort posten från kön. Men RECEIVE * FROM
gör det. Detta stoppar en servertråd om kön är tom. Om det finns köposter vid tidpunkten för samtalet returneras de omedelbart. Annars väntar samtalet tills en köpost har gjorts.
RECEIVE * FROM MyQueue
Den här instruktionen returnerar omedelbart en tom resultatuppsättning om kön är tom. Annars returneras alla köaviseringar.
Om SSPROP_QP_NOTIFICATION_MSGTEXT
och SSPROP_QP_NOTIFICATION_OPTIONS
inte är null och inte tomma skickas TDS-rubriken för frågemeddelanden som innehåller de tre egenskaper som definierats ovan till servern. Det här huvudet skickas med varje körning av kommandot. Om någon av dem är null (eller tom) skickas inte rubriken och DB_E_ERRORSOCCURRED
genereras (eller DB_S_ERRORSOCCURRED
utlöses om egenskaperna båda är markerade som valfria). Statusvärdet anges sedan till DBPROPSTATUS_BADVALUE
. Verifieringen sker vid körning och förberedelse. På samma sätt utlöses DB_S_ERRORSOCCURRED
när frågemeddelandeegenskaperna anges för anslutningar till SQL Server-versioner före SQL Server 2005 (9.x). Statusvärdet i det här fallet är DBPROPSTATUS_NOTSUPPORTED
.
Att starta en prenumeration garanterar inte att framtida meddelanden levereras. Dessutom görs ingen kontroll av giltigheten för det angivna tjänstnamnet.
Not
Förberedelseinstruktioner gör aldrig att prenumerationen initieras. Endast instruktionskörning uppnår initiering. Frågemeddelanden påverkas inte av användningen av OLE DB-kärntjänster.
Mer information om egenskapsuppsättningen DBPROPSET_SQLSERVERROWSET
finns i Egenskaper och beteenden för raduppsättningar.