ストアド プロシージャ
Azure Cosmos DB は、ドキュメント、グラフ、キー値のデータ モデルをサポートするグローバル分散マルチモデル データベースです。 このセクションの内容は、REST 経由で SQL API を使用してドキュメント リソースを作成、クエリ、および管理するための内容です。
ストアド プロシージャは JavaScript で記述されたアプリケーションのロジックです。1 つの処理としてコレクションに対して登録され、実行されます。 Azure Cosmos DB では、JavaScript はデータベースと同じメモリ空間でホストされます。 そのため、ストアド プロシージャ内で行われた要求はデータベース セッションの同じ範囲で実行されます。 このプロセスにより、Azure Cosmos DB は、1 つのストアド プロシージャに含まれるすべての操作に対して ACID を保証できます。
ストアド プロシージャ リソースは、 Azure Cosmos DB リソース モデルの sprocs によって表されます。
ストアド プロシージャ リソースのスキーマは固定です。 body プロパティに、アプリケーション ロジックが含まれています。 次の例は、ストアド プロシージャの JSON 構造を示しています。
{
"id":"SimpleStoredProc",
"body":"function (docToCreate, addedPropertyName, addedPropertyValue {getContext().getResponse().setBody('Hello World');}",
"_rid":"hLEEAI1YjgcBAAAAAAAAgA==",
"_ts":1408058682,
"_self":"dbs\/hLEEAA==\/colls\/hLEEAI1Yjgc=\/sprocs\/hLEEAI1YjgcBAAAAAAAAgA==\/",
"_etag":"00004100-0000-0000-0000-53ed453a0000"
}
特定のストアド プロシージャに対して All アクセス モード を設定するだけでは、ユーザーがストアド プロシージャを実行することはできません。 代わりに、ユーザーはストアド プロシージャを実行するために、コレクション レベルで All アクセス モード を使用する必要があります。
プロパティ | 説明 |
---|---|
id | 必須。 これはユーザー設定可能なプロパティです。 ストアド プロシージャの識別に使用される一意の名前です。 ID は 255 文字以内にする必要があります。 |
body | 必須。 これはユーザー設定可能なプロパティです。 これはストアド プロシージャの本体です。 |
_解消 | システムによって生成されるプロパティです。 リソース ID (_rid) は、リソース モデル上のリソース スタックごとに階層化された一意識別子です。 ストアド プロシージャ リソースの配置およびナビゲーションのために内部的に使用されます。 |
_Ts | システムによって生成されるプロパティです。 リソースの最終更新タイムスタンプを示します。 値は、タイムスタンプです。 |
_自己 | システムによって生成されるプロパティです。 リソースの一意のアドレス指定が可能な URI です。 |
_Etag | これは、オプティミスティック コンカレンシー制御に必要なリソース etag を指定するシステム生成のプロパティです。 |
ストアド プロシージャでは、Cosmos DB JavaScript サーバー側 SDK を使用して、ドキュメントの作成、読み取り、更新、削除、クエリ、および要求本文からの読み取りとストアド プロシージャの応答本文への書き込みなどのデータベース操作を行うことができます。 詳細については、 Cosmos DB サーバー側プログラミングチュートリアルを参照してください。
たとえば、ここに「Hello World」のストアド プロシージャがあります。
var helloWorldStoredProc = {
id: "helloWorld",
body: function () {
var context = getContext();
var response = context.getResponse();
response.setBody("Hello, World");
}
}
次の例では、ストアド プロシージャ内にドキュメントを作成します。
{
id: "createMyDocument",
body: function createMyDocument(documentToCreate) {
var context = getContext();
var collection = context.getCollection();
var accepted = collection.createDocument(collection.getSelfLink(),
documentToCreate,
function (err, documentCreated) {
if (err) throw new Error('Error' + err.message);
context.getResponse().setBody(documentCreated.id)
});
if (!accepted) return;
}
}
次の例では、ストアド プロシージャ内で 2 つの項目が入れ替えられます。
// JavaScript source code
var exchangeItemsSproc = {
name: "exchangeItems",
body: function (playerId1, playerId2) {
var context = getContext();
var collection = context.getCollection();
var response = context.getResponse();
var player1Document, player2Document;
// query for players
var filterQuery = 'SELECT * FROM Players p where p.id = "' + playerId1 + '"';
var accept = collection.queryDocuments(collection.getSelfLink(), filterQuery, {},
function (err, documents, responseOptions) {
if (err) throw new Error("Error" + err.message);
if (documents.length != 1) throw "Unable to find both names";
player1Document = documents[0];
var filterQuery2 = 'SELECT * FROM Players p where p.id = "' + playerId2 + '"';
var accept2 = collection.queryDocuments(collection.getSelfLink(), filterQuery2, {},
function (err2, documents2, responseOptions2) {
if (err2) throw new Error("Error" + err2.message);
if (documents2.length != 1) throw "Unable to find both names";
player2Document = documents2[0];
swapItems(player1Document, player2Document);
return;
});
if (!accept2) throw "Unable to read player details, abort ";
});
if (!accept) throw "Unable to read player details, abort ";
// swap the two players’ items
function swapItems(player1, player2) {
var player1ItemSave = player1.item;
player1.item = player2.item;
player2.item = player1ItemSave;
var accept = collection.replaceDocument(player1._self, player1,
function (err, docReplaced) {
if (err) throw "Unable to update player 1, abort ";
var accept2 = collection.replaceDocument(player2._self, player2,
function (err2, docReplaced2) {
if (err) throw "Unable to update player 2, abort"
});
if (!accept2) throw "Unable to update player 2, abort";
});
if (!accept) throw "Unable to update player 1, abort";
}
}
}
タスク
ストアド プロシージャでは、次の操作を実行できます。
ストアド プロシージャの実行など、ストアド プロシージャの動作の詳細については、「 Azure Cosmos DB プログラミング: ストアド プロシージャ、トリガー、UDF」を参照してください。