Erweiterte Datenbankobjekte im Daten-API-Generator
Der Daten-API-Generator enthält Unterstützung für Ansichten und gespeicherte Prozeduren als Alternativen zur Zuordnung zu Datenbanktabellen oder -containern. Diese unterschiedlichen Datenbankobjekte erfordern eine benutzerdefinierte Konfiguration, um REST- oder GraphQL-Endpunkten nahtlos zuzuordnen. Für die Verwendung des Daten-API-Generators mit Ansichten und gespeicherten Prozeduren ist eine benutzerdefinierte Konfiguration erforderlich.
Dieser Artikel enthält eine Aufschlüsselung der Verwendung von Ansichten und gespeicherten Prozeduren mit dem Daten-API-Generator.
Ansichten
Ansichten können ähnlich wie eine Tabelle im Daten-API-Generator verwendet werden. Die Ansichtsverwendung muss durch Angeben des Quelltyps für die Entität als view
definiert werden. Außerdem muss die key-fields
-Eigenschaft bereitgestellt werden, damit der Daten-API-Generator weiß, wie es bei Bedarf ein einzelnes Element identifizieren und zurückgeben kann.
Wenn Sie über eine Ansicht verfügen, z. B. dbo.vw_books_details
sie mithilfe des folgenden dab
Befehls verfügbar gemacht werden kann:
dab add BookDetail --source dbo.vw_books_details --source.type View --source.key-fields "id" --permissions "anonymous:read"
Hinweis
--source.key-fields
ist für Ansichten beim Generieren der Konfiguration über die CLI obligatorisch.
Die dab-config.json
Datei würde wie im folgenden Beispiel aussehen:
"BookDetail": {
"source": {
"type": "view",
"object": "dbo.vw_books_details",
"key-fields": [ "id" ]
},
"permissions": [{
"role": "anonymous",
"actions": [ "read" ]
}]
}
Hinweis
Beachten Sie, dass Sie die Berechtigung entsprechend konfigurieren sollten, damit die Ansicht aktualisierbar ist oder nicht. Wenn eine Ansicht nicht aktualisierbar ist, sollten Sie nur einen Lesezugriff auf die Entität basierend auf dieser Ansicht zulassen.
REST-Unterstützung für Ansichten
Eine Ansicht verhält sich aus REST-Sicht wie eine Tabelle. Alle REST-Vorgänge werden unterstützt.
GraphQL-Unterstützung für Ansichten
Eine Ansicht aus GraphQL-Perspektive verhält sich wie eine Tabelle. Alle GraphQL-Vorgänge werden unterstützt.
Gespeicherte Prozeduren
Gespeicherte Prozeduren können als Objekte verwendet werden, die mit Entitäten zusammenhängen, die vom Daten-API-Generator verfügbar gemacht werden. Die Verwendung der gespeicherten Prozedur muss definiert werden, um anzugeben, dass der Quelltyp für die Entität stored-procedure
ist.
Hinweis
Der Daten-API-Generator unterstützt gespeicherte Prozeduren für relationale Datenbanken (d. h. MSSQL), aber nicht für nicht relationale Datenbanken (d. h. NoSQL).
Wenn Sie über eine gespeicherte Prozedur verfügen, z. B. dbo.stp_get_all_cowritten_books_by_author
kann sie mithilfe des folgenden dab
Befehls verfügbar gemacht werden:
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"
Die dab-config.json
Datei würde wie im folgenden Beispiel aussehen:
"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" ]
}]
}
Die parameters
definiert, welche Parameter verfügbar gemacht werden sollen, und stellt außerdem Standardwerte bereit, die an die Gespeicherten Prozedurparameter übergeben werden sollen, wenn diese Parameter nicht in der HTTP-Anforderung bereitgestellt werden.
Einschränkungen
- Nur das erste von der gespeicherten Prozedur zurückgegebene Resultset wird vom Daten-API-Generator verwendet.
- Nur die gespeicherten Prozeduren, deren Metadaten für das erste durch
sys.dm_exec_describe_first_result_set
beschriebene Resultset unterstützt werden. - Für REST- und GraphQL-Endpunkte: Wenn sowohl in der Konfigurationsdatei als auch in der URL-Abfragezeichenfolge ein gespeicherter Prozedurparameter angegeben wird, hat der Parameter in der URL-Abfragezeichenfolge Vorrang.
- Entitäten, die von einer gespeicherten Prozedur unterstützt werden, verfügen nicht über alle Funktionen, die automatisch für Entitäten bereitgestellt werden, die von Tabellen, Sammlungen oder Ansichten unterstützt werden.
- Gespeicherte Prozeduren unterstützen keine Paginierung, Sortierung oder Filterung. Diese Entitäten unterstützen auch die Rückgabe von Elementen, die durch Primärschlüsselwerte angegeben wurden.
- Autorisierungsregeln auf Feld-/Parameterebene werden nicht unterstützt.
REST-Unterstützung für gespeicherte Prozeduren
Das REST-Endpunktverhalten für gespeicherte, gesicherte Prozeduren kann so konfiguriert werden, dass ein oder mehrere HTTP-Verben (GET, POST, PUT, PATCH, DELETE) unterstützt werden. Der REST-Abschnitt der Entität würde wie im folgenden Beispiel aussehen:
"rest": {
"methods": [ "GET", "POST" ]
}
Alle REST-Anforderungen für die Entität schlagen mit HTTP 405-Methode nicht zulässig fehl, wenn eine in der Konfiguration nicht aufgeführte HTTP-Methode verwendet wird. Das Ausführen einer PUT-Anforderung schlägt z. B. mit dem Fehlercode 405 fehl.
Wenn der abschnitt methods
aus der REST-Konfiguration der Entität ausgeschlossen wird, wird die Standardmethode POST- abgeleitet. Um den REST-Endpunkt für diese Entität zu deaktivieren, konfigurieren Sie "rest": false
und alle REST-Anforderungen für die gespeicherte Prozedurenentität schlägt mit HTTP 404 Not Foundfehl.
Wenn die gespeicherte Prozedur Parameter akzeptiert, können die Parameter beim Aufrufen des REST-Endpunkts mit dem GET
HTTP-Verb in der URL-Abfragezeichenfolge übergeben werden. Zum Beispiel:
GET http://<dab-server>/api/GetCowrittenBooksByAuthor?author=isaac%20asimov
Gespeicherte Prozeduren, die mit anderen HTTP-Verben wie POST, PUT, PATCH, DELETE ausgeführt werden, erfordern die Übergabe von Parametern als JSON im Anforderungstext. Zum Beispiel:
POST http://<dab-server>/api/GetCowrittenBooksByAuthor
{
"author": "isaac asimov"
}
GraphQL-Unterstützung für gespeicherte Prozeduren
Die Ausführung gespeicherter Prozeduren in GraphQL kann mithilfe der Option graphql
einer gespeicherten Entität konfiguriert werden. Durch das explizite Festlegen des Vorgangs der Entität können Sie eine gespeicherte Prozedur im GraphQL-Schema auf eine Weise darstellen, die sich an das Verhalten der gespeicherten Prozedur richtet.
Hinweis
GraphQL-erfordert, dass ein Query-Element im Schema vorhanden ist. Wenn Sie nur gespeicherte Prozeduren verfügbar machen, stellen Sie sicher, dass mindestens eine davon die query
Operation unterstützt, andernfalls erhalten Sie einen GraphQL-Fehler wie The object type Query has to at least define one field in order to be valid.
Das Festlegen eines Werts für den Vorgang führt zur Erstellung eines mutation
Vorgangs.
Beispielsweise führt die Verwendung des Werts query
für die option operation
dazu, dass die gespeicherte Prozedur als Abfragefeld im GraphQL-Schema aufgelöst wird.
CLI-Verwendung:
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"
Laufzeitkonfiguration:
"graphql": {
"operation": "query"
}
GraphQL-Schemakomponenten: Typ und Abfragefeld:
type GetCowrittenBooksByAuthor {
id: Int!
title: String
}
Im Schema haben sowohl Abfrage- als auch Mutationsvorgänge für gespeicherte Prozeduren execute
als Präfix. Für die vorherige gespeicherte Prozedur würde das generierte Feld für den exakten Abfragenamen executeGetCowrittenBooksByAuthor
. Der generierte GraphQL-Typ lautet:
type Query {
executeGetCowrittenBooksByAuthor(
searchType: String = "S"
): [GetCowrittenBooksByAuthor!]!
}
Alternativ kann operation
auf mutation
festgelegt werden, sodass ein Mutationsfeld die gespeicherte Prozedur im GraphQL-Schema darstellt. Der Befehl dab update
kann verwendet werden, um die operation
zu ändern:
dab update GetCowrittenBooksByAuthor --graphql.operation "mutation"
Laufzeitkonfiguration:
"graphql": {
"operation": "mutation"
}
Das generierte GraphQL-Schema lautet:
type Mutation {
executeGetCowrittenBooksByAuthor(
searchType: String = "S"
): [GetCowrittenBooksByAuthor!]!
}
Wenn die gespeicherte Prozedur Parameter akzeptiert, können diese Parameter als Parameter der Abfrage oder Mutation übergeben werden. Zum Beispiel:
query {
executeGetCowrittenBooksByAuthor(author:"asimov")
{
id
title
pages
year
}
}