Zahteve za storitev OData
Gonilnik deluje z vsako storitvijo OData v4, ki podpira spodaj navedene obvezne lastnosti. Če storitev
dodatno podpira katero od razširitev, jo gonilnik uporabi; brez nje se vede, kot da je ni. To stran
potrebujete, ko preverjate, ali storitev deluje skupaj z gonilnikom, ali ko sami gradite storitev za
aplikacije Access. Podatkovni prehod Wkl.Data.Gateway podpira vse lastnosti, navedene na tej strani.
Sintaksa
GET <koren-storitve>/$metadata dokument metapodatkov (CSDL, XML) GET <koren-storitve>/<množica>?$select=…&$filter=… branje, odgovor JSON POST/PATCH/DELETE <koren-storitve>/<množica>[(<ključ>)] pisanje
Parametri
Lastnosti so razvrščene po tem, kako nujne so za gonilnik: brez obveznega za branje se gonilnik ne
poveže ali bere napačno; brez obveznega za pisanje ostanejo vse množice samo za branje;
razširitve so priporočila: brez njih posamezna funkcija ni na voljo, nič pa ne deluje napačno. Osnove OData
v4 opisujejo standardi OASIS:
OData Version 4.01 Part 1: Protocol,
Part 2: URL Conventions
(poizvedbene možnosti, literali), OData Common Schema Definition Language (CSDL) XML Representation 4.01
($metadata) in OData JSON Format 4.01.
Gonilnik zahteva samo lastnosti, ki jih pozna že OData 4.0; $query (4.01) uporabi, če obstaja.
Obvezno za branje
| Lastnost | Za kaj jo gonilnik potrebuje |
|---|---|
$metadata (CSDL) z množicami entitet, lastnostmi, tipi, faseti in ključi | funkcije kataloga, preslikava tipov (glejte Ubežne klavzule in podatkovni tipi) |
V $metadata samo množice entitet, odobrene za klicatelja | Access ponudi samo tabele, ki jih uporabnik sme tudi brati. To je varnostna zahteva za storitev, ne tehnična: gonilnik se poveže tudi brez nje, vendar v tem primeru prikaže tabele, katerih branje ne uspe |
$select, $filter, $orderby, $top, $skip | prevajanje SELECT |
V $filter literali OData v4 brez imen tipov, tudi za Edm.Guid (Id eq 3333…), in primerjave dveh lastnosti (ParentId eq Id) | pogoji za stolpce uniqueidentifier; koreni drevesnih struktur. Storitev brez primerjave polja s poljem odgovori 400, gonilnik javi 42000 – ne uspe samo ta en pogoj |
$count | COUNT(*) brez nalaganja vrstic |
@odata.nextLink | branje velikih množic po straneh |
Prefer: odata.maxpagesize (priporočeno) | večje strani, ko se berejo samo ozki stolpci, na primer ključi. Storitev, ki želje ne upošteva, vrne svojo velikost strani; gonilnik takrat prebere več strani, drugega se nič ne spremeni |
| Odgovori kot JSON | gonilnik ne bere Atom/XML |
Obvezno za pisanje
| Lastnost | Za kaj jo gonilnik potrebuje |
|---|---|
Ključ v tipu entitete in naslavljanje Množica(Ključ) | PATCH, DELETE (bere se prek $filter, nikoli prek naslova ključa); množica brez ključa je samo za branje (razen z dejanji za tabele brez ključa, spodaj) |
POST, PATCH, DELETE s telesom JSON; odgovor s shranjenim zapisom | ustvarjanje, spreminjanje, brisanje |
If-Match, odgovor 412 pri zastareli različici, deklaracija s Core.OptimisticConcurrency | prepoznavanje konfliktov pri pisanju; brez te deklaracije gonilnik spreminjanje in brisanje zavrne (ustvarjanje ostane mogoče). Gonilnik ETag tvori sam iz deklariranega stolpca (binarna vrednost kot W/"<Base64>"); storitev mora to obliko sprejeti, glejte Kaj gonilnik predpostavlja pri pisanju |
Razširitve (priporočene), ki jih gonilnik uporabi, če jih storitev podpira
| Lastnost | Po čem jo gonilnik prepozna | Za kaj |
|---|---|---|
Naslov za lastne stavke: sprejme {"sql": …, "parameters": {…}}, odgovori {"columns": […], "data": […], "affectedRowCount": …} | navede ga povezava (PASSTHROUGH) ali $metadata v Store.PassThrough | stavki, ki jih ni mogoče prevesti, prepustne poizvedbe |
Org.OData.Aggregation.V1.ApplySupported s transformacijami filter, compute, groupby, aggregate; Aggregation.CustomAggregationMethods z Wkl.Store.V1.count | deklaracija v $metadata | vsote, skupine, HAVING, DISTINCT brez lastnih stavkov; COUNT(stolpec) |
Vezani dejanji UpdateByOriginal in DeleteByOriginal na množici brez ključa | $metadata obe deklarira za tip množice | spreminjanje in brisanje prek starih vrednosti |
POST <vir>/$query z možnostmi poizvedbe v telesu (OData 4.01) | uporabljeno, takoj ko bi bil naslov daljši od MAXURLLENGTH; brez te oblike storitev odgovori 404, 405 ali 501, zahteva pa se nato vseeno pošlje kot GET | dolgi pogoji |
| Prijava prek HTTP Negotiate | povezava jo vklopi (AUTH=WINDOWS); storitev jo zahteva z 401 in WWW-Authenticate: Negotiate | prijava Windows brez gesel in ključev |
| Prijava prek HTTP Basic | povezava navaja UID in PWD | prijava z imenom in geslom |
| Ključ v glavi | APIKEY/APIKEYENV ali AUTH=KEY; glava APIKEYHEADER, privzeto X-Api-Key | ključi storitve in osebni ključi |
2FA: 401 z WWW-Authenticate: Wkl-Totp … endpoint="<pot>"; POST <pot> z {"code": "…"} vrne 201 s sejo | izziv v odgovoru | poizvedba po kodi, seja v glavi X-Wkl-Session |
Izbira identitete: glava X-Wkl-Role; zavrnitev 403 z X-Wkl-Roles (odstotno kodiran UTF-8, ločen z vejicami) | glava v odgovoru | izbira identitete podatkovne zbirke |
Idempotency-Key pri POST, PATCH, DELETE: ponovitev dobi shranjeni prvi odgovor | – (gonilnik ključ pošlje vedno) | ponovitev po prekinitvi povezave brez podvojenega zapisa |
Besednjak Wkl.Store.V1 (izrazi spodaj) | anotacije v $metadata | predstavitev kot izdelek podatkovne zbirke, shema kot TABLE_SCHEM, imena tipov, indeksi, statistika za načrtovanje v Accessu |
Transakcije: Store.Transactions na vsebniku entitet navaja naslov; POST nanj vrne 201 z {"id": "…"}; zahteve z glavo Wkl-Transaction: <id> se izvedejo v njej; POST <naslov>/<id>/commit oziroma /rollback jo zaključi (204); neznan ali končan identifikator 404, transakcija, ki jo je storitev razveljavila, 409 | anotacija v $metadata | BeginTrans/CommitTrans/Rollback, BeginTransaction; SQL_TXN_CAPABLE = SQL_TC_ALL |
Sporočila podatkovne zbirke v error.details zavrnitve: za vsak vnos code = številka sporočila kot besedilo, message, poleg tega sqlState (pet znakov) | vnosi s številom kot code | en diagnostični zapis na sporočilo s številko kot izvorno številko napake in navedenim SQLSTATE (če manjka: 42000), kot pri gonilniku SQL Serverja; brez takih vnosov en zapis s statusom HTTP kot številko |
Core.Computed | anotacija na lastnosti | stolpci, v katere ni mogoče pisati (identiteta, izračunan, različica vrstice); gonilnik jih prek SQLColAttribute (SQL_DESC_UPDATABLE) javi kot samo za branje, vse druge kot „neznano“ |
Izrazi besednjaka Wkl.Store.V1. Besednjak je razširitev tega izdelka, ni del OData. Storitev, ki
ga podpira, ga objavi pod lastnim naslovom in ga vključi z edmx:Reference (primer spodaj); gonilnik
izraze prepozna po imenskem prostoru, z aliasom ali brez.
| Izraz | Tip | Velja za | Pomen za gonilnik |
|---|---|---|---|
Product | Edm.String | vsebnik entitet | ime izdelka podatkovne zbirke, javljeno prek SQLGetInfo(SQL_DBMS_NAME); brez izraza gonilnik javi OData in različico 4.0 |
ProductVersion | Edm.String | vsebnik entitet | glavna in podrejena različica (17.00), javljena kot SQL_DBMS_VER v obliki 17.00.0000 |
Schema | Edm.String | vsebnik entitet | shema korena storitve, javljena kot TABLE_SCHEM; brez nje Access pri tabeli, povezani kot dbo.Tabelle, shrani prazno izvorno ime |
PassThrough | Edm.String | vsebnik entitet | naslov za lastne stavke; prevzet samo na istem izvoru kot koren storitve |
Transactions | Edm.String | vsebnik entitet | naslov, ki odpre transakcijo |
Type | Edm.String | lastnost | ime tipa podatkovne zbirke, pri samooštevilčenem stolpcu z identity |
Indexes | seznam Index (Name, Unique, Primary, Clustered, Columns) | tip entitete | indeksi za SQLStatistics |
Rows, Pages | Edm.Int64 | tip entitete | vrstice in podatkovne strani za SQLStatistics (CARDINALITY, PAGES); ocene |
Zaveze glede na vrsto storitve
Katera zaveza gonilnika velja, je odvisno od tega, kaj storitev podpira in upošteva. Gonilnik
prepozna deklaracije v $metadata, ne pa tega, ali storitev glavo, kot je Idempotency-Key, dejansko
upošteva. Česar ne more prepoznati, morate pred uporabo razjasniti s ponudnikom storitve ali
preveriti sami.
| Zaveza | poljubna storitev OData v4 z obveznimi lastnostmi | storitev z razširitvami te strani | podatkovni prehod Wkl.Data.Gateway |
|---|---|---|---|
| Branje, filtriranje, razvrščanje, štetje na storitvi | da | da | da |
| Pisanje s konfliktom pri pisanju | da, s Core.OptimisticConcurrency | da | da |
| Ponovitev branja po prekinitvi povezave | da | da | da |
| Ponovitev spremembe brez podvojenega zapisa | ne: gonilnik privzeto vseeno ponovi; storitev, ki Idempotency-Key prezre, lahko zapis ustvari dvakrat. Rešitev: RETRY=OFF | samo, če storitev glavo upošteva – gonilnik tega ne more prepoznati, preverite pri ponudniku | da: storitev si odgovor zapomni za deset minut v delovnem pomnilniku |
| Transakcije | ne (HYC00; DAO brez učinka) | s Store.Transactions | da |
| Vsote in skupine brez prepustne poti | ne | z Aggregation.ApplySupported | da |
| Stavki, ki jih ni mogoče prevesti | ne, 42000 | z naslovom prepustne poti | da: preverjeni stavki za vsakega klicatelja, katerega pravilo navaja alias; nepreverjeni SQL samo, če je izrecno omogočen |
| 2FA, izbira identitete | ne | z izzivi te strani | da |
Kaj mora storitev zagotoviti za ponovitev. Gonilnik spremembo ponovi največ dvakrat, po 1 in po
3 sekundah, z istim Idempotency-Key. Storitev mora zato prvi odgovor h ključu hraniti vsaj nekaj
sekund in na ponovitev vrniti natanko ta odgovor, ne da bi spremembo izvedla še enkrat. Prekoračene
časovne omejitve (HYT00) gonilnik ne ponovi: v tem primeru ni znano, ali je bila sprememba izvedena, zato
mora aplikacija zapis znova prebrati. Zaključka transakcije (commit, rollback) prav tako ne ponovi.
Kaj mora storitev zagotoviti iz varnostnih razlogov. Zahtevo brez veljavne prijave ali 2FA zavrne, preden karkoli izvede; gonilnik jo nato pošlje znova. Poleg tega naslovov pod korenom storitve ne sme preusmerjati na drug izvor (glejte Preostala tveganja).
Vrnjena vrednost
Nobena. Gonilnik lastnosti preverja ob povezovanju in ob posamezni uporabi, ne vnaprej.
Opombe
- Brez
Core.OptimisticConcurrencyAccess pri spreminjanju v pogoj postavi stare vrednosti vseh stolpcev. Tega v OData ni mogoče izraziti; gonilnik to zavrne, namesto da bi preverjanje opustil. Rešitev zagotovi storitev, na primer z izračunano lastnostjo sočasnosti. - Brez združevanja v skupine in brez naslova za lastne stavke poizvedbe z vsotami in spoji iz Accessa ne uspejo z „ODBC–call failed“; glejte Odpravljanje težav.
- Brez podpore za
Idempotency-Keylahko ponovitev po prekinitvi povezave zapis ustvari dvakrat ali javi konflikt pri pisanju, čeprav je sprememba uspela. Storitev, ki glave ne pozna, jo prezre; gonilnik tega ne prepozna. Glavo opisuje potekel osnutek IETF, ne standard (glejte Standardi in specifikacije). - Oblika lastnih stavkov pri prenosu. Gonilnik pošlje
{"sql": …, "parameters": {…}}in pričakuje{"columns": […], "data": […], "affectedRowCount": …}. Vezane vrednosti ostanejo vrednosti: označbe mest?, ki jih ODBC šteje po položaju, postanejo poimenovane označbe – vprašaj v nizu, v imenu v oklepajih ali v komentarju pri tem ostane nedotaknjen. Odgovor brezcolumnsse zavrne. Sklepanje o tipih iz vrednosti prve vrstice bi pomenilo: celo število v decimalnem stolpcu postane celo število, časovna točka postane besedilo, prazen rezultat pa sploh nima oblike – medtem ko aplikacija svoje medpomnilnike veže, preden prebere prvo vrstico. - Izhodni parametri, nadaljnji nizi rezultatov, opis. Če aplikacija veže izhodne parametre, gonilnik pošlje še
"outputs": {"p1": "Edm.Int32", "p2": {"type": "Edm.String", "maxLength": 20}}in vrednosti prebere izoutputsv odgovoru; nadaljnje nize rezultatov prebere izresults(vsak zcolumns,data,truncated). Če aplikacija pred izvedbo vpraša po stolpcih, gonilnik pošlje"describe": truein pričakuje stolpce prvega niza, ne da bi storitev kaj izvedla. Opis zahteva samo od storitve, ki naslov sama navede vStore.PassThrough: storitev, kidescribeprezre, bi stavek sicer izvedla. Če storitev ne vrneoutputs, aplikacija kot izhodno vrednost dobiNULL. - Opis stolpcev. Poleg
name,typein faset (maxLength,precision,scale) gonilnik za vsak stolpec prebere tri neobvezne podatke:storeType(ime tipa v podatkovni zbirki, kotStore.Typev$metadata),identity(trueza vrednost, ki jo dodeli podatkovna zbirka) inlabel(ime, ki ga stolpcu da podatkovna zbirka, kjer se razlikuje odname). Vrstice so predmeti JSON; za stolpec brez imena ali z že uporabljenim imenom mora storitev zato določiti lasten ključ. Zlabelgonilnik aplikaciji pokaže ime podatkovne zbirke – prazno ali ponovljeno, kot ODBC Driver 18 – vrednosti pa bere podname. Brezlabelaplikacija vidi ta ključ. Store.PassThroughvelja samo na istem izvoru (shema, računalnik, vrata) kot koren storitve.- Polja odgovora, ki jih gonilnik ne pozna, preskoči. Na prepustni poti bere
columns,data,affectedRowCount,truncated,resultsinoutputs(glejte Omejitve). - Brez preusmeritve na drug izvor. Gonilnik preusmeritvi sledi samo pri branju in samo pri isti shemi, računalniku in vratih; če storitev preusmeri drugam, se zahteva konča z napako
08S01.
Primer
Izsek dokumenta metapodatkov z razširitvami, ki jih Access potrebuje za urejanje in združevanje v skupine:
<edmx:Reference Uri="https://oasis-tcs.github.io/odata-vocabularies/vocabularies/Org.OData.Aggregation.V1.xml"> <edmx:Include Namespace="Org.OData.Aggregation.V1" Alias="Aggregation" /> </edmx:Reference> <edmx:Reference Uri="https://daten.example.com/odata/v4/$vocabulary/Wkl.Store.V1.xml"> <edmx:Include Namespace="Wkl.Store.V1" Alias="Store" /> </edmx:Reference> … <EntityContainer Name="Container"> <Annotation Term="Store.Product" String="Microsoft SQL Server" /> <Annotation Term="Store.ProductVersion" String="17.00" /> <Annotation Term="Store.Schema" String="dbo" /> <Annotation Term="Aggregation.ApplySupported"> <Record> <PropertyValue Property="Transformations"> <Collection><String>filter</String><String>compute</String><String>groupby</String><String>aggregate</String></Collection> </PropertyValue> <PropertyValue Property="Rollup" EnumMember="Aggregation.RollupType/None" /> </Record> </Annotation> <Annotation Term="Aggregation.CustomAggregationMethods"> <Collection><String>Wkl.Store.V1.count</String></Collection> </Annotation> </EntityContainer>
Tako ga vrne podatkovni prehod (skrajšano). Izrazi so zapisani z aliasom, ki ga dodeli
edmx:Reference; gonilnik bere oba zapisa.
Velja za
Gonilnik Wkl OData v 32- in 64-bitni različici. OData v2 in v3 ter storitve brez $metadata ali brez JSON
niso podprte.
Izjeme
| SQLSTATE | Pogoj |
|---|---|
42000 | stavka ni mogoče prevesti in ni naslova za lastne stavke |
HYC00 | aplikacija zahteva transakcijo, storitev pa je ne podpira (ni Store.Transactions) |
40001 | SQLEndTran s potrditvijo (Commit): storitev je transakcijo že razveljavila (po napaki, ki jo je naredila neuporabno, ali po svojem času nedejavnosti); nič iz transakcije ni shranjeno |
08S01 | storitev ni dosegljiva ali se odgovor prekine (na primer pretočni odgovor) |