Azure SQL DatabaseからAzure OpenAIを呼び出す設定手順書
SQL Beginners Day T SQLからLLMを呼んでみる2
作成日 2026年10月7日 / 主手順 APIキー認証
本書は、Azure SQL Databaseのユーザーデータベースに資格情報と権限を設定し、T-SQLからAzure OpenAIのChat Completions APIへ短い質問を送る手順を示す。SQL Server 2025で異なる設定は、各手順の注意書きと末尾の比較表に記載する。
接続確認の完了条件は、HTTP 200、呼び出し戻り値0、空でない回答を取得できること。生成されたSQLの自動実行は本書の対象外。実際のAzure環境への接続検証は未実施。
1 事前に用意するもの
| 項目 | 用意する内容 |
|---|---|
| Azure SQL Database | 検証用ユーザーデータベース。例 LlmSqlDemo |
| 設定担当者 | 対象DBのCONTROL権限を持つ管理者 |
| 実行担当者 | 対象DBに接続できる専用ユーザー |
| Azure OpenAI | Chat Completions対応モデルのデプロイ |
| 接続情報 | リソースURL、デプロイ名、APIキー |
| クライアント | SSMS または VS CodeのMSSQL拡張 |
データベースが未作成なら、AzureポータルでSQL Databaseを作成し、論理サーバー、認証、接続元からのネットワーク経路を設定する。APIキーを使う場合、Azure OpenAI側でキー認証が有効であることも確認する。
2 接続先とネットワークを確認する
Azure OpenAIのデプロイ画面で、リソースのエンドポイント、デプロイ名、APIキーを取得する。本書では次のURL形式を使う。デプロイ名はmodelに渡す。
リソースURL
https://YOUR-RESOURCE.openai.azure.com
呼び出しURL
https://YOUR-RESOURCE.openai.azure.com/openai/v1/chat/completions
v1 APIでは日付形式のapi-versionを付けない。modelにはAzureで付けたデプロイ名を指定する。Foundryの画面から取得したURLでも、実際のホスト名とAPIの種類を確認する。[2]
Azure SQL Databaseには外部REST接続先の許可リストがある。*.openai.azure.comは対象だが、api.openai.comは対象外。Foundryという製品名ではなく、呼び出し先ドメインで判断する。対象外のAPIは許可対象のAzure API Managementなどを経由させる設計が必要。[1]
SQL Server 2025との差分 公式の接続先許可リストはAzure SQL DatabaseとManaged Instanceに適用される。SQL Server 2025にはこのAzureサービスの許可リストは適用されない。HTTPS、認証、ネットワーク到達性の条件は必要。
SSMSからDBへの接続と、DBからAzure OpenAIへの接続は別の経路。PCからAzure OpenAIを呼べても、DBから呼べる証明にはならない。SQL側の接続元IP規則、OpenAI側のネットワーク制限をそれぞれ確認する。
本書の最小デモは到達可能なパブリックHTTPSエンドポイントを前提とする。既存のPrivate Endpoint構成や選択ネットワーク構成を変更せず、DBからの経路を別途検証する。制限された環境では、API Management等の中継構成を設計する。
3 対象データベースへ接続する
SSMSの接続プロパティでLlmSqlDemoを指定し、新しいクエリを開く。管理者として次を実行し、接続先を確認する。[4]
SELECT DB_NAME() AS DatabaseName,
USER_NAME() AS DatabaseUser,
@@VERSION AS EngineVersion;
期待結果はDatabaseNameがLlmSqlDemo。Azure SQL DatabaseではUSEで別DBへ切り替えず、対象DBへ接続し直す。
SQL Server 2025との差分 SQL Server 2025ではUSE LlmSqlDemoでDBを切り替えられる。Azure SQL Database用の手順にUSE masterやサーバー設定を混ぜない。
4 資格情報を作成する
Azure SQL Databaseでは外部REST機能は既定で有効。sp_configureによる有効化は不要。[1]
SQL Server 2025との差分 SQL Server 2025では既定で無効。管理者が次を実行する。Azure SQL Databaseでは実行しない。
EXEC sys.sp_configure 'external rest endpoint enabled', 1;
RECONFIGURE WITH OVERRIDE;
以降は対象ユーザーデータベースに接続した設定担当者が実行する。DBマスターキーは資格情報のSECRETを暗号化する。マスターキーの保護パスワードとAzure OpenAIのAPIキーは別物。[3]
-- マスターキーの有無を確認
SELECT name FROM sys.symmetric_keys
WHERE name = N'##MS_DatabaseMasterKey##';
-- 既存キーがなければ作成。パスワードは変更する。
IF NOT EXISTS (SELECT 1 FROM sys.symmetric_keys
WHERE name = N'##MS_DatabaseMasterKey##')
BEGIN
CREATE MASTER KEY ENCRYPTION BY PASSWORD =
'REPLACE_WITH_STRONG_DMK_PASSWORD';
END;
GO
CREATE DATABASE SCOPED CREDENTIAL
[https://YOUR-RESOURCE.openai.azure.com]
WITH IDENTITY = 'HTTPEndpointHeaders',
SECRET = '{"api-key":"YOUR_AZURE_OPENAI_KEY"}';
GO
Azure SQL Databaseは資格情報作成時にDMKを自動作成できる。本書は鍵の役割を明確にするため、存在確認と明示作成を採用する。既存キーを削除・再作成しない。[3]
資格情報名は任意の別名にしない
HTTPEndpointHeaders方式では、資格情報名を有効なURLにする。呼び出しURLとスキーム・ホスト名が一致し、パスは同じか上位にする。クエリ文字列は資格情報名へ含めない。Azure SQL Databaseではドメインも許可リスト対象であることが必要。[1]
例のYOUR-RESOURCEを、作成時・権限付与時・呼び出し時の全箇所で同じ値に置換する。SECRETはヘッダー名api-keyを含むフラットなJSON。実キーを資料、Git、画面共有用のSQLへ残さない。
5 実行ユーザーへ権限を付与する
資格情報の作成は管理者、API呼び出しは専用ユーザーという役割分担にする。対象DBに既存ユーザーがある場合、その名前を利用する。以下は検証用の包含ユーザーをSQL認証で作成する例。Entra認証のみの環境では既存のEntraユーザーを使う。
-- 管理者が対象DBで実行。未作成の場合のみ。
CREATE USER [LlmDemoUser]
WITH PASSWORD = 'REPLACE_WITH_STRONG_USER_PASSWORD';
GO
GRANT EXECUTE ANY EXTERNAL ENDPOINT TO [LlmDemoUser];
GRANT REFERENCES ON DATABASE SCOPED CREDENTIAL::
[https://YOUR-RESOURCE.openai.azure.com]
TO [LlmDemoUser];
GO
CREATE USERの再実行は不要。APIを呼ぶだけなら、業務テーブルのSELECT権限やdb_ownerは付与しない。REFERENCESはこの資格情報を利用する権限であり、APIキーを表示する権限ではない。[1]
実行ユーザーとして接続し直す
対象DBを指定し、LlmDemoUserで新しい接続を開く。管理者のクエリ画面では、実行ユーザーの権限確認にならない。
SELECT DB_NAME() AS DatabaseName,
USER_NAME() AS DatabaseUser,
HAS_PERMS_BY_NAME(DB_NAME(), 'DATABASE',
'EXECUTE ANY EXTERNAL ENDPOINT') AS CanCallRest;
SELECT HAS_PERMS_BY_NAME(
N'https://YOUR-RESOURCE.openai.azure.com',
'DATABASE SCOPED CREDENTIAL', 'REFERENCES')
AS CanUseCredential;
期待結果はDatabaseUserがLlmDemoUser、CanCallRestとCanUseCredentialがともに1。
SQL Server 2025との差分 外部RESTの実行権限と資格情報のREFERENCESは共通。SQL Server 2025では、ユーザーの接続にサーバーログインの作成やマッピングを使う構成もある。
既存の資格情報を更新する場合
-- キーをローテーションした場合。管理者が実行。
ALTER DATABASE SCOPED CREDENTIAL
[https://YOUR-RESOURCE.openai.azure.com]
WITH IDENTITY = 'HTTPEndpointHeaders',
SECRET = '{"api-key":"NEW_AZURE_OPENAI_KEY"}';
同じ名前の資格情報が既にある場合は、CREATEを繰り返さず内容を確認してALTERを使う。
6 短い質問で疎通を確認する
実行ユーザーの接続で以下を実行する。YOUR-RESOURCEとYOUR_DEPLOYMENTを置換する。temperatureはモデル間の互換性のため指定しない。初回は再試行なしでエラーを観察する。
DECLARE @url nvarchar(4000) =
N'https://YOUR-RESOURCE.openai.azure.com/openai/v1/chat/completions';
DECLARE @response nvarchar(max), @rc int;
DECLARE @payload nvarchar(max) = N'{
"model": "YOUR_DEPLOYMENT",
"messages": [
{"role":"user", "content":"1+1を一言で答えて"}
],
"stream": false
}';
EXEC @rc = sys.sp_invoke_external_rest_endpoint
@url = @url,
@method = 'POST',
@credential = N'https://YOUR-RESOURCE.openai.azure.com',
@payload = @payload,
@timeout = 60,
@retry_count = 0,
@response = @response OUTPUT;
SELECT @rc AS ReturnCode, @response AS RawResponse;
IF @rc <> 0
THROW 50001, N'HTTP error. Inspect RawResponse.', 1;
SELECT JSON_VALUE(@response,
'$.response.status.http.code') AS HttpCode,
JSON_VALUE(@response,
'$.result.choices[0].finish_reason') AS FinishReason;
SELECT Answer
FROM OPENJSON(@response, '$.result.choices[0].message')
WITH (Answer nvarchar(max) '$.content');
正常時はReturnCodeが0、HttpCodeが200、Answerに回答がある。finish_reasonも確認する。lengthやcontent_filterなら、切れた/制限された回答として扱う。例外発生時はHTTP結果とは別にSQLエラーの全文を確認する。
応答本体は$.resultの下にある。長文を取り出すためOPENJSONのnvarchar(max)を使用する。通常のJSON_VALUEは4,000文字を超える値に適さない。[6]
7 エラーを切り分ける
| 症状 | 確認箇所 |
|---|---|
| DBへ接続できない | DB名、認証、接続元のSQLファイアウォール規則 |
| 資格情報に関するSQLエラー | 対象DB、資格情報名のURL、REFERENCES権限 |
| 接続先が拒否される | 許可ドメイン、HTTPS、呼び出し先ネットワーク設定 |
| HTTP 401 | APIキー、キー認証の有効性、資格情報のヘッダー |
| HTTP 403 | ネットワーク制限、認可。マネージドIDならRBAC |
| HTTP 400 または404 | v1 URL、デプロイ名、JSON、モデル対応API |
| HTTP 429 | クォータ、同時呼び出し、再試行間隔 |
| タイムアウトまたは5xx | API遅延、サービス障害、タイムアウト設定 |
RawResponse、ReturnCode、SQLエラーを保存する。APIキーは出力しない。API側を別クライアントで確認する場合も、URLと要求JSONを揃える。
再試行を追加するなら@retry_countを少数から設定する。@timeoutは再試行を含めた累積時間。外部API呼び出しを更新トランザクションの中へ入れない。
8 マネージドID認証へ切り替える場合
補足手順。APIキー方式と混ぜず、最初の疎通完了後に切り替える。Azure SQL論理サーバーのIDを有効化し、使用されるIDへAzure OpenAIリソースのCognitive Services OpenAI Userロールを付与する。[1]
-- 管理者が既存のAPIキー資格情報を切り替える。
ALTER DATABASE SCOPED CREDENTIAL
[https://YOUR-RESOURCE.openai.azure.com]
WITH IDENTITY = 'Managed Identity',
SECRET = '{"resourceid":"https://cognitiveservices.azure.com"}';
呼び出し側の@credentialとURLは維持する。ユーザー割り当てIDがある場合は、論理サーバーのプライマリIDの設定を確認する。IDの権限反映後、同じ疎通SQLを再実行する。
SQL Server 2025との差分 SQL Server 2025では対応するAzure Arc等のID構成に加え、allow server scoped db credentialsの有効化が必要。Azure SQL Databaseにはこのsp_configure設定を持ち込まない。
9 SQL Server 2025との差分一覧
| 項目 | Azure SQL Database | SQL Server 2025 |
|---|---|---|
| 外部RESTの有効化 | 既定で有効 | 既定で無効。sp_configureで有効化 |
| 接続先許可リスト | 適用される | 同じAzureサービスのリストは適用外 |
| DBの切り替え | 対象DBへ接続し直す | USEで切り替え可能 |
| 資格情報名 | URL条件と許可ドメインを確認 | URLの一致条件を確認 |
| DBマスターキー | 明示作成または自動作成 | 通常は資格情報作成前に明示作成 |
| キー認証の権限 | 外部REST実行とREFERENCES | 同じ |
| マネージドID | 論理サーバーのIDとRBAC | 対応するID構成と追加サーバー設定 |
10 完了確認
対象DBへの接続、資格情報名とURLの一致、専用ユーザーの権限、HTTP 200と回答取得を確認する。デモ資料から実キーとパスワードを除去する。本番運用の設計は、送信データの範囲、API費用、監査、同時実行、障害時の動作を別途決める。
参考資料
[2] Azure OpenAI v1 API 公式ページを開く
[4] SSMSでAzure SQL Databaseに接続 公式ページを開く
[5] Azure SQL Databaseの送信ファイアウォール規則 公式ページを開く
仕様確認日 2026年10月7日。ネットワーク制限やサービス仕様は、実環境で登壇前に確認する。