Forum Discussion
Truncate/Delete Registros do Contêiner Cosmos DB
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
- 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"
- Adicione uma nova etapa e escolha a ação "Execute stored procedure"
- 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'
- 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)
- Agora salve o aplicativo. Após salvar, uma URL HTTP POST será gerada no gatilho, copie essa URL para uso no ADF.
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 {}
- 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)
F I M