데이터베이스 엔터티에 대한 구성 설정입니다.
Health
| Property | Description |
|---|---|
entities.entity-name.health.enabled |
엔터티에 대한 상태 검사를 사용하도록 설정합니다(REST 및 GraphQL 엔드포인트 모두). |
entities.entity-name.health.first |
상태 검사 쿼리에서 반환된 행 수(범위: 1-500) |
entities.entity-name.health.threshold-ms |
상태 검사 쿼리의 최대 기간(밀리초)(최소: 1) |
Source
| Property | Description |
|---|---|
entities.entity-name.source.type |
개체 형식: table, view또는 stored-procedure |
entities.entity-name.source.object |
데이터베이스 개체의 이름 |
entities.entity-name.source.parameters |
저장 프로시저 또는 함수에 대한 매개 변수 |
entities.entity-name.source.key-fields |
보기에 대한 기본 키 필드 목록 |
entities.entity-name.mappings |
데이터베이스 열에 API 필드 이름 매핑 |
REST
| Property | Description |
|---|---|
entities.entity-name.rest.enabled |
이 엔터티에 REST를 사용하도록 설정 |
entities.entity-name.rest.path |
REST 엔드포인트에 대한 사용자 지정 경로 |
entities.entity-name.rest.methods |
허용되는 REST 메서드: get, post, putpatchdelete |
GraphQL
| Property | Description |
|---|---|
entities.entity-name.graphql.type |
다음을 사용하여 singular 이름 또는 개체를 입력합니다. plural |
entities.entity-name.graphql.operation |
작업 유형: query 또는 mutation |
entities.entity-name.graphql.enabled |
이 엔터티에 대해 GraphQL을 사용하도록 설정 |
Permissions
| Property | Description |
|---|---|
entities.entity-name.permissions[].role |
역할 이름 문자열 |
entities.entity-name.permissions[].actions |
하나 이상의 : create, read, update, deleteexecute |
Relationships
| Property | Description |
|---|---|
entities.entity-name.relationships.relationship-name.cardinality |
one 또는 many |
entities.entity-name.relationships.relationship-name.target.entity |
대상 엔터티의 이름 |
entities.entity-name.relationships.relationship-name.source.fields |
관계에 사용되는 이 엔터티의 필드 |
entities.entity-name.relationships.relationship-name.target.fields |
대상 엔터티의 필드 |
entities.entity-name.relationships.relationship-name.linking.object |
다 대 다 관계에 사용되는 조인 개체 |
entities.entity-name.relationships.relationship-name.linking.source.fields |
조인에 사용되는 원본 엔터티의 필드 |
entities.entity-name.relationships.relationship-name.linking.target.fields |
조인에 사용되는 대상 엔터티의 필드 |
Cache
| Property | Description |
|---|---|
entities.entity-name.cache.enabled |
엔터티에 대한 응답 캐싱을 사용하도록 설정합니다. |
entities.entity-name.cache.ttl-seconds |
캐시 TL(Time-to-Live) (초) |
형식 개요
{
"entities": {
"{entity-name}": {
"rest": {
"enabled": <boolean> // default: true
"path": <string> // default: "{entity-name}"
"methods": ["GET", "POST"] // default: ["GET", "POST"]
},
"graphql": {
"enabled": <boolean> // default: true
"type": {
"singular": <string>,
"plural": <string>
},
"operation": "query" | "mutation" // default: "query"
},
"source": {
"object": <string>,
"type": "view" | "stored-procedure" | "table",
"key-fields": [<string>], // primary keys for the view
"parameters": { // only for stored-procedure
"<parameter-name>": <default-value>,
"<parameter-name>": <default-value>
}
},
"mappings": {
"<database-field-name>": <string>
},
"relationships": {
"<relationship-name>": {
"cardinality": "one" | "many",
"target.entity": <string>,
"source.fields": [<string>],
"target.fields": [<string>],
"linking.object": <string>,
"linking.source.fields": [<string>],
"linking.target.fields": [<string>]
}
},
"permissions": [
{
"role": "anonymous" | "authenticated" | <custom-role>,
"actions": ["create", "read", "update", "delete", "execute", "*"],
"fields": {
"include": [<string>],
"exclude": [<string>]
},
"policy": {
"database": <string>
}
}
]
}
}
}
원본(엔터티 이름 엔터티)
| Parent | Property | Type | Required | Default |
|---|---|---|---|---|
entities.{entity-name} |
source |
object | ✔️ 예 | None |
엔터티의 데이터베이스 원본 세부 정보입니다.
중첩 속성
| Parent | Property | Type | Required | Default |
|---|---|---|---|---|
entities.{entity-name}.source |
object |
string | ✔️ 예 | None |
entities.{entity-name}.source |
type |
enum (table, view, stored-procedure) |
✔️ 예 | None |
entities.{entity-name}.source |
key-fields |
문자열 배열 | ✔️ 예* | None |
entities.{entity-name}.source |
parameters |
object | ✔️ 예** | None |
-
key-fields은 필요한 경우에만typeview필요합니다. 값은 기본 키를 나타냅니다.
**
parameters는 있는 type 경우에만 필요하며 기본값이 있는 매개 변수에만 필요합니다stored-procedure. 매개 변수의 데이터 형식이 유추됩니다. 기본값이 없는 매개 변수는 생략할 수 있습니다.
Tip
개체가 dbo 스키마에 속하는 경우 스키마를 지정하는 것은 선택 사항입니다. 또한 필요한 경우 개체 이름(예 dbo.Users : 대 [dbo].[Users]) 주위의 대괄호를 사용할 수 있습니다.
Format
{
"entities": {
"{entity-name}": {
"source": {
"object": <string>,
"type": <"view" | "stored-procedure" | "table">,
"key-fields": [ <string> ], // primary keys of the view
"parameters": { // only for option stored-procedure parameters
"<parameter-name-1>": <default-value>
"<parameter-name-2>": <default-value>
}
}
}
}
}
사용 권한(엔터티 이름 엔터티)
| Parent | Property | Type | Required | Default |
|---|---|---|---|---|
entities.permissions |
role |
string | ✔️ 예 | None |
사용 권한이 적용되는 역할의 이름을 지정하는 문자열입니다.
Format
{
"entities": {
"{entity-name}": {
"permissions": [
{
"role": <"anonymous" | "authenticated" | "custom-role">
}
]
}
}
}
Example
이 예제에서는 엔터티에 대한 custom-role 권한만 read 사용하여 역할을 User 정의합니다.
{
"entities": {
"User": {
"permissions": [
{
"role": "custom-role",
"actions": ["read"]
}
]
}
}
}
사용 예제
GET https://localhost:5001/api/User
Authorization: Bearer <your_access_token>
X-MS-API-ROLE: custom-role
작업(문자열 배열 권한 엔터티 이름 엔터티)
| Parent | Property | Type | Required | Default |
|---|---|---|---|---|
entities.permissions |
actions |
oneOf [string, array] | ✔️ 예 | None |
연결된 역할에 허용되는 작업을 자세히 설명하는 문자열 배열입니다.
| Action | SQL 작업 |
|---|---|
* |
모든 작업 |
create |
하나 이상의* 행 삽입 |
read |
하나 이상의 행 선택 |
update |
하나 이상의* 행 수정 |
delete |
하나 이상의* 행 삭제 |
execute |
저장 프로시저 실행 |
* 여러 작업은 현재 GraphQL에서만 지원됩니다.
Note
저장 프로시저의 경우 와일드카드(*) 작업은 execute 작업으로만 확장됩니다. 테이블 및 뷰의 경우 create, read, update및 delete확장됩니다.
Format
{
"entities": {
"{entity-name}": {
"permissions": [
{
"actions": [ <string> ]
}
]
}
}
}
Example
{
"entities": {
"{entity-name}": {
"permissions": [
{
"actions": [ "*" ] // equivalent to create, read, update, delete
}
]
}
}
}
대체 형식(문자열 전용인 경우 type=stored-procedure)
{
"entities": {
"{entity-name}": {
"permissions": [
{
"actions": <string>
}
]
}
}
}
Example
{
"entities": {
"{entity-name}": {
"permissions": [
{
"actions": "*" // equivalent to execute
}
]
}
}
}
작업(개체 배열 권한 엔터티 이름 엔터티)
| Parent | Property | Type | Required | Default |
|---|---|---|---|---|
entities.{entity-name}.permissions |
actions |
문자열 배열 | ✔️ 예 | None |
연결된 역할에 허용되는 작업을 자세히 설명하는 개체 배열입니다.
Note
저장 프로시저의 경우 와일드카드(*) 작업은 execute확장됩니다. 테이블/뷰의 경우 create, read, update및 delete확장됩니다.
중첩 속성
| Parent | Property | Type | Required | Default |
|---|---|---|---|---|
entities.{entity-name}.permissions.actions[] |
action |
string | ✔️ 예 | None |
entities.{entity-name}.permissions.actions[] |
fields |
object | ❌ 아니요 | None |
entities.{entity-name}.permissions.actions[] |
policy |
object | ❌ 아니요 | None |
entities.{entity-name}.permissions.actions[].policy |
database |
string | ✔️ 예 | None |
Format
{
"entities": {
"{entity-name}": {
"permissions": [
{
"role": <string>,
"actions": [
{
"action": <string>,
"fields": <array of strings>,
"policy": <object>
}
]
}
]
}
}
Example
이렇게 하면 필드 및 정책 제한을 사용하여 read 엔터티에 대한 auditor 사용 권한을 부여 User 합니다.
{
"entities": {
"User": {
"permissions": [
{
"role": "auditor",
"actions": [
{
"action": "read",
"fields": {
"include": ["*"],
"exclude": ["last_login"]
},
"policy": {
"database": "@item.IsAdmin eq false"
}
}
]
}
]
}
}
}
정책 참고 사항
- 정책은 다음과 같은 OData 연산자를 지원합니다
eq. - 정책은 사용 및
and.를 사용하여or복합 조건자를 지원합니다. - 작업(
create, ,readupdate및delete)에 대해서만 지원됩니다. (아님execute) - 정책은 결과를 필터링하지만 데이터베이스에서 쿼리 실행을 방지하지는 않습니다.
- 매핑된 경우 필드는 필드 별칭을 사용해야 합니다.
형식(GraphQL 엔터티 이름 엔터티)
| Parent | Property | Type | Required | Default |
|---|---|---|---|---|
entities.{entity-name}.graphql |
type |
object | ❌ 아니요 | {entity-name} |
GraphQL 스키마 내의 엔터티에 대한 명명 규칙을 설정합니다.
Format
{
"entities": {
"{entity-name}": {
"graphql": {
"type": {
"singular": "<string>",
"plural": "<string>"
}
}
}
}
}
중첩 속성
| Parent | Property | Required | Type | Default |
|---|---|---|---|---|
entities.{entity-name}.graphql.type |
singular |
❌ 아니요 | string | None |
entities.{entity-name}.graphql.type |
plural |
❌ 아니요 | string | 해당 없음(기본값은 단수 값) |
Example
Configuration
{
"entities": {
"User": {
"graphql": {
"type": {
"singular": "User",
"plural": "Users"
}
}
}
}
}
GraphQL 쿼리
{
Users {
items {
id
name
age
isAdmin
}
}
}
GraphQL 응답
{
"data": {
"Users": {
"items": [
{
"id": 1,
"name": "Alice",
"age": 30,
"isAdmin": true
},
{
"id": 2,
"name": "Bob",
"age": 25,
"isAdmin": false
}
// ...
]
}
}
}
작업(GraphQL 엔터티 이름 엔터티)
| Parent | Property | Type | Required | Default |
|---|---|---|---|---|
entities.{entity-name}.graphql |
operation |
열거형 문자열 | ❌ 아니요 | mutation |
작업이 다음 아래에 stored-procedureQuery표시되는지 여부를 Mutation 지정합니다.
Note
설정{entity-name}.type되면 stored-procedure 새 GraphQL 형식 executeXXX 이 자동으로 만들어집니다. 이 operation 속성은 이 형식이 GraphQL 스키마에 배치되는 위치를 제어합니다. 기능적 영향도 없고 스키마 위생도 없습니다.
Format
{
"entities": {
"{entity-name}": {
"graphql": {
"operation": "query" | "mutation"
}
}
}
}
예: 작업
로 설정된 경우 operationquery
type Query {
executeGetUserDetails(userId: Int!): GetUserDetailsResponse
}
로 설정된 경우 operationmutation
type Mutation {
executeGetUserDetails(userId: Int!): GetUserDetailsResponse
}
사용(GraphQL 엔터티 이름 엔터티)
| Parent | Property | Type | Required | Default |
|---|---|---|---|---|
entities.{entity-name}.graphql |
enabled |
boolean | ❌ 아니요 | True |
개발자가 GraphQL 스키마에 엔터티를 선택적으로 포함할 수 있습니다.
Format
{
"entities": {
"{entity-name}": {
"graphql": {
"enabled": <true> (default) | <false>
}
}
}
}
REST(엔터티 이름 엔터티)
| Parent | Property | Type | Required | Default |
|---|---|---|---|---|
entities.{entity-name}.rest |
enabled |
boolean | ❌ 아니요 | True |
entities.rest |
path |
string | ❌ 아니요 | /{entity-name} |
entities.{entity-name}.rest |
methods |
문자열 배열 | ❌ 아니요* | POST |
* 이 속성은 methods 엔드포인트에 stored-procedure 만 해당합니다.
Format
{
"entities": {
"{entity-name}": {
"rest": {
"enabled": <true> (default) | <false>,
"path": <string; default: "{entity-name}">
}
}
}
}
매핑(엔터티 이름 엔터티)
| Parent | Property | Type | Required | Default |
|---|---|---|---|---|
entities.{entity-name} |
mappings |
object | ❌ 아니요 | None |
데이터베이스 개체 필드에 대해 사용자 지정 별칭 또는 노출된 이름을 사용하도록 설정합니다.
Important
GraphQL을 사용하도록 설정된 엔터티의 경우 구성된 노출된 이름이 GraphQL 이름 요구 사항을 충족해야 합니다.
Format
{
"entities": {
"{entity-name}": {
"mappings": {
"<field-1-name>": "<field-1-alias>",
"<field-2-name>": "<field-2-alias>",
"<field-3-name>": "<field-3-alias>"
}
}
}
}
Examples
데이터베이스 테이블
CREATE TABLE Books
(
id INT,
sku_title VARCHAR(50),
sku_status VARCHAR(50),
)
Configuration
{
"entities": {
"Books": {
...
"mappings": {
"sku_title": "title",
"sku_status": "status"
}
}
}
}
캐시(엔터티 이름 엔터티)
| Parent | Property | Type | Required | Default |
|---|---|---|---|---|
entities.{entity-name} |
cache |
object | ❌ 아니요 | None |
엔터티에 대한 캐싱을 사용하도록 설정하고 구성합니다.
중첩 속성
| Parent | Property | Type | Required | Default |
|---|---|---|---|---|
entities.{entity-name}.cache |
enabled |
boolean | ❌ 아니요 | False |
entities.{entity-name}.cache |
ttl-seconds |
integer | ❌ 아니요 | - |
Format
{
"entities": {
"{entity-name}": {
"cache": {
"enabled": <true> (default) | <false>,
"ttl-seconds": <integer; default: 5>
}
}
}
}
Note
지정 ttl-seconds 하지 않으면 아래 runtime.cache의 전역 값 집합을 상속합니다.
Example
{
"entities": {
"Author": {
"cache": {
"enabled": true,
"ttl-seconds": 30
}
}
}
}
관계(엔터티 이름 엔터티)
| Parent | Property | Type | Required | Default |
|---|---|---|---|---|
entities.{entity-name} |
relationships |
object | ❌ 아니요 | None |
GraphQL 엔터티가 노출된 다른 엔터티와 관련된 방식을 구성합니다. 자세한 내용은 데이터 API 작성기 관계 분석
Note
각 관계의 속성은 relationship-name 해당 엔터티의 모든 관계에서 고유해야 합니다.
중첩 속성
이러한 속성은 관계 카디널리티에 따라 서로 다른 조합으로 사용됩니다.
| Parent | Property | Type | Required | Default |
|---|---|---|---|---|
entities.{entity-name}.relationships |
cardinality |
string | ✔️ 예 | None |
entities.{entity-name}.relationships |
target.entity |
string | ✔️ 예 | None |
entities.{entity-name}.relationships |
target.fields |
문자열 배열 | ❌ 아니요 | None |
entities.{entity-name}.relationships |
source.fields |
문자열 배열 | ❌ 아니요 | None |
entities.{entity-name}.relationships |
linking.object |
string | ❌ 아니요 | None |
entities.{entity-name}.relationships |
linking.source.fields |
문자열 배열 | ❌ 아니요 | None |
entities.{entity-name}.relationships |
linking.target.fields |
문자열 배열 | ❌ 아니요 | None |
Format
{
"entities": {
"{entity-name}": {
"relationships": {
"<relationship-name>": {
"cardinality": "one" | "many",
"target.entity": "<string>",
"source.fields": ["<string>"],
"target.fields": ["<string>"],
"linking.object": "<string>",
"linking.source.fields": ["<string>"],
"linking.target.fields": ["<string>"]
}
}
}
}
}
| Relationship | Cardinality | Example |
|---|---|---|
| one-to-many | many |
하나의 범주 엔터티는 많은 할 일 엔터티와 관련 될 수 있습니다. |
| many-to-one | one |
많은 할 일 엔터티가 하나의 범주 엔터티와 관련 될 수 있습니다. |
| many-to-many | many |
하나의 할 일 엔터티는 많은 사용자 엔터티와 관련되어 있으며, 하나의 사용자 엔터티는 많은 할 일 엔터티와 관련되어 있습니다. |
예: 일대일 카디널리티
각각 Profile 은 정확히 하나 User와 관련이 있으며 각각 User 에는 정확히 하나의 관련 Profile이 있습니다.
{
"entities": {
"User": {
"relationships": {
"user_profile": {
"cardinality": "one",
"target.entity": "Profile",
"source.fields": [ "id" ],
"target.fields": [ "user_id" ]
}
}
},
"Profile": {
...
}
}
}
GraphQL 스키마
type User
{
id: Int!
...
profile: Profile
}
Command-line
dab update User \
--relationship profile \
--target.entity Profile \
--cardinality one \
--relationship.fields "id:user_id"
예: 일대다 카디널리티
A Category 에는 하나 이상의 관련 Book 엔터티가 있을 수 있지만 각각 Book 에는 하나의 관련 Category엔터티가 있을 수 있습니다.
{
"entities": {
"Book": {
...
},
"Category": {
"relationships": {
"category_books": {
"cardinality": "many",
"target.entity": "Book",
"source.fields": [ "id" ],
"target.fields": [ "category_id" ]
}
}
}
}
}
GraphQL 스키마
type Category
{
id: Int!
...
books: [BookConnection]!
}
명령줄
dab update Category \
--relationship category_books \
--target.entity Book \
--cardinality many \
--relationship.fields "id:category_id"
예: 다 대 일 카디널리티
많은 Book 엔터티에는 하나의 관련 Category항목이 있을 수 있지만 Category 하나 이상의 관련 Book 항목이 있을 수 있습니다.
{
"entities": {
"Book": {
"relationships": {
"books_category": {
"cardinality": "one",
"target.entity": "Category",
"source.fields": [ "category_id" ],
"target.fields": [ "id" ]
}
},
"Category": {
...
}
}
}
}
GraphQL 스키마
type Book
{
id: Int!
...
category: Category
}
명령줄
dab update Book \
--relationship books_category \
--target.entity "Category" \
--cardinality one \
--relationship.fields "category_id:id"
예: 다 대 다 카디널리티
많은 Book 엔터티에는 많은 관련 Author 엔터티가 있을 수 있지만 많은 Author 엔터티에는 많은 관련 Book 항목이 있을 수 있습니다.
Note
이 관계는 dbo.books_authors라고 하는 세 번째 테이블을 사용할 수 있습니다.
{
"entities": {
"Book": {
"relationships": {
...,
"books_authors": {
"cardinality": "many",
"target.entity": "Author",
"source.fields": [ "id" ],
"target.fields": [ "id" ],
"linking.object": "dbo.books_authors",
"linking.source.fields": [ "book_id" ],
"linking.target.fields": [ "author_id" ]
}
},
"Category": {
...
},
"Author": {
...
}
}
}
}
GraphQL 스키마
type Book
{
id: Int!
...
authors: [AuthorConnection]!
}
type Author
{
id: Int!
...
books: [BookConnection]!
}
명령줄
dab update Book \
--relationship books_authors \
--target.entity "Author" \
--cardinality many \
--relationship.fields "id:id" \
--linking.object "dbo.books_authors" \
--linking.source.fields "book_id" \
--linking.target.fields "author_id"
상태(엔터티 이름 엔터티)
| Parent | Property | Type | Required | Default |
|---|---|---|---|---|
entities.{entity-name} |
health |
object | ❌ 아니요 | None |
엔터티에 대한 상태 검사를 사용하도록 설정하고 구성합니다.
중첩 속성
| Parent | Property | Type | Required | Default |
|---|---|---|---|---|
entities.{entity-name}.health |
enabled |
boolean | ❌ 아니요 | true |
entities.{entity-name}.health |
first |
integer | ❌ 아니요 | 100 |
entities.{entity-name}.health |
threshold-ms |
integer | ❌ 아니요 | 1000 |
Example
{
"entities": {
"Book": {
"health": {
"enabled": true,
"first": 3,
"threshold-ms": 500
}
}
}
}
Note
값은 first 설정보다 작거나 같 runtime.pagination.max-page-size 아야 합니다. 값이 작을수록 상태 검사를 더 빠르게 완료할 수 있습니다.
Important
저장 프로시저는 매개 변수가 필요하고 결정적이지 않을 수 있으므로 엔터티 상태 검사에서 자동으로 제외됩니다.