共用方式為


數據 API 產生器的資料庫特定功能

數據 API 產生器可讓每個資料庫有自己的特定功能。 本文詳細說明每個資料庫支援的功能。

資料庫版本支援

許多傳統資料庫需要最低版本才能與數據 API 產生器 (DAB) 相容。

最低支援的版本
SQL Server 2016
MySQL 8
PostgreSQL 11

相反地,Azure 雲端資料庫服務會立即搭配 DAB 使用,而不需要特定版本。

最低支援的版本
Azure SQL n/a
適用於 NoSQL 的 Azure Cosmos DB n/a
適用於 PostgreSQL 的 Azure Cosmos DB n/a

Azure SQL 和 SQL Server

SQL 有一些專屬的特定屬性,包括 Azure SQL 和 SQL Server。

SESSION_CONTEXT

Azure SQL 和 SQL Server 支援使用 SESSION_CONTEXT 函式來存取目前使用者的身分識別。 當您想要對 Azure SQL 和 SQL Server 中可用的數據列層級安全性 (RLS) 套用原生支援時,這項功能很有用。

針對 Azure SQL 和 SQL Server,數據 API 產生器可以利用 SESSION_CONTEXT,將使用者指定的元數據傳送至基礎資料庫。 這類元數據可透過存取令牌中存在的宣告提供給數據 API 產生器。 然後,傳送至資料庫的數據可用來設定額外的安全性層級(例如,藉由設定安全策略),進一步防止存取 SELECT、UPDATE、DELETE 等作業中的數據。 在資料庫連接期間,資料庫可以使用 SESSION_CONTEXT 數據,直到該連接關閉為止。 預存程式內也可以使用相同的數據。

如需設定SESSION_CONTEXT數據的詳細資訊,請參閱 sp_set_session_context (Transact-SQL)。

SESSION_CONTEXT使用options組態檔中 區段的 data-source 屬性進行設定。 如需詳細資訊,請參閱 data-source 組態參考

{
  ...
  "data-source": {
    "database-type": "mssql",
    "options": {
      "set-session-context": true
    },
    "connection-string": "<connection-string>"
  },
  ...
}

或者,搭配 --set-session-context 命令使用 自變數 dab init

dab init --database-type mssql --set-session-context true

EasyAuth/JWT 令牌中的所有宣告都會透過 SESSION_CONTEXT 傳送至基礎資料庫。 令牌中存在的所有宣告都會轉譯成透過 SESSION_CONTEXT 查詢傳遞的索引鍵/值組。 這些宣告包括,但不限於:

Description
aud Audience
iss Issuer
iat Issued at
exp Expiration time
azp Application identifier
azpacr 用戶端的驗證方法
name Subject
uti 唯一令牌標識碼

如需宣告的詳細資訊,請參閱 Microsoft Entra ID 存取令牌宣告參考

這些宣告會轉譯成 SQL 查詢。 這個截斷的範例說明如何在 sp_set_session_context 此內容中使用:

EXEC sp_set_session_context 'aud', '<AudienceID>', @read_only = 1;
EXEC sp_set_session_context 'iss', 'https://login.microsoftonline.com/<TenantID>/v2.0', @read_only = 1;
EXEC sp_set_session_context 'iat', '1637043209', @read_only = 1;
...
EXEC sp_set_session_context 'azp', 'a903e2e6-fd13-4502-8cae-9e09f86b7a6c', @read_only = 1;
EXEC sp_set_session_context 'azpacr', 1, @read_only = 1;
..
EXEC sp_set_session_context 'uti', '_sSP3AwBY0SucuqqJyjEAA', @read_only = 1;
EXEC sp_set_session_context 'ver', '2.0', @read_only = 1;

接著,您可以使用會話數據來實作數據列層級安全性 (RLS)。 如需詳細資訊,請參閱 使用會話內容實作數據列層級安全性。

Azure Cosmos DB

在 Azure Cosmos DB 中,有一些專屬於各種 API 的特定屬性。

適用於 NoSQL 的 API 中的架構

Azure Cosmos DB for NoSQL 與結構描述無關。 若要搭配 NoSQL 的 API 使用資料 API 產生器,您必須建立 GraphQL 架構檔案,其中包含代表容器數據模型的物件類型定義。 當您想要強制執行比 更authorize嚴格的讀取存取時,數據 API 產生器也會預期 GraphQL 物件類型定義和欄位包含 GraphQL 架構指示詞anonymous

例如,這個架構檔案代表 Book 容器內的專案。 此專案至少 title 包含和 Authors 屬性。

type Book @model(name:"Book"){
  id: ID
  title: String @authorize(roles:["metadataviewer","authenticated"])
  Authors: [Author]
}

此範例架構會對應至 DAB 組態檔中的下列實體組態。 如需詳細資訊,請參閱 entities 組態參考

{
  ...
  "Book": {
    "source": "Book",
    "permissions": [
      {
        "role": "anonymous",
        "actions": [ "read" ]
      },
      {
        "role": "metadataviewer",
        "actions": [ "read" ]
      }
    ]
  }
  ...
}

@authorizeroles:["metadataviewer","authenticated"] 指示詞會將欄位的 title 存取限制為只有具有 角色 metadataviewerauthenticated的使用者。 對於已驗證的要求者,系統角色 authenticated 會自動指派,而 X-MS-API-ROLE 不需要標頭。

如果需要在的內容metadataviewer中執行已驗證的要求,它應該隨附設定為 X-MS-API-ROLE之類型的metadataviewer要求標頭。 不過,如果需要匿名存取,您必須省略授權指示詞。

指示 @model 詞可用來建立這個 GraphQL 物件類型與運行時間組態中對應實體名稱之間的相互關聯。指示詞格式為: @model(name:"<Entity_Name>")

在更深入的範例中 @authorize ,指示詞可以在最上層類型定義上套用。 此應用程式會將類型及其欄位的存取限制為指示詞中指定的角色。

type Series @model(name:"Series") @authorize(roles:["editor","authenticated"]) {
  id: ID
  title: String
  Books: [Book]
}
{
  "Book": {
    "source": "Series",
    "permissions": [
      {
        "role": "authenticated",
        "actions": [ "read" ]
      },
      {
        "role": "editor",
        "actions": [ "*" ]
      }
    ]
  }
}

適用於 NoSQL 的 API 中的跨容器查詢

不支援跨容器的 GraphQL 作業。 引擎會回應錯誤訊息,指出: Adding/updating Relationships is currently not supported in Azure Cosmos DB for NoSQL.

您可以藉由更新數據模型,以內嵌格式將實體儲存在相同容器內,藉此解決這項限制。 如需詳細資訊,請參閱 適用於 NoSQL 的 Azure Cosmos DB 中的數據模型化。