此参考涵盖了特定于数据 API 生成器支持的一个或多个数据库平台的功能、行为和要求。 有关跨数据库功能比较矩阵,请参阅 功能可用性。
数据库版本支持
DAB 支持以下数据库平台。 最低版本要求适用于自托管部署。 平台即服务(PaaS)数据库没有最低版本要求,因为该服务管理版本。
| 数据库平台 | 缩写 | 最低版本 | 备注 |
|---|---|---|---|
| SQL Server | SQL 系列 | 2016 | |
| Azure SQL | SQL 系列 | N/A (PaaS) | |
| Microsoft Fabric SQL | SQL 系列 | N/A (PaaS) | |
| Azure Cosmos DB for 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 和 Azure SQL,DAB 可以在执行每个查询之前通过调用 sp_set_session_context 向数据库传播经过身份验证的用户声明。 此机制允许 SQL 本机行级安全策略和存储过程从数据库引擎中读取调用方标识。
在 DAB 配置中启用后 set-session-context ,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、 sub标识 oid提供者包含在 JWT 中的任何自定义声明。
启用SESSION_CONTEXT
调用dab init时设置--set-session-context true:
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 禁用该数据源的响应缓存。 由于每个请求设置不同的会话值,因此不能将来自一个用户的会话的缓存响应提供给另一个会话。
在 SQL 中使用SESSION_CONTEXT
启用 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 和 Azure SQL。 该库支持 这些连接字符串格式。
常见格式:
| 身份验证方法 | 连接字符串模式 |
|---|---|
| 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()
不支持的数据类型
DAB 不支持以下 SQL Server 和 Azure SQL 数据类型:
| 数据类型 | 原因 |
|---|---|
geography |
地理空间类型;不支持序列化 |
geometry |
平面空间类型;不支持序列化 |
hierarchyid |
分层数据类型;不支持序列化 |
json |
本机 JSON 类型(目前为预览版) |
rowversion |
行版本控制类型;API 响应中不包含 |
sql_variant |
变量类型列;不支持类型推理 |
vector |
矢量类型(目前为预览版) |
xml |
XML 类型;不支持序列化 |
Azure Cosmos DB for NoSQL
架构要求
与关系数据库不同,Azure Cosmos DB for NoSQL 与架构无关。 DAB 无法反省 Cosmos DB 容器以生成 GraphQL 类型。 必须提供定义文档结构的 GraphQL 架构文件(.gql)。
架构文件使用标准 GraphQL 架构定义语言(SDL)和两个自定义指令:
| 指令 | 必需 | Description |
|---|---|---|
@model |
是的 | 将 GraphQL 类型映射到 DAB 实体名称 |
@authorize |
否 | 限制对特定角色的字段或类型访问 |
@model 指令
在通过 DAB 公开的每个 GraphQL 类型上都需要该 @model(name: "...") 指令。 该值 name 必须与 DAB 配置文件中的实体名称完全匹配。
type Book @model(name: "Book") {
id: ID
title: String
year: Int
}
@authorize 指令
该 @authorize 指令为 Cosmos DB GraphQL 查询提供字段级和类型级访问控制。 它接受一个 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: [...]) 。
有关完整的设置指南,请参阅 为 Azure Cosmos DB for NoSQL 设置数据 API 生成器。
REST API 不可用
DAB 不会为 Azure Cosmos DB for NoSQL 生成 REST 终结点。 Azure Cosmos DB 为文档操作提供全面的本机 REST API。 仅生成 GraphQL 终结点。 不会为 Cosmos DB 实体生成 OpenAPI 文档。
若要通过 REST 访问数据,请直接使用 Azure Cosmos DB REST API 。
Cosmos DB 不支持的功能
Azure Cosmos DB for NoSQL 不支持以下功能:
| 功能 | 备注 |
|---|---|
| REST 终结点 | 改用本机 Cosmos DB REST API |
| 数据库策略 | 策略谓词需要关系查询语义 |
| 存储过程 | 不支持作为 DAB 实体 |
| Relationships | 不支持跨容器关系 |
排序 ($orderby) |
GraphQL 查询不支持 |
| 集合体 | 不支持 |
| 多个突变 | 不支持 |
| 会话上下文 | 特定于 SQL 的功能 |
PostgreSQL
最低版本
需要 PostgreSQL 11 或更高版本。 DAB 用作 Npgsql 其 PostgreSQL 驱动程序。
不支持的数据类型
DAB 不支持以下 PostgreSQL 数据类型:
| 数据类型 | 备注 |
|---|---|
bytea |
二进制字符串;不支持序列化 |
date |
使用 timestamp 或 timestamptz |
smalldatetime |
不是本机 PostgreSQL 类型 |
datetime2 |
不是本机;通常由 timestamp |
timestamptz |
具有时区的时间戳;不支持 |
time |
不带日期的一天时间 |
localtime |
基于系统时钟的时间 |
存储过程
PostgreSQL 实体不支持存储过程。 请改用表和视图。
MySQL
最低版本
需要 MySQL 8 或更高版本。
不支持的数据类型
DAB 不支持以下 MySQL 数据类型:
| 数据类型 | 备注 |
|---|---|
UUID |
通用唯一标识符 |
DATE |
日历日期 |
SMALLDATETIME |
不太精确的日期和时间存储 |
DATETIME2 |
不是本机;使用 datetime |
DATETIMEOFFSET |
时区的日期和时间 |
TIME |
不带日期的一天时间 |
LOCALTIME |
基于系统时钟的当前时间 |
存储过程
MySQL 实体不支持存储过程。 请改用表。
Azure Synapse Analytics (专用 SQL 池)
支持的对象
专用 SQL 池支持表、视图和存储过程,与 SQL Server 和 Azure SQL 相同。 不支持无服务器 SQL 池。
不支持的功能
| 功能 | 备注 |
|---|---|
| 多个突变 | 不支持 |