Expanderade databasobjekt i Data API Builder
Data API Builder innehåller stöd för vyer och lagrade procedurer som alternativ till mappning till databastabeller eller containrar. Dessa distinkta databasobjekt kräver anpassad konfiguration för att smidigt mappa till REST- eller GraphQL-slutpunkter. Viss anpassad konfiguration krävs för att använda Data API Builder med vyer och lagrade procedurer.
Den här artikeln innehåller en översikt över hur du använder både vyer och lagrade procedurer med Data API Builder.
Visningar
Vyer kan användas på liknande sätt som en tabell kan användas i Data API Builder. Visa användning måste definieras genom att ange källtypen för entiteten som view
. Tillsammans med det måste egenskapen key-fields
anges, så att Data API-byggare vet hur den kan identifiera och returnera ett enda objekt om det behövs.
Om du har en vy, till exempel dbo.vw_books_details
den kan exponeras med hjälp av följande dab
kommando:
dab add BookDetail --source dbo.vw_books_details --source.type View --source.key-fields "id" --permissions "anonymous:read"
Observera
--source.key-fields
är obligatoriskt för vyer vid generering av konfiguration via CLI.
Filen dab-config.json
skulle se ut som i följande exempel:
"BookDetail": {
"source": {
"type": "view",
"object": "dbo.vw_books_details",
"key-fields": [ "id" ]
},
"permissions": [{
"role": "anonymous",
"actions": [ "read" ]
}]
}
Observera
Observera att bör du konfigurera behörigheten i enlighet med vyns möjlighet att vara uppdaterbar eller inte. Om en vy inte är uppdaterad bör du endast tillåta läsåtkomst till entiteten baserat på den vyn.
REST-stöd för vyer
En vy, ur ett REST-perspektiv, fungerar som en tabell. Alla REST-åtgärder stöds.
GraphQL-stöd för vyer
En vy, ur ett GraphQL-perspektiv, fungerar som en tabell. Alla GraphQL-åtgärder stöds.
Lagrade procedurer
Lagrade procedurer kan användas som objekt som är relaterade till entiteter som exponeras av Data API Builder. Användning av lagrad procedur måste definieras som anger att källtypen för entiteten är stored-procedure
.
Observera
Data API Builder stöder lagrade procedurer för relationsdatabaser (t.ex. MSSQL), men inte för icke-relationsdatabaser (dvs. NoSQL).
Om du har en lagrad procedur, till exempel dbo.stp_get_all_cowritten_books_by_author
kan den exponeras med hjälp av följande dab
kommando:
dab add GetCowrittenBooksByAuthor --source dbo.stp_get_all_cowritten_books_by_author --source.type "stored-procedure" --source.params "searchType:s" --permissions "anonymous:execute" --rest.methods "get" --graphql.operation "query"
Filen dab-config.json
skulle se ut som i följande exempel:
"GetCowrittenBooksByAuthor": {
"source": {
"type": "stored-procedure",
"object": "dbo.stp_get_all_cowritten_books_by_author",
"parameters": {
"searchType": "s"
}
},
"rest": {
"methods": [ "GET" ]
},
"graphql": {
"operation": "query"
},
"permissions": [{
"role": "anonymous",
"actions": [ "execute" ]
}]
}
parameters
definierar vilka parametrar som ska exponeras och tillhandahåller även standardvärden som ska skickas till parametrarna för lagrad procedur, om dessa parametrar inte anges i HTTP-begäran.
Begränsningar
- Endast den första resultatuppsättningen som returneras av den lagrade proceduren används av Data API Builder.
- Endast de lagrade procedurer vars metadata för den första resultatuppsättningen som beskrivs av
sys.dm_exec_describe_first_result_set
stöds. - För både REST- och GraphQL-slutpunkter: när en lagrad procedurparameter anges både i konfigurationsfilen och i URL-frågesträngen har parametern i URL-frågesträngen företräde.
- Entiteter som backas upp av en lagrad procedur har inte alla funktioner som automatiskt tillhandahålls för entiteter som backas upp av tabeller, samlingar eller vyer.
- Lagrade procedurstödda entiteter stöder inte sidnumrering, ordning eller filtrering. Sådana entiteter stöder inte heller returnering av objekt som anges av primärnyckelvärden.
- Auktoriseringsregler på fält-/parameternivå stöds inte.
REST-stöd för lagrade procedurer
REST-slutpunktsbeteendet, för en lagrad procedurstödd entitet, kan konfigureras för att stödja ett eller flera HTTP-verb (GET, POST, PUT, PATCH, DELETE). REST-avsnittet i entiteten skulle se ut som i följande exempel:
"rest": {
"methods": [ "GET", "POST" ]
}
Rest-begäranden för entiteten misslyckas med HTTP 405-metoden tillåts inte när en HTTP-metod som inte anges i konfigurationen används. Det går till exempel inte att köra en PUT-begäran med felkoden 405.
Om avsnittet methods
undantas från entitetens REST-konfiguration härleds standardmetoden POST-. Om du vill inaktivera REST-slutpunkten för den här entiteten konfigurerar du "rest": false
och eventuella REST-begäranden på den lagrade proceduren misslyckas med HTTP 404 Hittades inte.
Om den lagrade proceduren accepterar parametrar kan parametrarna skickas i URL-frågesträngen när du anropar REST-slutpunkten med GET
HTTP-verb. Till exempel:
GET http://<dab-server>/api/GetCowrittenBooksByAuthor?author=isaac%20asimov
Lagrade procedurer som körs med andra HTTP-verb som POST, PUT, PATCH, DELETE kräver att parametrar skickas som JSON i begärandetexten. Till exempel:
POST http://<dab-server>/api/GetCowrittenBooksByAuthor
{
"author": "isaac asimov"
}
GraphQL-stöd för lagrade procedurer
Lagrad procedurkörning i GraphQL kan konfigureras med hjälp av alternativet graphql
för en lagrad procedur som backas upp. När du uttryckligen anger åtgärden för entiteten kan du representera en lagrad procedur i GraphQL-schemat på ett sätt som överensstämmer med beteendet för den lagrade proceduren.
Observera
GraphQL-kräver att ett frågeelement finns i schemat. Om du bara exponerar lagrade procedurer måste du ha minst en av dem som stöder query
-åtgärden, annars får du ett GraphQL-fel som The object type Query has to at least define one field in order to be valid.
Om du inte anger något värde för åtgärden skapas en mutation
åtgärd.
Om du till exempel använder värdet query
för alternativet operation
resulterar det i att den lagrade proceduren matchas som ett frågefält i GraphQL-schemat.
CLI-användning:
dab add GetCowrittenBooksByAuthor --source dbo.stp_get_all_cowritten_books_by_author --source.type "stored-procedure" --source.params "searchType:s" --permissions "anonymous:execute" --rest.methods "GET" --graphql.operation "query"
Körningskonfiguration:
"graphql": {
"operation": "query"
}
GraphQL-schemakomponenter: typ och frågefält:
type GetCowrittenBooksByAuthor {
id: Int!
title: String
}
I schemat har både fråge- och mutationsåtgärder för lagrade procedurer execute
som prefix. För den tidigare lagrade proceduren skulle det exakta frågenamnsfältet som genererades vara executeGetCowrittenBooksByAuthor
. Den GraphQL-typ som genereras är:
type Query {
executeGetCowrittenBooksByAuthor(
searchType: String = "S"
): [GetCowrittenBooksByAuthor!]!
}
Alternativt kan operation
anges till mutation
så att ett mutationsfält representerar den lagrade proceduren i GraphQL-schemat. Kommandot dab update
kan användas för att ändra operation
:
dab update GetCowrittenBooksByAuthor --graphql.operation "mutation"
Körningskonfiguration:
"graphql": {
"operation": "mutation"
}
GraphQL-schemat som genereras är:
type Mutation {
executeGetCowrittenBooksByAuthor(
searchType: String = "S"
): [GetCowrittenBooksByAuthor!]!
}
Om den lagrade proceduren accepterar parametrar kan dessa parametrar skickas som parameter för frågan eller mutationen. Till exempel:
query {
executeGetCowrittenBooksByAuthor(author:"asimov")
{
id
title
pages
year
}
}