変更要約: DP-420 第2章を新規作成(ドメイン1後半: SDK クライアント接続(gateway vs direct/シングルトン/エミュレーター/優先リージョン/429・一時エラーのリトライ)、SQL クエリとデータアクセス(配列・ネスト・集計・サブクエリ・関数/ポイント操作 vs クエリ/パッチ/Transactional Batch/Bulk/ETag 楽観的同時実行/一貫性上書き・セッショントークン/ページネーション・継続トークン/クエリメトリクス)、サーバーサイド JS(ストアドプロシージャ=論理パーティション内 ACID/プリ・ポストトリガー/UDF))。
2.3サーバーサイドプログラミング(JavaScript)
Cosmos DB for NoSQL のサーバーサイド JavaScript=ストアドプロシージャ(同一論理パーティション内のトランザクション)、トリガー(プリ/ポスト)、ユーザー定義関数(UDF)を理解します。
Cosmos DB は サーバーサイドの JavaScript でロジックをデータの近くで実行できます。3 種類=ストアドプロシージャ・トリガー・ユーザー定義関数(UDF)を用途で使い分けます。
2.3.1ストアドプロシージャとトランザクション
ストアドプロシージャ は記述/デプロイ/呼び出しでき、同一論理パーティション内の複数項目をトランザクション(ACID) として処理する(実行時にパーティションキーを指定する)。複数項目の読み書きを 1 往復・原子的に行いたいときに使う。トリガー は操作に連動して実行され、プリトリガー(書き込み前の検証/補完)とポストトリガー(書き込み後の集計更新等)があり、要求時に明示指定して動かす。
2.3.2ユーザー定義関数(UDF)
ユーザー定義関数(UDF) はクエリ内で呼び出せる計算ロジック(例:税率計算・文字列整形)を提供する。クエリの SELECT/WHERE で使えるが、UDF を使うとインデックスが効かずスキャンになりがちで RU が増えうる点に注意する。「クエリ内の再利用可能なカスタム計算」=UDF、「複数項目のアトミック処理」=ストアドプロシージャ、「操作前後のフック」=トリガー、と区別する。
決め手:「同一論理パーティション内の複数項目をアトミックに」=ストアドプロシージャ。「書き込み前の検証/後の処理フック」=プリ/ポストトリガー。「クエリ内のカスタム計算」=UDF。サーバーサイド JS はパーティションキー指定で動き、論理パーティションを跨げない。
混同に注意:
①ストアドプロシージャのトランザクションは同一論理パーティション内のみ(複数パーティション横断不可)。
②トリガーは自動実行されず要求で明示指定が要る。
③UDF はインデックスが効きにくく RU 増の恐れ=多用しない。
④サーバーサイド JS は実行時間/RU の制約がある(大量処理はバッチ/Bulk と併用)。
2.3.3この節のまとめ
- ストアドプロシージャ=同一論理パーティション内の複数項目をアトミック処理(ACID)
- トリガー=操作前後のフック(プリ/ポスト・要求時に明示指定)
- UDF=クエリ内のカスタム計算(インデックスが効きにくく RU 増に注意)
進捗の記録にはログインが必要です。
理解度チェック
(軽い確認用)Q1. 同一論理パーティション内の複数項目を、サーバー側で 1 往復・アトミックに読み書きしたい。最適なのはどれですか?
Q2. 項目の書き込み前にバリデーションや既定値の補完を自動的に挟みたい。最適なのはどれですか?
Q3. クエリの SELECT/WHERE 内で再利用可能なカスタム計算(例:税額計算)を呼び出したい。最適なのはどれですか?
Q4. Cosmos DB のサーバーサイド JavaScript(ストアドプロシージャ/トリガー)の実行範囲として正しいのはどれですか?
Q5. UDF を多用する際に注意すべき点として正しいのはどれですか?

