Truncate/Delete Registros do Contêiner Cosmos DB

Copper Contributor

 

O Objetivo da discussão é apenas passar o conhecimento de como deletar os registros no Cosmo DB, se alguém tiver outra ideia, pode compartilhar a informação.

 

Informação para quem já faz a criação de solução de engenharia de dados do Azure usando o Azure Data Factory como uma ferramenta de orquestração e o Azure Cosmos DB em um cenário em que talvez seja necessário excluir documentos de um contêiner SQL, você já deve ter percebido que há não é uma maneira fácil de fazê-lo.

  • O Azure Data Factory, pronto para uso, fornece apenas atividades de movimentação de dados de/para o Cosmos DB
  • O Data Factory ( até este momento 02/04/2022 ) não tem as atividades para executar procedimentos armazenados do Cosmos DB ou excluir documentos em um contêiner SQL.

Essa postagem é para você que já usa o Azure Data Factory, Azure Cosmos DB (SQL API) e Azure Logic Apps. 

 

C O S M O S      D B

 

Fluxo de trabalho de alto nível para fazer isso

  1. Crie uma "Stored Procedure" no contêiner do Cosmos DB que execute uma consulta de seleção e exclua os dados necessários. Segue abaixo o código simples e fácil de usar.

    function bulkDeleteSproc(query) {

        var collection = getContext().getCollection();

        var collectionLink = collection.getSelfLink();

        var response = getContext().getResponse();

        var responseBody = {

            deleted: 0,

            continuation: true

        };

        if (!query) throw new Error("Consulta inválida!!!");

        tryQueryAndDelete();

        function tryQueryAndDelete(continuation) {

            var requestOptions = {continuation: continuation};

            var isAccepted = collection.queryDocuments(collectionLink, query, requestOptions, function (err, retrievedDocs, responseOptions) {

                if (err) throw err;

                if (retrievedDocs.length > 0) {

                    tryDelete(retrievedDocs);

                } else if (responseOptions.continuation) {

                    tryQueryAndDelete(responseOptions.continuation);

                } else {

                    responseBody.continuation = false;

                    response.setBody(responseBody);

                }

            });

            if (!isAccepted) {

                response.setBody(responseBody);

            }

        }

        function tryDelete(documents) {

            if (documents.length > 0) {

                var isAccepted = collection.deleteDocument(documents[0]._self, {}, function (err, responseOptions) {

                    if (err) throw err;

                    responseBody.deleted++;

                    documents.shift();

                    tryDelete(documents);

                });

                if (!isAccepted) {

                    response.setBody(responseBody);

                }

            } else {

                tryQueryAndDelete();

            }

        }

    }

 

  • Configure um Aplicativo Lógico do Azure para executar o procedimento armazenado quando uma solicitação HTTP for recebida.

  • Configure um pipeline de Data Factory para usar a atividade da Web para invocar o aplicativo lógico.

 

L O G I C      A P P S 

 

  • Abra o Logic Apps e selecione um template em branco.

  • Adicione a trigger "When a HTTP request is received"

                                                                                                  leonardorocha_0-1648930672787.png

 

 

 

  • Adicione uma nova etapa e escolha a ação "Execute stored procedure"

leonardorocha_1-1648930794267.png

 

 

  • Navegue pela assinatura atual e conecte-se ao cosmos db. Insira 'ID do banco de dados', 'ID da coleção', 'ID Sproc', 'Valor da chave de partição', 'parâmetros'

    leonardorocha_3-1648930930798.png

 

  • Adicione uma nova ação de solicitação “Response” da etapa e adicione conteúdo dinâmico no Body. Este Body retornará a resposta da procedure quando executado (consulte o exemplo de resposta acima)

    leonardorocha_4-1648931044404.png

     

  • Agora salve o aplicativo. Após salvar, uma URL HTTP POST será gerada no gatilho, copie essa URL para uso no ADF.

leonardorocha_5-1648931113168.png

 

 

D A T A      F A C T O R Y

 

  • Para executar o Logic App do Azure Data Factory, precisamos enviar uma solicitação HTTP para o aplicativo e isso é possível usando a atividade da web.
  • Pode ser necessário executar o sproc BulkDelete várias vezes (dependendo se o sproc é capaz de excluir todos os documentos dentro do limite de tempo limite de execução)
  • Para garantir a exclusão de todos os documentos, executaremos essa atividade da Web dentro de uma atividade Até que a condição (a resposta do sproc deve ser "excluída: 0") seja atendida
  • Adicione uma atividade Until ao pipeline e nomeie-a como “UntilAllDocsDeleted”
  • Adicione uma atividade da Web dentro da atividade Until e nomeie-a como “Delete”
  • Cole o URL copiado do aplicativo lógico nas configurações da atividade da Web, use o método POST e o corpo contém {}

leonardorocha_0-1648931659805.png

 

  • Agora vamos adicionar a condição na atividade Até para que a atividade da Web seja executada várias vezes até que a condição seja atendida.
@equals(0,activity('Delete').output.deleted)

leonardorocha_1-1648931702732.png

 

 

F I M

 

0 Replies