データ API ビルダーを使用すると、各データベースに固有の機能を持つことができます。 この記事では、各データベースでサポートされる機能について詳しく説明します。
データベース バージョンのサポート
多くの従来のデータベースでは、Data API Builder (DAB) と互換性のある最小バージョンが必要です。
| サポートされている最小バージョン | |
|---|---|
| SQL Server | 2016 |
| MySQL | 8 |
| PostgreSQL | 11 |
逆に、Azure クラウド データベース サービスは、特定のバージョンを必要とせずに、すぐに使用できます。
| サポートされている最小バージョン | |
|---|---|
| Azure SQL | n/a |
| Azure Cosmos DB for NoSQL | n/a |
| Azure Cosmos DB for PostgreSQL | n/a |
Azure SQL と SQL Server
Azure SQL と SQL Server の両方を含め、SQL に固有のプロパティがいくつかあります。
SESSION_CONTEXT
Azure SQL と SQL Server では、 SESSION_CONTEXT 関数を使用して現在のユーザーの ID にアクセスできます。 この機能は、Azure SQL および SQL Server で使用できる行レベル セキュリティ (RLS) のネイティブ サポートを適用する場合に便利です。
Azure SQL および SQL Server の場合、データ API ビルダーは、SESSION_CONTEXT を利用して、ユーザー指定のメタデータを基になるデータベースに送信できます。 このようなメタデータは、アクセス トークンに存在する要求により、Data 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 に固有のプロパティがいくつかあります。
API for NoSQL のスキーマ
Azure Cosmos DB for NoSQL はスキーマに依存しません。 NoSQL 用 API でデータ API ビルダーを使用するには、コンテナーのデータ モデルを表すオブジェクト型定義を含む GraphQL スキーマ ファイルを作成する必要があります。 また、データ API ビルダーでは、authorizeよりも制限の厳しい読み取りアクセスを強制する場合に、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" ]
}
]
}
...
}
@authorizeを持つ roles:["metadataviewer","authenticated"] ディレクティブは、ロールがtitleおよびmetadataviewerを持つユーザーのみに、authenticated フィールドへのアクセスを制限します。 認証されたリクエスターの場合、システム ロール 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": [ "*" ]
}
]
}
}
API for NoSQL でのコンテナー間クエリ
コンテナー間の GraphQL 操作はサポートされていません。 エンジンは、次を示すエラー メッセージで応答します。 Adding/updating Relationships is currently not supported in Azure Cosmos DB for NoSQL.
この制限を回避するには、埋め込み形式で同じコンテナー内にエンティティを格納するようにデータ モデルを更新します。 詳細については、 Azure Cosmos DB for NoSQL でのデータ モデリングに関するページを参照してください。