Расширенные объекты базы данных в построителе API данных
Построитель API данных включает поддержку представлений и хранимых процедур в качестве альтернативы сопоставлению с таблицами баз данных или контейнерами. Эти отдельные объекты базы данных требуют настраиваемой конфигурации, чтобы легко сопоставляться с конечными точками REST или GraphQL. Для использования построителя данных с представлениями и хранимыми процедурами требуется определенная настраиваемая конфигурация.
В этой статье описано, как использовать представления и хранимые процедуры с построителем API данных.
Представления
Представления можно использовать аналогично тому, как таблицу можно использовать в построителе API данных. Просмотр использования должен определяться путем указания исходного типа для сущности как view
. Наряду с этим необходимо предоставить свойство key-fields
, чтобы построитель данных знал, как он может определять и возвращать один элемент при необходимости.
Если у вас есть представление, например dbo.vw_books_details
его можно предоставить с помощью следующей команды dab
:
dab add BookDetail --source dbo.vw_books_details --source.type View --source.key-fields "id" --permissions "anonymous:read"
Примечание
--source.key-fields
является обязательным для представлений при создании конфигурации с помощью интерфейса командной строки.
Файл dab-config.json
будет похож на следующий пример:
"BookDetail": {
"source": {
"type": "view",
"object": "dbo.vw_books_details",
"key-fields": [ "id" ]
},
"permissions": [{
"role": "anonymous",
"actions": [ "read" ]
}]
}
Примечание
Обратите внимание, что необходимо настроить разрешение соответствующим образом с возможностью обновления представления или не. Если представление не является обновляемым, необходимо разрешить доступ только для чтения к сущности на основе этого представления.
Поддержка REST для представлений
Представление с точки зрения REST ведет себя как таблица. Поддерживаются все операции REST.
Поддержка GraphQL для представлений
Представление с точки зрения GraphQL ведет себя как таблица. Поддерживаются все операции GraphQL.
Хранимые процедуры
Хранимые процедуры можно использовать в качестве объектов, связанных с сущностями, предоставляемыми построителем API данных. Использование хранимой процедуры должно быть определено, указывая, что исходный тип для сущности stored-procedure
.
Примечание
Построитель данных поддерживает хранимые процедуры для реляционных баз данных (т. е. MSSQL), но не для нереляционных баз данных (т. е. NoSQL).
Если у вас есть хранимая процедура, например dbo.stp_get_all_cowritten_books_by_author
ее можно предоставить с помощью следующей команды dab
:
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"
Файл dab-config.json
будет похож на следующий пример:
"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
определяет, какие параметры следует предоставлять, а также предоставляет значения по умолчанию, передаваемые в параметры хранимой процедуры, если эти параметры не указаны в HTTP-запросе.
Ограничения
- В построителе данных используется только первый результирующий набор, возвращаемый хранимой процедурой.
- Поддерживаются только те хранимые процедуры, метаданные которых для первого результирующий набор, описанный
sys.dm_exec_describe_first_result_set
. - Для конечных точек REST и GraphQL: если параметр хранимой процедуры указан как в файле конфигурации, так и в строке запроса URL-адреса параметр в строке запроса URL-адреса имеет приоритет.
- Сущности, поддерживаемые хранимой процедурой, не имеют всех возможностей, которые автоматически предоставляются для сущностей, поддерживаемых таблицами, коллекциями или представлениями.
- Хранимые сущности, поддерживаемые хранимой процедурой, не поддерживают разбиение на страницы, упорядочивание или фильтрацию. Такие сущности не поддерживают возврат элементов, указанных значениями первичного ключа.
- Правила авторизации уровня полей и параметров не поддерживаются.
Поддержка REST для хранимых процедур
Поведение конечной точки REST для хранимой процедуры резервной сущности можно настроить для поддержки одной или нескольких http-команд (GET, POST, PUT, PATCH, DELETE). В разделе REST сущности будет показан следующий пример:
"rest": {
"methods": [ "GET", "POST" ]
}
Все запросы REST для сущности завершаются сбоем методе HTTP 405 not Allowed, если используется метод HTTP, не указанный в конфигурации. Например, выполнение запроса PUT завершается ошибкой с кодом ошибки 405.
Если раздел methods
исключен из конфигурации REST сущности, метод по умолчанию POST выводится. Чтобы отключить конечную точку REST для этой сущности, настройте "rest": false
и все запросы REST в сущности хранимой процедуры завершается ошибкой с HTTP 404 Not Found.
Если хранимая процедура принимает параметры, параметры можно передать в строке запроса URL-адреса при вызове конечной точки REST с помощью команды HTTP GET
. Например:
GET http://<dab-server>/api/GetCowrittenBooksByAuthor?author=isaac%20asimov
Хранимые процедуры, выполняемые с помощью других http-команд, таких как POST, PUT, PATCH, DELETE, требуют передачи параметров в виде JSON в тексте запроса. Например:
POST http://<dab-server>/api/GetCowrittenBooksByAuthor
{
"author": "isaac asimov"
}
Поддержка GraphQL для хранимых процедур
Выполнение хранимой процедуры в GraphQL можно настроить с помощью graphql
параметра резервной сущности хранимой процедуры. Явно устанавливая операцию сущности, можно представить хранимую процедуру в схеме GraphQL таким образом, чтобы она соответствовала поведению хранимой процедуры.
Примечание
Для GraphQL в схеме требуется элемент Query. Если вы используете только хранимые процедуры, убедитесь, что у вас есть хотя бы одна из них, поддерживающая операцию query
, в противном случае вы получите ошибку GraphQL, например The object type Query has to at least define one field in order to be valid.
При создании операции mutation
не задано какое-либо значение.
Например, использование значения query
для параметра operation
приводит к разрешению хранимой процедуры в виде поля запроса в схеме GraphQL.
Использование ИНТЕРФЕЙСА командной строки:
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"
Конфигурация среды выполнения:
"graphql": {
"operation": "query"
}
Компоненты схемы GraphQL: тип и поле запроса:
type GetCowrittenBooksByAuthor {
id: Int!
title: String
}
В схеме операции запроса и изменения для хранимых процедур execute
в качестве префикса. Для предыдущей хранимой процедуры будет создано точное поле имени запроса executeGetCowrittenBooksByAuthor
. Созданный тип GraphQL:
type Query {
executeGetCowrittenBooksByAuthor(
searchType: String = "S"
): [GetCowrittenBooksByAuthor!]!
}
Кроме того, operation
можно задать для mutation
, чтобы поле мутации представляло хранимую процедуру в схеме GraphQL. Команду dab update
можно использовать для изменения operation
:
dab update GetCowrittenBooksByAuthor --graphql.operation "mutation"
Конфигурация среды выполнения:
"graphql": {
"operation": "mutation"
}
Созданная схема GraphQL:
type Mutation {
executeGetCowrittenBooksByAuthor(
searchType: String = "S"
): [GetCowrittenBooksByAuthor!]!
}
Если хранимая процедура принимает параметры, эти параметры можно передать в качестве параметра запроса или мутации. Например:
query {
executeGetCowrittenBooksByAuthor(author:"asimov")
{
id
title
pages
year
}
}
Связанное содержимое
- Справочник по конфигурации
- установить CLI