次の方法で共有


Azure Cosmos DB でストアド プロシージャ、トリガー、およびユーザー定義関数を登録および使用する方法

適用対象: NoSQL

Azure Cosmos DB の NoSQL 用 API は、JavaScript で記述されたストアド プロシージャ、トリガー、およびユーザー定義関数 (UDF) の登録および呼び出しをサポートします。 1 つ以上のストアド プロシージャ、トリガー、または UDF を定義したら、データ エクスプローラーを使用して Azure portal で読み込んで表示できます。

これらのタスクを実行するには、.NET v2 (レガシ)、.NET v3JavaJavaScript、Python SDK など、複数のプラットフォームで NoSQL SDK 用 API を使用できます。 これらの SDK を使用したことがない場合は、該当する SDK のクイックスタートの記事を参照してください。

SDK クイック スタート
.NET v3 NoSQL 用 Azure Cosmos DB クライアント ライブラリ for .NET
Java Azure Cosmos DB for NoSQL データを管理する Java アプリを構築する
JavaScript Node.js用 Azure Cosmos DB for NoSQL クライアント ライブラリ
Python Python 用 Azure Cosmos DB for NoSQL クライアント ライブラリ

重要

次のコード サンプルでは、既に client 変数と container 変数があることを前提としています。 これらの変数を作成する必要がある場合は、プラットフォームに適したクイックスタートをご覧ください。

ストアド プロシージャの実行方法

ストアド プロシージャは JavaScript を使用して記述されます。 これらは Azure Cosmos DB コンテナー内部で作成、更新、読み取り、クエリの実行、および削除できます。 詳細については、「ストアド プロシージャを記述する方法」を参照してください。

次の例では、Azure Cosmos DB SDK を使用してストアド プロシージャを登録および呼び出す方法を示します。 spCreateToDoItem.js として保存 されたこの例のソースについては、「 ストアド プロシージャを使用して項目を作成する」を参照してください。

Note

パーティション分割されたコンテナーの場合、ストアド プロシージャを実行するとき、要求オプションにパーティション キー値を指定する必要があります。 ストアド プロシージャは常に 1 つのパーティション キーに範囲設定されます。 別のパーティション キー値を持つ項目は、ストアド プロシージャから認識できません。 この原則は、トリガーにも当てはまります。

次の例は、.NET SDK v2 を使用してストアド プロシージャを登録する方法を示しています。

string storedProcedureId = "spCreateToDoItems";
StoredProcedure newStoredProcedure = new StoredProcedure
   {
       Id = storedProcedureId,
       Body = File.ReadAllText($@"..\js\{storedProcedureId}.js")
   };
Uri containerUri = UriFactory.CreateDocumentCollectionUri("myDatabase", "myContainer");
var response = await client.CreateStoredProcedureAsync(containerUri, newStoredProcedure);
StoredProcedure createdStoredProcedure = response.Resource;

次のコードは、.NET SDK v2 を使用してストアド プロシージャを呼び出す方法を示しています。

dynamic[] newItems = new dynamic[]
{
    new {
        category = "Personal",
        name = "Groceries",
        description = "Pick up strawberries",
        isComplete = false
    },
    new {
        category = "Personal",
        name = "Doctor",
        description = "Make appointment for check up",
        isComplete = false
    }
};

Uri uri = UriFactory.CreateStoredProcedureUri("myDatabase", "myContainer", "spCreateToDoItem");
RequestOptions options = new RequestOptions { PartitionKey = new PartitionKey("Personal") };
var result = await client.ExecuteStoredProcedureAsync<string>(uri, options, new[] { newItems });

プリトリガーを実行する方法

次の例は、Azure Cosmos DB SDK を使用してプリトリガーを登録して呼び出す方法を示しています。 このプリトリガーの例のソース ( trgPreValidateToDoItemTimestamp.jsとして保存) については、「 プリトリガー」を参照してください。

PreTriggerIncludeを指定して操作を実行し、List オブジェクトでトリガーの名前を渡すと、RequestOptions オブジェクトに事前トリガーが渡されます。

Note

トリガーの名前が List として渡される場合でも、操作ごとにトリガーを 1 つだけ実行することができます。

次のコードは、.NET SDK v2 を使用してプリトリガーを登録する方法を示しています。

string triggerId = "trgPreValidateToDoItemTimestamp";
Trigger trigger = new Trigger
{
    Id =  triggerId,
    Body = File.ReadAllText($@"..\js\{triggerId}.js"),
    TriggerOperation = TriggerOperation.Create,
    TriggerType = TriggerType.Pre
};
Uri containerUri = UriFactory.CreateDocumentCollectionUri("myDatabase", "myContainer");
await client.CreateTriggerAsync(containerUri, trigger);

次のコードは、.NET SDK v2 を使用してプリトリガーを呼び出す方法を示しています。

dynamic newItem = new
{
    category = "Personal",
    name = "Groceries",
    description = "Pick up strawberries",
    isComplete = false
};

Uri containerUri = UriFactory.CreateDocumentCollectionUri("myDatabase", "myContainer");
RequestOptions requestOptions = new RequestOptions { PreTriggerInclude = new List<string> { "trgPreValidateToDoItemTimestamp" } };
await client.CreateDocumentAsync(containerUri, newItem, requestOptions);

ポストトリガーの実行方法

次の例では、Azure Cosmos DB SDK を使用してポストトリガーを登録する方法を示します。 このポストトリガー (trgPostUpdateMetadata.js として保存) の例のソースについては、「ポストトリガー」を参照してください

次のコードは、.NET SDK v2 を使用してポストトリガーを登録する方法を示しています。

string triggerId = "trgPostUpdateMetadata";
Trigger trigger = new Trigger
{
    Id = triggerId,
    Body = File.ReadAllText($@"..\js\{triggerId}.js"),
    TriggerOperation = TriggerOperation.Create,
    TriggerType = TriggerType.Post
};
Uri containerUri = UriFactory.CreateDocumentCollectionUri("myDatabase", "myContainer");
await client.CreateTriggerAsync(containerUri, trigger);

次のコードは、.NET SDK v2 を使用してポストトリガーを呼び出す方法を示しています。

var newItem = { 
    name: "artist_profile_1023",
    artist: "The Band",
    albums: ["Hellujah", "Rotators", "Spinning Top"]
};

RequestOptions options = new RequestOptions { PostTriggerInclude = new List<string> { "trgPostUpdateMetadata" } };
Uri containerUri = UriFactory.CreateDocumentCollectionUri("myDatabase", "myContainer");
await client.createDocumentAsync(containerUri, newItem, options);

ユーザー定義関数を操作する方法

次の例は、Azure Cosmos DB SDK を使用して UDF を登録する方法を示しています。 udfTax.js として保存 されているこの例のソースについては、「 ユーザー定義関数を記述する方法」を参照してください。

次のコードは、.NET SDK v2 を使用してユーザー定義関数を登録する方法を示しています。

string udfId = "Tax";
var udfTax = new UserDefinedFunction
{
    Id = udfId,
    Body = File.ReadAllText($@"..\js\{udfId}.js")
};

Uri containerUri = UriFactory.CreateDocumentCollectionUri("myDatabase", "myContainer");
await client.CreateUserDefinedFunctionAsync(containerUri, udfTax);

次のコードは、.NET SDK v2 を使用してユーザー定義関数を呼び出す方法を示しています。

Uri containerUri = UriFactory.CreateDocumentCollectionUri("myDatabase", "myContainer");
var results = client.CreateDocumentQuery<dynamic>(containerUri, "SELECT * FROM Incomes t WHERE udf.Tax(t.income) > 20000"));

foreach (var result in results)
{
    //iterate over results
}

次のステップ