Color scheme: Dark
You are here: start » sl » Dokumentacija » Integracija podatkov in dostop do podatkov » Gonilnik WKL OData ODBC » Referenčni priročnik gonilnika OData ODBC » Zahteve za storitev OData

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

LastnostZa kaj jo gonilnik potrebuje
$metadata (CSDL) z množicami entitet, lastnostmi, tipi, faseti in ključifunkcije kataloga, preslikava tipov (glejte Ubežne klavzule in podatkovni tipi)
V $metadata samo množice entitet, odobrene za klicateljaAccess 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, $skipprevajanje 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
$countCOUNT(*) brez nalaganja vrstic
@odata.nextLinkbranje 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 JSONgonilnik ne bere Atom/XML

Obvezno za pisanje

LastnostZa 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 zapisomustvarjanje, spreminjanje, brisanje
If-Match, odgovor 412 pri zastareli različici, deklaracija s Core.OptimisticConcurrencyprepoznavanje 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

LastnostPo čem jo gonilnik prepoznaZa kaj
Naslov za lastne stavke: sprejme {"sql": …, "parameters": {…}}, odgovori {"columns": […], "data": […], "affectedRowCount": …}navede ga povezava (PASSTHROUGH) ali $metadata v Store.PassThroughstavki, 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.countdeklaracija v $metadatavsote, 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žicespreminjanje 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 GETdolgi pogoji
Prijava prek HTTP Negotiatepovezava jo vklopi (AUTH=WINDOWS); storitev jo zahteva z 401 in WWW-Authenticate: Negotiateprijava Windows brez gesel in ključev
Prijava prek HTTP Basicpovezava navaja UID in PWDprijava z imenom in geslom
Ključ v glaviAPIKEY/APIKEYENV ali AUTH=KEY; glava APIKEYHEADER, privzeto X-Api-Keyključi storitve in osebni ključi
2FA: 401 z WWW-Authenticate: Wkl-Totp … endpoint="<pot>"; POST <pot> z {"code": "…"} vrne 201 s sejoizziv v odgovorupoizvedba 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 odgovoruizbira 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 $metadatapredstavitev 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, 409anotacija v $metadataBeginTrans/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 codeen 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.Computedanotacija na lastnostistolpci, 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.

IzrazTipVelja zaPomen za gonilnik
ProductEdm.Stringvsebnik entitetime izdelka podatkovne zbirke, javljeno prek SQLGetInfo(SQL_DBMS_NAME); brez izraza gonilnik javi OData in različico 4.0
ProductVersionEdm.Stringvsebnik entitetglavna in podrejena različica (17.00), javljena kot SQL_DBMS_VER v obliki 17.00.0000
SchemaEdm.Stringvsebnik entitetshema korena storitve, javljena kot TABLE_SCHEM; brez nje Access pri tabeli, povezani kot dbo.Tabelle, shrani prazno izvorno ime
PassThroughEdm.Stringvsebnik entitetnaslov za lastne stavke; prevzet samo na istem izvoru kot koren storitve
TransactionsEdm.Stringvsebnik entitetnaslov, ki odpre transakcijo
TypeEdm.Stringlastnostime tipa podatkovne zbirke, pri samooštevilčenem stolpcu z identity
Indexesseznam Index (Name, Unique, Primary, Clustered, Columns)tip entiteteindeksi za SQLStatistics
Rows, PagesEdm.Int64tip entitetevrstice 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.

Zavezapoljubna storitev OData v4 z obveznimi lastnostmistoritev z razširitvami te stranipodatkovni prehod Wkl.Data.Gateway
Branje, filtriranje, razvrščanje, štetje na storitvidadada
Pisanje s konfliktom pri pisanjuda, s Core.OptimisticConcurrencydada
Ponovitev branja po prekinitvi povezavedadada
Ponovitev spremembe brez podvojenega zapisane: gonilnik privzeto vseeno ponovi; storitev, ki Idempotency-Key prezre, lahko zapis ustvari dvakrat. Rešitev: RETRY=OFFsamo, če storitev glavo upošteva – gonilnik tega ne more prepoznati, preverite pri ponudnikuda: storitev si odgovor zapomni za deset minut v delovnem pomnilniku
Transakcijene (HYC00; DAO brez učinka)s Store.Transactionsda
Vsote in skupine brez prepustne potinez Aggregation.ApplySupportedda
Stavki, ki jih ni mogoče prevestine, 42000z naslovom prepustne potida: preverjeni stavki za vsakega klicatelja, katerega pravilo navaja alias; nepreverjeni SQL samo, če je izrecno omogočen
2FA, izbira identitetenez izzivi te stranida

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.OptimisticConcurrency Access 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-Key lahko 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 brez columns se 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 iz outputs v odgovoru; nadaljnje nize rezultatov prebere iz results (vsak z columns, data, truncated). Če aplikacija pred izvedbo vpraša po stolpcih, gonilnik pošlje "describe": true in pričakuje stolpce prvega niza, ne da bi storitev kaj izvedla. Opis zahteva samo od storitve, ki naslov sama navede v Store.PassThrough: storitev, ki describe prezre, bi stavek sicer izvedla. Če storitev ne vrne outputs, aplikacija kot izhodno vrednost dobi NULL.
  • Opis stolpcev. Poleg name, type in faset (maxLength, precision, scale) gonilnik za vsak stolpec prebere tri neobvezne podatke: storeType (ime tipa v podatkovni zbirki, kot Store.Type v $metadata), identity (true za vrednost, ki jo dodeli podatkovna zbirka) in label (ime, ki ga stolpcu da podatkovna zbirka, kjer se razlikuje od name). Vrstice so predmeti JSON; za stolpec brez imena ali z že uporabljenim imenom mora storitev zato določiti lasten ključ. Z label gonilnik aplikaciji pokaže ime podatkovne zbirke – prazno ali ponovljeno, kot ODBC Driver 18 – vrednosti pa bere pod name. Brez label aplikacija vidi ta ključ.
  • Store.PassThrough velja 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, results in outputs (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

SQLSTATEPogoj
42000stavka ni mogoče prevesti in ni naslova za lastne stavke
HYC00aplikacija zahteva transakcijo, storitev pa je ne podpira (ni Store.Transactions)
40001SQLEndTran 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
08S01storitev ni dosegljiva ali se odgovor prekine (na primer pretočni odgovor)

Glejte tudi

sl/wiki/data-conectivity/odata-odbc/reference/requirements-for-the-service.txt · Last modified: by Wolfgang van der Stille