Поделиться через


Справочник по функциям конкретной базы данных для построителя API данных

В этой справке рассматриваются функции, поведение и требования, относящиеся к одной или нескольким платформам баз данных, поддерживаемым построителем API данных (DAB). Матрица сравнения функций между базами данных см. в разделе "Доступность компонентов".

Поддержка версий базы данных

DAB поддерживает следующие платформы баз данных. Минимальные требования к версии применяются к автономным развертываниям. Базы данных PaaS для платформы как службы не имеют минимального требования к версии, так как служба управляет версией.

Платформа базы данных Аббревиатура Минимальная версия Примечания
SQL Server Семейство SQL 2016
Azure SQL Семейство SQL N/A (PaaS)
Microsoft Fabric SQL Семейство SQL N/A (PaaS)
Azure Cosmos DB для NoSQL Cosmos DB N/A (PaaS) Только GraphQL; нет конечных точек REST
PostgreSQL PGSQL 11
MySQL MySQL 8
Azure Synapse Analytics (выделенный пул SQL) SQLDW N/A (PaaS) Бессерверный пул SQL не поддерживается

Это важно

Убедитесь, что локальная база данных разработки и любая развернутая база данных соответствуют минимальному требованию к версии. DAB подключается с использованием одного драйвера в обеих средах. Старая версия в любом расположении приводит к ошибкам среды выполнения.

SQL Server и Azure SQL

SESSION_CONTEXT

Для SQL Server и SQL Azure DAB может распространять утверждения пользователей, прошедшие проверку подлинности, в базу данных путем вызова sp_set_session_context перед выполнением каждого запроса. Этот механизм позволяет политикам безопасности уровня строк SQL и хранимым процедурам считывать удостоверение вызывающего объекта из ядра СУБД.

Если set-session-context этот параметр включен в конфигурации DAB, DAB отправляет все утверждения, прошедшие проверку подлинности, как пары "ключ-значение":

EXEC sp_set_session_context 'roles', 'editor', @read_only = 0;
EXEC sp_set_session_context 'oid', 'a1b2c3d4-...', @read_only = 0;
-- Your query executes after claims are set
SELECT * FROM dbo.Documents;

Распространенные отправленные утверждения включают roles, suboidи любые пользовательские утверждения, которые поставщик удостоверений включает в JWT.

Включение SESSION_CONTEXT

Задать --set-session-context true при вызове dab init:

dab init \
  --database-type mssql \
  --connection-string "@env('SQL_CONNECTION_STRING')" \
  --set-session-context true

Или задайте свойство непосредственно в dab-config.json:

{
  "data-source": {
    "database-type": "mssql",
    "connection-string": "@env('SQL_CONNECTION_STRING')",
    "options": {
      "set-session-context": true
    }
  }
}

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

Включение set-session-context отключения кэширования ответов для этого источника данных. Так как каждый запрос задает отдельные значения сеанса, кэшированные ответы из сеанса одного пользователя не должны обслуживаться другому.

Использование SESSION_CONTEXT в SQL

После включения set-session-contextобъекты SQL могут считывать значения утверждений:

-- Read a claim in a stored procedure
DECLARE @role NVARCHAR(256) = CAST(SESSION_CONTEXT(N'roles') AS NVARCHAR(256));

-- Use a claim in a row-level security predicate function
CREATE FUNCTION dbo.RlsPredicate(@claimRole NVARCHAR(256))
RETURNS TABLE
WITH SCHEMABINDING
AS RETURN SELECT 1 AS result
WHERE @claimRole = CAST(SESSION_CONTEXT(N'roles') AS NVARCHAR(256));

Полное пошаговое руководство см. в разделе "Реализация безопасности на уровне строк с помощью контекста сеанса".

SESSION_CONTEXT и пул подключений

DAB сбрасывает все значения контекста сеанса в начале каждого запроса. Тем не менее, так как set-session-context принудительно применяется семантика подключения для каждого пользователя, повторное использование подключения между пользователями будет избегаться автоматически при включении этого параметра.

Варианты строки подключения

DAB используется Microsoft.Data.SqlClient для SQL Server и SQL Azure. Библиотека поддерживает эти форматы строк подключения.

Распространенные форматы:

Метод аутентификации Шаблон строки подключения
Имя входа SQL Server=tcp:<server>.database.windows.net;Database=<db>;User ID=<user>;Password=<pwd>;
Манажируемая идентичность Server=tcp:<server>.database.windows.net;Database=<db>;Authentication=Active Directory Managed Identity;
Управляемое удостоверение, назначенное пользователем Server=tcp:<server>.database.windows.net;Database=<db>;Authentication=Active Directory Managed Identity;User ID=<client-id>;
Учетные данные Azure по умолчанию Server=tcp:<server>.database.windows.net;Database=<db>;Authentication=Active Directory Default;

Подсказка

Храните строки подключения в переменных среды и ссылайте их на @env('SQL_CONNECTION_STRING')них. Для рабочих развертываний сохраните строку подключения в Azure Key Vault и сослаться на @akv()нее.

Неподдерживаемые типы данных

Следующие типы данных SQL Server и SQL Azure не поддерживаются DAB:

Тип данных Причина
geography Геопространственный тип; сериализация не поддерживается
geometry Планарный пространственный тип; сериализация не поддерживается
hierarchyid Иерархический тип данных; сериализация не поддерживается
json Собственный тип JSON (в настоящее время в предварительной версии)
rowversion Тип управления версиями строк; не включен в ответы API
sql_variant Столбцы типа переменной; Вывод типов не поддерживается
vector Тип вектора (в настоящее время в предварительной версии)
xml ТИП XML; сериализация не поддерживается

Azure Cosmos DB для NoSQL

Требование схемы

В отличие от реляционных баз данных, Azure Cosmos DB для NoSQL не зависит от схемы. DAB не может интроспектировать контейнер Cosmos DB для создания типов GraphQL. Необходимо указать файл схемы GraphQL ,.gqlкоторый определяет структуру документа.

Файл схемы использует стандартный язык определения схемы GraphQL (SDL) с двумя настраиваемыми директивами:

Директива Обязательный Description
@model Да Сопоставляет тип GraphQL с именем сущности DAB
@authorize Нет Ограничивает доступ к определенным ролям или типу

@model директива

Директива @model(name: "...") требуется для каждого типа GraphQL, который вы предоставляете с помощью DAB. Значение name должно точно соответствовать имени сущности в файле конфигурации DAB.

type Book @model(name: "Book") {
  id: ID
  title: String
  year: Int
}

@authorize директива

Директива @authorize предоставляет управление доступом на уровне поля и уровня типа для запросов GraphQL Cosmos DB. Он принимает roles параметр с описанием ролей, которые могут получить доступ к полю или типу.

type Book @model(name: "Book") {
  id: ID
  title: String @authorize(roles: ["authenticated", "librarian"])
  internalNotes: String @authorize(roles: ["editor"])
}

Вы также можете применить на @authorize уровне типа:

type InternalReport @model(name: "InternalReport") @authorize(roles: ["auditor"]) {
  id: ID
  summary: String
}

Это важно

Директива @authorizeдобавляет разрешения на уровне сущности. Директива и блок разрешений сущности должны разрешить запрос на доступ к успешному выполнению. Если поле имеет @authorize(roles: ["editor"]) , но сущность не имеет записи разрешений для editor, запрос отклоняется.

Замечание

@authorize(policy: "...") не поддерживается. Используйте @authorize(roles: [...]) только.

Полное руководство по настройке см. в руководстве по настройке построителя API данных для Azure Cosmos DB для NoSQL.

Недоступность REST API

DAB не создает конечные точки REST для Azure Cosmos DB для NoSQL. Azure Cosmos DB предоставляет полный собственный REST API для операций с документами. Создаются только конечные точки GraphQL. Документы OpenAPI не создаются для сущностей Cosmos DB.

Чтобы получить доступ к данным через REST, используйте REST API Azure Cosmos DB напрямую.

Неподдерживаемые функции для Cosmos DB

Следующие функции не поддерживаются для Azure Cosmos DB для NoSQL:

Функция Примечания
Конечные точки REST Вместо этого используйте собственный REST API Cosmos DB
Политики базы данных Предикаты политики требуют семантики реляционного запроса
Хранимые процедуры Не поддерживается как сущности DAB
Отношения Связи между контейнерами не поддерживаются
Сортировка ($orderby) Не поддерживается в запросах GraphQL
Aggregation Не поддерживаются
Несколько мутаций Не поддерживаются
Контекст сеанса Функция, зависят от SQL

PostgreSQL

Минимальная версия

Требуется PostgreSQL 11 или более поздней версии. DAB используется Npgsql в качестве драйвера PostgreSQL.

Неподдерживаемые типы данных

Следующие типы данных PostgreSQL не поддерживаются DAB:

Тип данных Примечания
bytea Двоичная строка; сериализация не поддерживается
date Используйте timestamp или timestamptz
smalldatetime Не собственный тип PostgreSQL
datetime2 Не собственный; обычно обрабатывается с помощью timestamp
timestamptz Метка времени с часовыми поясами; не поддерживается
time Время дня без даты
localtime Системное время на основе часов

Хранимые процедуры

Хранимые процедуры не поддерживаются для сущностей PostgreSQL. Вместо этого используйте таблицы и представления.

MySQL

Минимальная версия

Требуется MySQL 8 или более поздней версии.

Неподдерживаемые типы данных

Следующие типы данных MySQL не поддерживаются DAB:

Тип данных Примечания
UUID Универсальные уникальные идентификаторы
DATE Даты календаря
SMALLDATETIME Менее точное хранилище даты и времени
DATETIME2 Не собственный; Использовать datetime
DATETIMEOFFSET Даты и время с часовыми поясами
TIME Время дня без даты
LOCALTIME Текущее время на основе системных часов

Хранимые процедуры

Хранимые процедуры не поддерживаются для сущностей MySQL. Вместо этого используйте таблицы.

Azure Synapse Analytics (выделенный пул SQL)

Поддерживаемые объекты

Выделенный пул SQL поддерживает таблицы, представления и хранимые процедуры, аналогичные SQL Server и Azure SQL. Бессерверный пул SQL не поддерживается.

Неподдерживаемые функции

Функция Примечания
Несколько мутаций Не поддерживаются