Azure 储蓄及;为分区集合测试存储过程/触发器(可能是用户定义的函数)

Azure 储蓄及;为分区集合测试存储过程/触发器(可能是用户定义的函数),azure,azure-cosmosdb,Azure,Azure Cosmosdb,尝试保存对已在分区集合中创建的存储过程的修改时,我收到以下错误: 保存脚本失败 以下是Azure门户中的详细信息: 操作名称未能保存脚本时间戳2017年2月17日星期五 08:46:32 GMT-0500(东部标准时间)事件由发起 -说明数据库帐户:MyDocDbAccount,脚本:bulkImport,消息:{“code”:400,“body”:“{\“code\”:\“BadRequest\”,\“Message\”:\”替换 在具有多个分区的集合中,脚本的upsert是 不支持 所讨论的

尝试保存对已在分区集合中创建的存储过程的修改时,我收到以下错误:

保存脚本失败

以下是Azure门户中的详细信息:

操作名称未能保存脚本时间戳2017年2月17日星期五 08:46:32 GMT-0500(东部标准时间)事件由发起 -说明数据库帐户:MyDocDbAccount,脚本:bulkImport,消息:{“code”:400,“body”:“{\“code\”:\“BadRequest\”,\“Message\”:\”替换 在具有多个分区的集合中,脚本的upsert是 不支持


所讨论的存储过程是可以找到的示例“bulkImport”脚本。

有一个已知的功能缺失(bug,如果您愿意的话)现在在DocumentDB中,您无法更新分区集合中的现有存储过程。解决方法是先删除它,然后以相同的名称/id重新创建它。

与错误消息相反,事实证明,
\u client.ReplaceStoredProcedureAsync(…)
确实有效(截至2018年6月)在分区集合上。因此您可以执行以下操作:

try 
{
    await _client.CreateStoredProcedureAsync(...);
} 
catch(DocumentClientException dex) when (dex.StatusCode == HttpStatusCode.Conflict) 
{ 
    await _client.ReplaceStoredProcedureAsync(...);  
} 

一旦您的SP第一次被创建,您将永远不会有它不可用的时间量(由于删除+重新创建)。

此扩展方法可以处理存储过程的添加或更新

public static async Task AddOrUpdateProcedure(this DocumentClient client, 
    string databaseId, 
    string collectionId, 
    string storedProcedureId, 
    string storedProcedureBody)
{
    try
    {
        var documentCollectionUri = UriFactory.CreateDocumentCollectionUri(databaseId, collectionId);
        await client.CreateStoredProcedureAsync(documentCollectionUri, new StoredProcedure
        {
            Id = storedProcedureId,
            Body = storedProcedureBody
        });
    }
    catch (DocumentClientException ex) when (ex.StatusCode == HttpStatusCode.Conflict)
    {
        var storedProcedureUri = UriFactory.CreateStoredProcedureUri(databaseId, collectionId, storedProcedureId);
        var storedProcedure = await client.ReadStoredProcedureAsync(storedProcedureUri);
        storedProcedure.Resource.Body = storedProcedureBody;
        await client.ReplaceStoredProcedureAsync(storedProcedure);
    }
}

到目前为止,更新存储过程在Azure Portal/CosmosDB数据资源管理器中仍然不起作用。Visual Studio代码中有一个Cosmos DB扩展,它可以起作用。但是,我看不到一种从扩展执行过程的方法,就像我从数据资源管理器执行过程一样。

似乎这是很自然的,你不能执行repl对它的访问(从逻辑上讲,您需要先删除,然后添加).No?Thx Larry!在花了一些时间这样做之后,我决定花一些时间将此发布到社区。在任何部署过程中,使用删除和重新创建可能会导致停机!如果已准备就绪,则始终创建并忽略如何?对于SP中的任何更改,如果不需要更改,唯一的方法是更改SP名称ntime deployment and multiple instances of services running!@SurenderSinghMalik请注意,在创建SP时查看响应,一个集合中可以创建多少个不同的SP有一个配额,默认值似乎是100-如果您继续创建新SP,您可能会很快达到该配额。是的,支持替换scrip分区集合中的ts是在2018年初左右添加的。@MichaelKoltachev我在2019年3月的最新客户端中仍然收到此错误。@Jazaret-确保您使用的是最新版本的CosmosDB SDK。我已经验证了这一点,从今天起就可以正常工作。
                  try
                    {
                        var spResponse = await dbClient.CreateStoredProcedureAsync($"/dbs/{dataRepoDatabaseId}/colls/{collectionName}", new StoredProcedure
                        {
                            Id = sp.Item1,
                            Body = sp.Item2
                        }, new RequestOptions { PartitionKey = new PartitionKey(partitionKey) });

                    }
                    catch (DocumentClientException dex) when (dex.StatusCode == HttpStatusCode.Conflict)
                    {
                        //Fetch the resource to be updated
                        StoredProcedure sproc = dbClient.CreateStoredProcedureQuery($"/dbs/{dataRepoDatabaseId}/colls/{collectionName}")
                                                         .Where(r => r.Id == sp.Item1)
                                                         .AsEnumerable()
                                                         .SingleOrDefault();
                        if(!sproc.Body.Equals( sp.Item2))
                        {
                            sproc.Body = sp.Item2;

                            StoredProcedure updatedSPResponse = await dbClient.ReplaceStoredProcedureAsync(sproc);

                        }
                    }