Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
A következőkre vonatkozik:SQL Server
Felügyelt Azure SQL-példány
Fontos
Natív SQL Server-ügyfél (SNAC) nem a következőkkel szállítható:
- SQL Server 2022 (16.x) és újabb verziók
- AZ SQL Server Management Studio 19- és újabb verziói
Az SQL Server natív ügyfele (SQLNCLI vagy SQLNCLI11) és az örökölt Microsoft OLE DB Provider for SQL Server (SQLOLEDB) nem ajánlott az új alkalmazásfejlesztéshez.
Új projektek esetén használja az alábbi illesztőprogramok egyikét:
Az SQL Server adatbázismotor összetevőjeként (2012–2019-ben) futó SQLNCLI esetében tekintse meg ezt a Támogatási életciklus kivétel.
A lekérdezési értesítések az SQL Server 2005 (9.x) és az SQL Server natív ügyfélprogramjában lettek bevezetve. Az SQL Server 2005 (9.x) rendszerben bevezetett Service Broker-infrastruktúrára épülő lekérdezési értesítések lehetővé teszik az alkalmazások értesítését az adatok módosításakor. Ez a funkció különösen hasznos az olyan alkalmazások esetében, amelyek egy adatbázisból, például egy webalkalmazásból származó információk gyorsítótárát biztosítják, és a forrásadatok módosításakor értesíteni kell.
A lekérdezési értesítések lehetővé teszik, hogy értesítést kérjen egy adott időtúllépési időszakon belül, amikor a lekérdezés alapjául szolgáló adatok megváltoznak. Az értesítési kérelem megadja az értesítési beállításokat, amelyek tartalmazzák a kiszolgáló szolgáltatásnevét, üzenetszövegét és időtúllépési értékét. Az értesítések egy Service Broker-üzenetsoron keresztül érkeznek, amelyet az alkalmazások lekérdezhetnek az elérhető értesítésekért.
A lekérdezési értesítések beállítási sztringjének szintaxisa a következő:
service=<service-name>[;(local database=<database> | broker instance=<broker instance>)]
Például:
service=mySSBService;local database=mydb
Az értesítési előfizetések túllépnek az őket kezdeményező folyamaton, mivel egy alkalmazás létrehozhat egy értesítési előfizetést, majd leállhat. Az előfizetés érvényes marad, és az értesítés akkor jelenik meg, ha az adatok az előfizetés létrehozásakor megadott időkorláton belül változnak. Az értesítéseket a végrehajtott lekérdezés, az értesítési beállítások és az üzenet szövege azonosítja, és az időtúllépési érték nullára állításával megszakítható.
Az értesítéseket csak egyszer küldi el a rendszer. Az adatváltozás folyamatos értesítéséhez új előfizetést kell létrehozni a lekérdezés ismételt végrehajtásával az egyes értesítések feldolgozása után.
Az SQL Server natív ügyfélalkalmazásai általában a Transact-SQL RECEIVE paranccsal fogadják az értesítéseket az értesítési beállításokban megadott szolgáltatáshoz társított üzenetsorból.
Jegyzet
A táblaneveket olyan lekérdezésekben kell minősíteni, amelyekhez értesítés szükséges, például dbo.myTable. A táblaneveket két résznévvel kell minősíteni. Az előfizetés érvénytelen, ha három- vagy négyrészes nevet használ.
Az értesítési infrastruktúra az SQL Server 2005-ben (9.x) bevezetett üzenetsor-kezelési funkcióra épül. A kiszolgálón generált értesítések általában ezeken az üzenetsorokon keresztül lesznek elküldve a későbbi feldolgozáshoz.
A lekérdezési értesítések használatához egy üzenetsornak és egy szolgáltatásnak kell léteznie a kiszolgálón. Ezek az alábbihoz hasonló Transact-SQL használatával hozhatók létre:
CREATE QUEUE myQueue
CREATE SERVICE myService ON QUEUE myQueue
([http://schemas.microsoft.com/SQL/Notifications/PostQueryNotification])
Jegyzet
A szolgáltatásnak az előre meghatározott szerződési http://schemas.microsoft.com/SQL/Notifications/PostQueryNotification kell használnia a fent látható módon.
SQL Server natív ügyféloldali OLE DB-szolgáltató
Az SQL Server natív ügyféloldali OLE DB-szolgáltatója támogatja a felhasználók értesítését a sorkészletek módosításáról. A fogyasztó értesítést kap a sorkészlet módosításának minden fázisáról és a módosítási kísérletekről.
Jegyzet
Értesítési lekérdezés továbbítása a kiszolgálónak ICommand::A végrehajtása az egyetlen érvényes módja annak, hogy feliratkozzon a lekérdezési értesítésekre az SQL Server natív ügyfél OLE DB-szolgáltatójával.
A DBPROPSET_SQLSERVERROWSET tulajdonságkészlet
Az OLE DB-n keresztüli lekérdezésértesítések támogatásához az SQL Server natív ügyfele a következő új tulajdonságokat adja hozzá a DBPROPSET_SQLSERVERROWSET tulajdonságkészlethez.
| Név | Típus | Leírás |
|---|---|---|
| SSPROP_QP_NOTIFICATION_TIMEOUT | VT_UI4 | Azon másodpercek száma, amikor a lekérdezésértesítés aktív marad. Az alapértelmezett érték 432000 másodperc (5 nap). A minimális érték 1 másodperc, a maximális érték pedig 2^31-1 másodperc. |
| SSPROP_QP_NOTIFICATION_MSGTEXT | VT_BSTR | Az értesítés üzenetszövege. Ez felhasználó által definiált, és nincs előre definiált formátuma. Alapértelmezés szerint a sztring üres. 1–2000 karakter hosszúságú üzenetet adhat meg. |
| SSPROP_QP_NOTIFICATION_OPTIONS | VT_BSTR | A lekérdezés értesítési beállításai. Ezek egy névvel=értékkel szintaxissal rendelkező sztringben vannak megadva. A felhasználó feladata a szolgáltatás létrehozása és az értesítések olvasása az üzenetsorból. Az alapértelmezett érték egy üres sztring. |
Az értesítési előfizetés mindig véglegesítve van, függetlenül attól, hogy az utasítás egy felhasználói tranzakcióban vagy automatikus véglegesítésben futott-e, vagy az a tranzakció, amelyben az utasítás lekötött vagy vissza lett állítva. A kiszolgáló értesítése a következő érvénytelen értesítési feltételek bármelyike esetén aktiválódik: a mögöttes adatok vagy séma módosítása, illetve az időtúllépési időszak elérése; amelyik az első. Az értesítési regisztrációk az aktiválásuk után azonnal törlődnek. Ezért az értesítések fogadásakor az alkalmazásnak újra elő kell fizetnie arra az esetre, ha további frissítéseket szeretne kapni.
Egy másik kapcsolat vagy szál ellenőrizheti a célsor értesítéseit. Például:
WAITFOR (RECEIVE * FROM MyQueue); // Where MyQueue is the queue name.
Vegye figyelembe, hogy a SELECT * nem törli a bejegyzést az üzenetsorból, a RECEIVE * FROM azonban igen. Ez elakad egy kiszolgálószálon, ha az üzenetsor üres. Ha a hívás időpontjában vannak üzenetsorbejegyzések, a rendszer azonnal visszaadja őket; ellenkező esetben a hívás megvárja az üzenetsor-bejegyzést.
RECEIVE * FROM MyQueue
Ez az utasítás azonnal üres eredményhalmazt ad vissza, ha az üzenetsor üres; ellenkező esetben az összes üzenetsor-értesítést visszaadja.
Ha SSPROP_QP_NOTIFICATION_MSGTEXT és SSPROP_QP_NOTIFICATION_OPTIONS nem NULL értékűek és nem üresek, a rendszer a fenti három tulajdonságot tartalmazó lekérdezésértesítési TDS-fejlécet küldi el a kiszolgálónak a parancs minden végrehajtásával. Ha bármelyikük null (vagy üres), a rendszer nem küldi el a fejlécet, és DB_E_ERRORSOCCURRED van emelve (vagy DB_S_ERRORSOCCURRED, ha a tulajdonságok nem kötelezőként vannak megjelölve), és az állapot értéke DBPROPSTATUS_BADVALUE. Az ellenőrzés végrehajtáskor/előkészítéskor történik. Hasonlóképpen, DB_S_ERRORSOCCURRED akkor jön létre, amikor a lekérdezésértesítési tulajdonságok be vannak állítva az SQL Server 2005 előtti SQL Server-verziókhoz való kapcsolatokhoz (9.x). Ebben az esetben az állapotérték DBPROPSTATUS_NOTSUPPORTED.
Az előfizetés kezdeményezése nem garantálja a későbbi üzenetek sikeres kézbesítését. Emellett nem történik ellenőrzés a megadott szolgáltatásnév érvényességét illetően.
Jegyzet
Az utasítások előkészítése soha nem eredményezi az előfizetés elindítását; ezt csak az utasítás végrehajtása éri el, és a lekérdezési értesítéseket nem érinti az OLE DB alapvető szolgáltatásainak használata.
A DBPROPSET_SQLSERVERROWSET tulajdonságkészlettel kapcsolatos további információkért lásd Sorhalmaz tulajdonságai és viselkedésecímű témakört.
SQL Server natív ügyfél ODBC-illesztőprogramja
Az SQL Server natív ügyfél ODBC-illesztőprogramja három új attribútum hozzáadásával támogatja a lekérdezési értesítéseket az SQLGetStmtAttr és SQLSetStmtAttr függvényekhez:
SQL_SOPT_SS_QUERYNOTIFICATION_MSGTEXT
SQL_SOPT_SS_QUERYNOTIFICATION_OPTIONS
SQL_SOPT_SS_QUERYNOTIFICATION_TIMEOUT
Ha SQL_SOPT_SS_QUERYNOTIFICATION_MSGTEXT és SQL_SOPT_SS_QUERYNOTIFICATION_OPTIONS nem NULL értékűek, a fenti három attribútumot tartalmazó lekérdezésértesítések TDS-fejlécét a rendszer minden alkalommal elküldi a kiszolgálónak a parancs végrehajtásakor. Ha bármelyikük null értékű, a rendszer nem küldi el a fejlécet, és SQL_SUCCESS_WITH_INFO lesz visszaadva. Az ellenőrzés SQLPrepare függvény, SqlExecDirectés SqlExecuteesetén történik, amelyek mindegyike sikertelen, ha az attribútumok érvénytelenek. Hasonlóképpen, ha ezek a lekérdezésértesítési attribútumok az SQL Server 2005 (9.x) előtti SQL Server-verziókhoz vannak beállítva, a végrehajtás SQL_SUCCESS_WITH_INFO meghiúsul.
Jegyzet
Az utasítások előkészítése soha nem eredményezi az előfizetés elindítását; előfizetést utasítás végrehajtásával lehet kezdeményezni.
Különleges esetek és korlátozások
Az értesítések esetében a következő adattípusok nem támogatottak:
szöveg
ntext
kép
Ha egy ilyen típusú lekérdezésre irányuló értesítési kérés történik, az értesítés azonnal aktiválódik, és megadja, hogy az értesítési előfizetés nem lehetséges.
Ha egy kötegre vagy tárolt eljárásra vonatkozó előfizetési kérést hajtanak végre, a rendszer külön előfizetési kérelmet küld a kötegen vagy a tárolt eljáráson belül végrehajtott minden egyes utasításhoz. Az EXECUTE utasítások nem regisztrálnak értesítést, hanem elküldik az értesítési kérelmet a végrehajtott parancsnak. Ha kötegről van szó, a környezet a végrehajtott utasításokra lesz alkalmazva, és a fent leírt szabályok érvényesek lesznek.
Egy olyan értesítési lekérdezés beküldése, amelyet ugyanaz a felhasználó adott adatbázis-környezetben küldött el, és ugyanazzal a sablonnal, ugyanazokkal a paraméterértékekkel, ugyanazzal az értesítési azonosítóval és egy meglévő aktív előfizetés ugyanazon kézbesítési helyével rendelkezik, megújítja a meglévő előfizetést, és alaphelyzetbe állítja az új megadott időtúllépést. Ez azt jelenti, hogy ha azonos lekérdezésekre vonatkozó értesítést kér, a rendszer csak egy értesítést küld. Ez vonatkozik egy kötegben duplikált lekérdezésre, vagy egy tárolt eljárásban lévő lekérdezésre, amelyet többször is meghívtak.