你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

如何在 Azure Cosmos DB 中注册和使用存储过程、触发器与用户定义的函数

适用于: SQL API

Azure Cosmos DB 中的 SQL API 支持注册和调用以 JavaScript 编写的存储过程、触发器与用户定义函数 (UDF)。 在定义一个或多个存储过程、触发器和用户定义的函数之后,可以使用数据资源管理器在 Azure 门户中加载和查看它们。

SQL API SDK 可用于各种平台和编程语言。 如果你未使用过,

可以跨多个平台使用 SQL API SDK 来执行这些任务,包括 .NET v2(旧版).NET v3JavaJavaScriptPython SDK。 如果以前未使用过其中一个 SDK,请参阅相应 SDK 的“快速入门”文章:

SDK 入门
.NET v3 快速入门:生成 .NET 控制台应用以管理 Azure Cosmos DB SQL API 资源
Java 快速入门:生成 Java 应用以管理 Azure Cosmos DB SQL API 数据
JavaScript 快速入门:使用 Node.js 连接和查询 Azure Cosmos DB SQL API 帐户中的数据
Python 快速入门:使用 Azure Cosmos DB SQL API 帐户生成 Python 应用程序

如何运行存储过程

存储过程是使用 JavaScript 编写的。 它们可以在 Azure Cosmos 容器中创建、更新、读取、查询和删除项。 有关如何在 Azure Cosmos DB 中编写存储过程的详细信息,请参阅如何在 Azure Cosmos DB 中编写存储过程一文。

以下示例演示如何使用 Azure Cosmos DB SDK 注册和调用存储过程。 请参阅创建文档,因为此存储过程的源代码保存为 spCreateToDoItem.js

注意

对于已分区的容器,在执行存储过程时,必须在请求选项中提供分区键值。 存储过程的范围始终限定为分区键。 存储过程看不到具有不同分区键值的项。 这一点也适用于触发器。

以下示例演示如何使用 .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 在前触发器中传入 RequestOptions 对象,然后在 List 对象中传递该触发器的名称。

注意

即使以列表的形式传递触发器的名称,也仍只能对每个操作执行一个触发器。

以下代码演示如何使用 .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 注册用户定义的函数。 请参阅用户定义的函数示例,因为此后触发器的源代码保存为 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
}

后续步骤

详细了解概念以及如何在 Azure Cosmos DB 中编写或使用存储过程、触发器和用户定义的函数: