Entities

Параметры конфигурации для сущностей базы данных.

Health

Property Description
entities.entity-name.health.enabled Включает проверки работоспособности сущности (как конечные точки REST, так и GraphQL)
entities.entity-name.health.first Количество строк, возвращаемых в запросе проверки работоспособности (диапазон: 1–500)
entities.entity-name.health.threshold-ms Максимальная длительность в миллисекундах для запроса проверки работоспособности (min: One)

Description

Property Description
entities.entity-name.description Читаемое человеком описание сущности

Fields

Property Description
entities.entity-name.fields[].name Имя поля базы данных (обязательно)
entities.entity-name.fields[].alias Имя, предоставляемое API (заменяет сопоставления)
entities.entity-name.fields[].description Описание поля, доступного для чтения человеком
entities.entity-name.fields[].primary-key Помечает поле как первичный ключ (заменяет поля ключей)

Source

Property Description
entities.entity-name.source.type Тип объекта: table, viewили stored-procedure
entities.entity-name.source.object Имя объекта базы данных
entities.entity-name.source.object-description Описание объекта базы данных, доступного для чтения человеком
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, updatedeleteexecute

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 Объект join, используемый для связей "многие ко многим"
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 Время в кэше в секундах
entities.entity-name.cache.level Уровень кэша: L1 (только в памяти) или L1L2 (в памяти + распределено)

MCP

Property Description
entities.entity-name.mcp Объект, который управляет участием протокола контекста модели (MCP) для сущности
entities.entity-name.mcp.dml-tools Включает или отключает средства языка обработки данных (DML) для сущности
entities.entity-name.mcp.custom-tool Регистрирует хранимую процедуру как именованное средство MCP (только сущности хранимой процедуры)

Обзор формата

{
  "entities": {
    "{entity-name}": {
      "description": <string>,
      "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>,
        "object-description": <string>,
        "type": "view" | "stored-procedure" | "table",
        "key-fields": [<string>], // DEPRECATED: use fields[].primary-key
        "parameters": [ // array format (preferred)
          {
            "name": "<parameter-name>",
            "required": <boolean>,
            "default": <value>,
            "description": "<string>"
          }
        ]
      },
      "fields": [
        {
          "name": "<database-field-name>",
          "alias": "<api-exposed-name>",
          "description": "<string>",
          "primary-key": <boolean>
        }
      ],
      "mappings": { // DEPRECATED: use fields[].alias
        "<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>
          }
        }
      ],
      "cache": {
        "enabled": <boolean>,
        "ttl-seconds": <integer>,
        "level": "L1" | "L1L2" // default: "L1L2"
      },
      "mcp": {
        "dml-tools": <boolean>,       // default: true
        "custom-tool": <boolean>      // stored-procedure only; default: false
      }
    }
  }
}

Источник (сущности с именем сущности)

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 object-description string ❌ Нет None
entities.{entity-name}.source type перечисление (table, , viewstored-procedure) ✔️ Да None
entities.{entity-name}.source key-fields массив строк ❌ Нет* None
entities.{entity-name}.source parameters массив или объект ❌ Нет** None

* key-fieldsтребуется только в том случае, type если viewfields массив не используется. Значение представляет первичные ключи.

Предупреждение

Свойство key-fields устарело в DAB 2.0. fields Вместо этого используйте массивprimary-key: true. Схема применяет это fields и key-fields не может сосуществовать с одной сущностью.

** parameters требуется только в том случае, если type для параметров используется stored-procedure только значения по умолчанию. Тип данных параметра выводится. Параметры без значения по умолчанию могут быть опущены.

object-description — необязательное описание объекта базы данных, доступного для чтения человеком. Это значение отображается во время обнаружения инструментов MCP, помогая агентам ИИ понять назначение сущности.

Tip

Если объект принадлежит схеме dbo, указание схемы является необязательным. Кроме того, квадратные скобки вокруг имен объектов (например, dbo.Users vs. [dbo].[Users]) можно использовать при необходимости.

Format

{
  "entities": {
    "{entity-name}": {
      "source": {
        "object": <string>,
        "object-description": <string>,
        "type": <"view" | "stored-procedure" | "table">,
        "key-fields": [ <string> ], // DEPRECATED: use fields[].primary-key
        "parameters": [ // array format (preferred)
          {
            "name": "<parameter-name>",
            "required": <boolean>,
            "default": <value>,
            "description": "<string>"
          }
        ]
      }
    }
  }
}

Формат массива параметров

В предварительной версии parameters DAB 2.0 поддерживает структурированный формат массива с большими метаданными. Каждый параметр является объектом со следующими свойствами:

Property Type Required Description
name string ✔️ Да Имя параметра (без @ префикса)
required boolean ❌ Нет Является ли параметр обязательным (true) или необязательным () (false)
default any ❌ Нет Значение по умолчанию, используемое, если параметр не указан
description string ❌ Нет Удобочитаемое пользователем описание параметра

Пример (формат массива— предпочтительный)

{
  "entities": {
    "GetBookById": {
      "source": {
        "type": "stored-procedure",
        "object": "dbo.get_book_by_id",
        "parameters": [
          {
            "name": "id",
            "required": true,
            "default": null,
            "description": "The unique identifier of the book"
          }
        ]
      }
    }
  }
}

Предупреждение

Формат parameters словаря (например, { "id": 0 }не рекомендуется) в DAB 2.0. Используйте предыдущий формат массива. Старый формат по-прежнему принимается для обратной совместимости, но будет удален в будущем выпуске.

Note

Функции построителя данных 2.0, описанные в этом разделе, находятся в предварительной версии и могут измениться до общедоступной доступности. Дополнительные сведения см. в статье "Новые возможности" версии 2.0.

Разрешения (сущности с именем сущности)

Parent Property Type Required Default
entities.permissions role string ✔️ Да None

Указывает имя роли, к которому применяются разрешения. Используйте системные роли (Anonymous, или пользовательские роли, Authenticatedопределенные в поставщике удостоверений).

Tip

Подробные сведения об оценке ролей, системных ролях и заголовке см. в обзореX-MS-API-ROLE авторизации.

Format

{
  "entities": {
    "{entity-name}": {
      "permissions": [
        {
          "role": <"Anonymous" | "Authenticated" | "custom-role">,
          "actions": [ <string> ]
        }
      ]
    }
  }
}

Example

{
  "entities": {
    "User": {
      "permissions": [
        {
          "role": "reader",
          "actions": ["read"]
        }
      ]
    }
  }
}

Наследование ролей

DAB 2.0 представляет наследование ролей для разрешений сущностей. Если роль не настроена явно для сущности, она наследует разрешения от более широкой роли, используя следующую цепочку:

named-role → authenticated → anonymous
  • Если authenticated сущность не настроена, она наследуется от anonymous.
  • Если именованной роли не настроена, она наследуется от authenticatedили от anonymousauthenticated отсутствия.

Это означает, что вы можете определить разрешения один раз и anonymous каждая более широкая роль автоматически получает одинаковый доступ без дублирования.

Note

Функции построителя данных 2.0, описанные в этом разделе, находятся в предварительной версии и могут измениться до общедоступной доступности. Дополнительные сведения см. в статье "Новые возможности" версии 2.0.

Example

{
  "entities": {
    "Book": {
      "source": "dbo.books",
      "permissions": [
        { "role": "anonymous", "actions": [ "read" ] }
      ]
    }
  }
}

С помощью этой конфигурации anonymous, и authenticatedлюбой ненастройной именованной роли можно считать Bookвсе. Используется dab configure --show-effective-permissions для просмотра разрешенных разрешений для каждой сущности после применения наследования.

Действия (сущности entity-name в строковом массиве разрешений)

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
        }
      ]
    }
  }
}

Действия (сущности entity-name для разрешения массива объектов)

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

При этом предоставляется readauditor разрешение на User сущность с ограничениями полей и политик.

{
  "entities": {
    "User": {
      "permissions": [
        {
          "role": "auditor",
          "actions": [
            {
              "action": "read",
              "fields": {
                "include": ["*"],
                "exclude": ["last_login"]
              },
              "policy": {
                "database": "@item.IsAdmin eq false"
              }
            }
          ]
        }
      ]
    }
  }
}

Заметки о политике

Политики баз данных фильтруют результаты запросов с помощью предикатов в стиле OData. Используется @item.<field> для ссылки на поля сущности и @claims.<type> внедрения утверждений пользователей, прошедших проверку подлинности.

Аспект Сведения
Синтаксис Предикаты OData (eq, , neand, or, gt) lt
Справочник полей @item.<field> (при необходимости используйте сопоставленное имя)
Справочник по утверждению @claims.<claimType>
Поддерживаемые действия read update delete
Не поддерживается create, execute

Tip

Подробные рекомендации по политикам базы данных, включая подстановку утверждений и устранение неполадок, см. в разделе "Настройка политик базы данных".

Тип (сущности-имя сущности 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 N/A (по умолчанию используется единственное значение)

* singular требуется при type указании в качестве объекта. Если type это обычная строка, эта строка используется в качестве единственного имени.

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-procedure операция под Query или Mutation.

Note

Если {entity-name}.type задано значение stored-procedure, создается автоматически новый тип executeXXX GraphQL. Это operation свойство управляет размещением этого типа в схеме GraphQL. Нет функционального влияния, просто гигиена схемы.

Format

{
  "entities": {
    "{entity-name}": {
      "graphql": {
        "operation": "query" | "mutation"
      }
    }
  }
}

Пример: операция

Если operation задано значение query

type Query {
  executeGetUserDetails(userId: Int!): GetUserDetailsResponse
}

Если operation задано значение mutation

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 конечных точек.

Note

Функции построителя данных 2.0, описанные в этом разделе, находятся в предварительной версии и могут измениться до общедоступной доступности. Дополнительные сведения см. в статье "Новые возможности" версии 2.0.

Format

{
  "entities": {
    "{entity-name}": {
      "rest": {
        "enabled": <true> (default) | <false>,
        "path": <string; default: "{entity-name}">
      }
    }
  }
}

Описание (сущности с именем сущности)

Parent Property Type Required Default
entities.{entity-name} description string ❌ Нет None

Необязательное описание сущности, доступной для чтения человеком. Это значение отображается в созданной документации ПО API и в качестве комментария в схеме GraphQL.

Note

Функции построителя данных 2.0, описанные в этом разделе, находятся в предварительной версии и могут измениться до общедоступной доступности. Дополнительные сведения см. в статье "Новые возможности" версии 2.0.

Format

{
  "entities": {
    "{entity-name}": {
      "description": "<string>"
    }
  }
}

Example

{
  "entities": {
    "Book": {
      "description": "Represents a book in the catalog with title, author, and pricing information.",
      "source": {
        "object": "dbo.books",
        "type": "table"
      }
    }
  }
}

Поля (сущности с именем сущности)

Parent Property Type Required Default
entities.{entity-name} fields массив ❌ Нет None

Определяет метаданные для отдельных полей базы данных, включая псевдонимы, описания и обозначения первичного ключа. Массив fields заменяет как mappings свойство, так alias и source.key-fields (через primary-key свойство) в одной единой единой структуре.

Note

Функции построителя данных 2.0, описанные в этом разделе, находятся в предварительной версии и могут измениться до общедоступной доступности. Дополнительные сведения см. в статье "Новые возможности" версии 2.0.

Вложенные свойства

Parent Property Type Required Default
entities.{entity-name}.fields[] name string ✔️ Да None
entities.{entity-name}.fields[] alias string ❌ Нет None
entities.{entity-name}.fields[] description string ❌ Нет None
entities.{entity-name}.fields[] primary-key boolean ❌ Нет false

Format

{
  "entities": {
    "{entity-name}": {
      "fields": [
        {
          "name": "<database-field-name>",
          "alias": "<api-exposed-name>",
          "description": "<string>",
          "primary-key": <boolean>
        }
      ]
    }
  }
}

Example

{
  "entities": {
    "Book": {
      "source": {
        "object": "dbo.books",
        "type": "table"
      },
      "fields": [
        {
          "name": "id",
          "description": "Unique book identifier",
          "primary-key": true
        },
        {
          "name": "sku_title",
          "alias": "title",
          "description": "The display title of the book"
        },
        {
          "name": "sku_status",
          "alias": "status"
        }
      ]
    }
  }
}

В этом примере id используется первичный ключ (замена необходимостиsource.key-fields), а sku_titlesku_status также псевдоним title как и status (замена необходимости).mappings

Important

Схема применяется, которая fields не может сосуществовать с mappings одной и той же сущностью.source.key-fields fields Выполните миграцию и удалите устаревшие свойства.

Сопоставления (сущности с именем сущности)

Предупреждение

Свойство mappings устарело в DAB 2.0. fields Вместо этого используйте массив со свойствомalias. Схема применяет это fields и mappings не может сосуществовать с одной сущностью.

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 ❌ Нет -
entities.{entity-name}.cache level перечисление (L1 | L1L2) ❌ Нет L1L2

Format

{
  "entities": {
    "{entity-name}": {
      "cache": {
        "enabled": <true> (default) | <false>,
        "ttl-seconds": <integer; default: 5>,
        "level": <"L1" | "L1L2"> (default: "L1L2")
      }
    }
  }
}

Свойство level определяет, какие уровни кэша используются:

Ценность Description
L1 Только кэш в памяти. Самый быстрый, но не общий доступ между экземплярами.
L1L2 Кэш в памяти и распределенный (Redis) кэш. Общий доступ между масштабируемыми экземплярами. По умолчанию.

Note

Функции построителя данных 2.0, описанные в этом разделе, находятся в предварительной версии и могут измениться до общедоступной доступности. Дополнительные сведения см. в статье "Новые возможности" версии 2.0.

Note

Если он не указан, ttl-seconds наследует глобальный набор значений в разделе runtime.cache.

Example

{
  "entities": {
    "Author": {
      "cache": {
        "enabled": true,
        "ttl-seconds": 30,
        "level": "L1"
      }
    }
  }
}

Связи (сущности с именем сущности)

Parent Property Type Required Default
entities.{entity-name} relationships object ❌ Нет None

Настраивает, как сущности GraphQL связаны с другими предоставляемыми сущностями. Дополнительные сведения см. в разделе связи построителя данных.

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 Одна сущность категории может относиться ко многим сущностям todo
many-to-one one Многие сущности todo могут относиться к одной сущности категории
many-to-many many Одна сущность todo может относиться ко многим пользовательским сущностям, и одна сущность пользователя может относиться ко многим сущностям todo

Пример: кратность "один к одному"

Каждая 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"

Пример: кратность "один ко многим"

Может 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

Хранимые процедуры автоматически исключаются из проверок работоспособности сущностей, так как они требуют параметров и не могут быть детерминированными.

MCP (сущности с именем сущности)

Parent Property Type Required Default
entities.{entity-name} mcp object ❌ Нет включен по умолчанию при опущении

Управляет участием MCP для сущности. Если MCP включен глобально, сущности участвуют по умолчанию. Используйте это свойство, чтобы отказаться от использования или включения пользовательских средств MCP для сущностей хранимой процедуры.

Note

Функции построителя данных 2.0, описанные в этом разделе, находятся в предварительной версии и могут измениться до общедоступной доступности. Дополнительные сведения см. в статье "Новые возможности" версии 2.0.

Формат объекта

Используйте формат объекта для детализированного элемента управления:

Parent Property Type Required Default
entities.{entity-name}.mcp dml-tools boolean ❌ Нет true
entities.{entity-name}.mcp custom-tool boolean ❌ Нет false
{
  "entities": {
    "Book": {
      "mcp": {
        "dml-tools": true
      }
    }
  }
}

Пользовательское средство (только хранимые процедуры)

Для сущностей хранимой процедуры установите custom-tooltrue для регистрации процедуры в качестве именованного инструмента MCP:

{
  "entities": {
    "GetBookById": {
      "source": {
        "type": "stored-procedure",
        "object": "dbo.get_book_by_id"
      },
      "mcp": {
        "custom-tool": true
      },
      "permissions": [
        {
          "role": "anonymous",
          "actions": ["execute"]
        }
      ]
    }
  }
}

Important

Свойство custom-tool допустимо только для сущностей хранимой процедуры. Задание в таблице или представлении сущности приводит к ошибке конфигурации.

Примеры интерфейса командной строки

dab add Book --source books --permissions "anonymous:*" --mcp.dml-tools true
dab add GetBookById --source dbo.get_book_by_id --source.type stored-procedure --permissions "anonymous:execute" --mcp.custom-tool true