다음을 통해 공유


Entities

데이터베이스 엔터티에 대한 구성 설정입니다.

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, updatedelete확장됩니다.

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, updatedelete확장됩니다.

중첩 속성

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, , readupdatedelete)에 대해서만 지원됩니다. (아님 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

저장 프로시저는 매개 변수가 필요하고 결정적이지 않을 수 있으므로 엔터티 상태 검사에서 자동으로 제외됩니다.