Saving & Testing Stored Procedures/Triggers (maybe User Defined Functions) For Partitioned Collections

杀马特。学长 韩版系。学妹 提交于 2019-12-11 05:19:04

问题


I'm receiving the following error when attempting save modifications to a Stored Procedure that has been created within a partitioned collection:

Failed to save the script

Here is the details from within the Azure Portal:

Operation name Failed to save the script Time stamp Fri Feb 17 2017 08:46:32 GMT-0500 (Eastern Standard Time) Event initiated by - Description Database Account: MyDocDbAccount, Script: bulkImport, Message: {"code":400,"body":"{\"code\":\"BadRequest\",\"message\":\"Replaces and upserts for scripts in collections with multiple partitions are not supported.

The Stored Procedure in question is the example "bulkImport" script that can be found here.


回答1:


There is a known missing capability (bug, if you prefer) in DocumentDB right now where you cannot update existing stored procedures in a partitioned collection. The workaround is to delete it first and then recreate it under the same name/id.




回答2:


Contrary to the error message, it turns out that _client.ReplaceStoredProcedureAsync(...) does work (as of June 2018) on partitioned collections. So you can do something like this:

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

Once your SP gets created the 1st time, you will never have any time quanta when it isn't available (due to deletion + recreation).




回答3:


This extension method can handle add or update of a stored procedure.

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);
    }
}



回答4:


As of now, updating a stored procedure still does not work in Azure Portal / CosmosDB Data explorer. There is a Cosmos DB Extension for Visual Studio Code where this works. However I don't see a way of executing the procedure from the extension like I can from Data Explorer.



来源:https://stackoverflow.com/questions/42299815/saving-testing-stored-procedures-triggers-maybe-user-defined-functions-for-p

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!