Se você desenvolve para o Dataverse, tenho certeza que em certo momento precisou fazer alguma ação como importar um carga de dados ou atualizar uma massa de dados, porém precisa que plugins ou workflows customizados não sejam executados para não ocorrer ações desnecessárias ou para não gerar inconsistência de dados.
Para resolver essa situação a plataforma tem 3 opções que podem ser incluídas na sua requisição realizada ao Dataverse, que vão auxiliar a evitar a execução de fluxos de trabalho ou plugins.
BypassBusinessLogicExecution | Permite ignorar plugins e fluxos de trabalho síncronos e a assíncronos. |
BypassBusinessLogicExecutionStepIds | Permite ignorar especificamente etapas de plugins desejadas. |
BypassCustomPluginExecution | Ingora somente plugins síncronos e fluxo de trabalho em tempo real. |
Essas opções somente ignoram processos customizados, ou seja, criado por você ou por terceiros. Processos que são parte do core do Dataverse ou que são do publicador da Microsoft não podem ser ignorados para evitar problemas na ferramenta e até mesmo inconsistência de dados.
Para todas as opções acima o usuário que estiver realizando a requisição precisa ter o privilégio para informar essas opções. Infelizmente esses privilégios não estão disponíveis a nível de interface gráfica, então você precisa ter uma fluxo de nuvem ou um código que realize essa ação. Abaixo coloco exemplo de como aplicar o privilégio.
Nome | ID | Paramêtros |
---|---|---|
prvBypassCustomBusinessLogic | 0ea552b0-a491-4470-9a1b-82068deccf66 | BypassBusinessLogicExecution BypassBusinessLogicExecutionStepIds |
prvBypassCustomPlugins | 148a9eaf-d0c4-4196-9852-c3a38e35f6a1 | BypassCustomPluginExecution |
static void IncluirPrivilegioNoDireitoDeAcesso(IOrganizationService service, Guid roleId)
{
var request = new AddPrivilegesRoleRequest
{
RoleId = roleId,
Privileges = new[]{
new RolePrivilege{
PrivilegeId = new Guid("0ea552b0-a491-4470-9a1b-82068deccf66"),
Depth = PrivilegeDepth.Global
}
}
};
service.Execute(request);
}
BypassBusinessLogicExecution
Essa opção permite que você defina qual o tipo de execução que você deseja ignorar, processos síncronos ou assíncronos. Para ignorar processos síncronos o valor CustomSync deverá ser incluído e para processo assíncrono o valor CustomAsync deverá ser informado.
Caso deseja incluir ambos basta informar CustomSync,CustomAsync juntos para ignorar ambos processos.
Para utilizar é bem simples, somente precisamos incluir na requisição a informação.
static void CriarContatoSemProcessos(IOrganizationService service){
Entity contato = new Entity("contact");
contato["firstname"] = "Michael";
contato["lastname"] = "Pereira";
contato["mobilephone"] = "55123456789"
//criamos o request
CreateRequest request = new CreateRequest(){
Target = contato
};
//definimos o parâmetro
request.Parameters.Add("BypassBusinessLogicExecution","CustomSync,CustomAsync");
service.Execute(request);
}
BypassBusinessLogicExecutionStepIds
Já essa opção você define quais as etapas de plugin que você deseja informar através do Id de cada uma. Para saber o Id de uma etapa de de plugin, podemos utilizar o plugin registration tool para obter a informação.
Para utilizar é da mesma forma que o anterior, porém aqui informaremos os Ids nos parâmetros. Podemos passar mais de um Id na mesma requisição, somente precisamos separar por “,”. Recomenda-se ignorar no máximo 10 etapas de plugin em um única requisição.
static void CriarContatoSemProcessos(IOrganizationService service){
Entity contato = new Entity("contact");
contato["firstname"] = "Michael";
contato["lastname"] = "Pereira";
contato["mobilephone"] = "55123456789"
//criamos o request
CreateRequest request = new CreateRequest(){
Target = contato
};
//definimos o parâmetro
//podemos passar
request.Parameters.Add("BypassBusinessLogicExecutionStepIds","c2c5bb1b-ea3e-db11-86a7-000a3a5473e8,4ab978b0-1d77-ec11-8d21-000d3a554d57");
service.Execute(request);
}
BypassCustomPluginExecution
Essa é a última opção e não recomendada, pois será depreciada, ela somente ignora processos síncronos.
Exemplo de como utilizar.
static void CriarContatoSemProcessos(IOrganizationService service){
Entity contato = new Entity("contact");
contato["firstname"] = "Michael";
contato["lastname"] = "Pereira";
contato["mobilephone"] = "55123456789"
//criamos o request
CreateRequest request = new CreateRequest(){
Target = contato
};
//definimos o parâmetro
//podemos passar
request.Parameters.Add("BypassCustomPluginExecution",true);
service.Execute(request);
}
Espero que essa dica tenha sido útil para você, pois agora você poderá controlar quais plugins ou workflows que precisam ser ignorados durante um processo de carga ou atualização em massa de registros, assim evitando uma grande dor de cabeça ?.