Executar scripts X++ personalizados com tempo de inatividade zero
Importante
Some or all of the functionality noted in this article is available as part of a preview release. The content and the functionality are subject to change. For more information about preview releases, see Service update availability.
Esta funcionalidade permite-lhe carregar e executar pacotes implementáveis que contenham scripts X++ personalizados sem ter de passar pelos Microsoft Dynamics Lifecycle Services (LCS) ou suspender o seu sistema. Portanto, pode corrigir pequenas inconsistências de dados sem causar qualquer tempo de inatividade disruptivo.
O benefício de usar um script X++ para corrigir pequenas inconsistências de dados é que o sistema irá ajustar automaticamente todas as tabelas relacionadas conforme necessário quando executa o script. Esta abordagem ajuda a garantir a integridade da correção e ajuda a minimizar o risco de introduzir novas inconsistências.
Importante
Esta funcionalidade destina-se apenas à correção de pequenas inconsistências de dados. Não deve ser utilizada para os seguintes fins ou para qualquer outro fim:
- Recolha de dados
- Alterações de esquema
- Migração de dados ou outros processos de longo prazo
- Correção de dados que podem ser corrigidos através de outros meios, tais como processos de negócio regulares, ferramentas de consistência de dados ou outras ferramentas personalizadas
A funcionalidade permite que os utilizadores autorizados alterem diretamente as entidades e os seus registos, sem terem de executar a lógica de negócio que está associada a essas entidades. Estas alterações podem causar problemas de integridade dos dados. Portanto, a sua organização pode exigir que obtenha a aprovação de auditores internos e externos (ou outros intervenientes equivalentes) antes e/ou depois de executar um script. Por razões de conformidade, as alterações que afetam algumas características também podem ter de ser divulgadas em relatórios externos (como demonstrações financeiras) ou comunicadas às autoridades governamentais. A sua organização é a única responsável por quaisquer alterações que sejam feitas aos seus dados através desta funcionalidade, qualquer aprovação e aprovação ou divulgação dessas alterações, bem como o cumprimento das leis aplicáveis. Todos os riscos associados à utilização desta funcionalidade são suportados por si.
Todos os pacotes implementáveis carregados para o sistema passam por um fluxo de trabalho obrigatório. Como precaução de segurança, e para ajudar a garantir a separação de funções, o utilizador que carrega um pacote passível de implementação não está autorizado a aprová-lo para os próximos passos no fluxo de trabalho. Outro utilizador deve aprová-lo. No entanto, após a aprovação do pacote, o utilizador que efetuou o carregamento será autorizado a completar os restantes passos.
O sistema requer que todos os pacotes implantáveis passem por uma execução de teste. Antes de o script ser autorizado a ser executado em dados de produção, um utilizador deve validar que a saída está correta selecionando Aceitar registo de teste. Se a saída não estiver correta, o utilizador deve marcar o pacote como falhado selecionando Abandono. Neste caso, o script não poderá ser executado em dados de produção.
Cada pacote carregado é guardado no sistema e passa por um fluxo de trabalho de eventos definido. Para cada evento, o sistema mantém um registo que inclui um carimbo de data/hora e a identidade da pessoa que realizou o evento. Desta forma, o sistema garante que existe um registo de auditoria.
Como mostra a seguinte ilustração, o sistema fornece detalhes sobre como cada pacote passível de implementação foi executado em X++ e que entidades foram tocadas.
Atribuir direitos aos utilizadores para controlar o acesso
Esta funcionalidade proporciona as seguintes funções. Os administradores podem utilizar estas funções para ajudar a controlar o acesso à funcionalidade.
- Manter scripts personalizados – Esta função garante a capacidade de carregar, testar, verificar e executar scripts X++ personalizados em ambientes (teste de aceitação do utilizador [UAT] e produção).
- Aprovar scripts personalizados – Esta função garante a capacidade de aprovar um script X++ personalizado carregado. A aprovação é um passo obrigatório antes de qualquer script ser testado, verificado e executado.
Para ajudar a minimizar o risco de ação maliciosa, cada script deve ser explicitamente aprovado por um utilizador que não seja o utilizador que o carregou. Antes de poder utilizar esta funcionalidade na sua organização, um administrador deve atribuir as funções anteriores a pelo menos dois utilizadores relevantes e altamente confiáveis. Apesar de um único utilizador poder ter ambos os direitos, ainda assim, esse utilizador não poderá aprovar os seus próprios scripts.
Criar um pacote passível de implementação
A funcionalidade requer um pacote regular passível de implementação que possa ser criado no Visual Studio. Para obter instruções, consulte Criar pacotes de modelos passíveis de implementação.
O seu pacote passível de implementação deve conter exatamente uma classe X++ executável. Por outras palavras, deve ter uma classe que inclua um método que tenha a seguinte assinatura.
public static void main(Args _args)
Nota
O nome do método principal tem de estar em minúsculas.
Exemplo de código
O seguinte exemplo de código mostra como um pacote passível de implementação pode ser estruturado.
class MyScriptClassForIssueXYZ
{
public static void main(Args _args)
{
if (curExt() != 'DAT')
{
throw error("This script must run in the DAT company!");
}
ttsbegin;
MyTable myTable;
update_recordset myTable
setting myField = 17
where myTable.myReference == 'xyz';
if (myTable.RowCount() != 1)
{
throw error("Not updating the expected row!");
}
info("Success");
ttscommit;
}
}
Melhores práticas
A lista que se segue descreve algumas melhores práticas para escrever, implementar e executar um script com êxito. A lista não é exaustiva e deve ser considerada apenas como orientação.
- Escreva uma mensagem de êxito no final do script. Desta forma, poderá ver que o script foi executado sem exceções.
- Adicione o tratamento explícito do âmbito de transação.
- Utilize a lógica de negócio existente, como métodos
update()
, mas não ignore a lógica do negócio utilizando métodosdoUpdate()
,doInsert()
edoDelete()
. Esta abordagem ajudará a garantir que os dados dependentes são tratados corretamente. Também reduzirá significativamente o risco de novas inconsistências de dados. - Declare o contexto da empresa. Esta abordagem exporá erros comuns à medida que um script é executado. Por exemplo, irá revelar se o script está a ser executado na empresa errada.
- Declare que o número de registos afetados corresponde às suas expectativas. Esta abordagem irá revelar se os dados mudaram inesperadamente no sistema enquanto o script estava a ser preparado.
- Utilize nomes de classe exclusivos para cada script (por exemplo, incluindo uma referência a um item de trabalho no nome). Esta abordagem evitará problemas de conflito de nomes quando carregar o script. Se for necessária uma nova iteração de um script, não se esqueça de lhe atribuir um novo nome.
- Teste primeiro cada script num ambiente de não produção. Teste quanto ao impacto pretendido e quanto a efeitos colaterais não intencionais em dados relacionados. Certifique-se de que todos os processos de negócio que possam ser afetados podem ser totalmente concluídos com êxito posteriormente.
Carregue e execute um pacote passível de implementação
Utilize o seguinte procedimento para carregar e executar um script.
Na sua aplicação de Finanças e Operações, aceda a Administração do sistema > Tarefas periódicas > Base de dados > Scripts personalizados.
Selecione Carregar.
Selecione o pacote passível de implementação que criou, como descrito anteriormente neste tópico. Ser-lhe-á solicitado que especifique o propósito do script.
O script tem agora de ser aprovado por um utilizador que não seja o utilizador que o carregou. O aprovador deve seguir estes passos:
- Aceda a Administração de scripts > Periódicos > Base de dados > Scripts personalizados.
- Selecione o script a aprovar e, em seguida, selecione Detalhes.
- No Painel de Ações, no separador Fluxo de trabalho do processo, no grupo Iniciar, selecione Aprovar ou Rejeitar. Se selecionar Aprovar, o script é marcado como aprovado e desbloqueado para testes. Se selecionar Rejeitar, o script é bloqueado. Em ambos os casos, o evento é registado e uma cópia do script é mantida no sistema.
O script deve ser testado para garantir que faz o que pretende fazer. O testador pode ser a mesma pessoa que o carregador ou o aprovador, ou pode ser um terceiro utilizador que tenha as permissões necessárias. O testador deve seguir estes passos:
Aceda a Administração de scripts > Periódicos > Base de dados > Scripts personalizados.
Selecione o script a testar e, em seguida, selecione Detalhes.
No Painel de Ações, no separador Fluxo de trabalho do processo, no grupo Teste, selecione Executar teste. O script é executado dentro de uma transação temporária que o sistema aborta automaticamente enquanto recolhe vários registos e instruções do SQL.
Quando o script terminar de ser executado, reveja os registos e verifique se os resultados correspondem às suas expectativas. Siga um destes passos:
- Se estiver satisfeito com o resultado do teste, selecione Aceitar o registo de teste no grupo Teste no separador Fluxo de trabalho do processo no Painel de Ações para permitir a execução do script. O registo de eventos refletirá o facto de que o script foi testado e indicará quem o testou e quando.
- Se não estiver satisfeito com o resultado do teste, selecione Abandonar no grupo Terminar no separador Fluxo de trabalho do processo no Painel de Ações para impedir a execução do script. O sistema manterá uma cópia do script juntamente com um registo da respetivo histórico.
Quando tiver a certeza de que o script corresponde às suas expectativas, selecione Executar no grupo Executar no separador Fluxo de trabalho do processo no Painel de Ações para o executar. Este comando faz o mesmo que o teste anterior, mas a transação será consolidada no final.
Depois de o script ter terminado de ser executado, verifique o resultado e confirme que o script funcionou como pretendia. Siga um destes passos:
- Se estiver satisfeito com o resultado, selecione Finalidade resolvida no grupo Terminar no separador Fluxo de trabalho do processo no Painel de Ações. O registo de eventos refletirá o facto de que o script foi executado com êxito e indicará quem verificou o script e quando. O script é guardado, mas agora está bloqueado e não pode ser executado novamente.
- Se não estiver satisfeito com o resultado, selecione Finalidade não resolvida no grupo Terminar no separador Fluxo de trabalho do processo no Painel de Ações. O registo de eventos refletirá o facto de que o script não cumpriu a finalidade pretendida e indicará quem executou o script e quando. O script é guardado, mas agora está bloqueado e não pode ser executado novamente. No entanto, o sistema não anula automaticamente a ação do script. Poderá ter de escrever, importar e executar um novo script para anular o efeito que o script falhado teve no seu sistema.
A sua seleção no último passo define o estado final do script. Pode repetir o processo conforme pretender.
Carregar e executar um pacote passível de implementação através do LCS
Em vez de implementar o seu pacote passível de implementação através da interface de utilizador para a sua aplicação de Finanças e Operações, como descrito na secção anterior, pode carregá-lo para o LCS e utilizar o procedimento regular para implementá-lo. Para obter mais informações, consulte Instalar pacotes passíveis de implementação a partir da linha de comandos.
Embora esta abordagem tenha menos restrições, proporciona menos proteção contra erros. Além disso, como requer um reinício de todos os servidores, irá causar algum tempo de inatividade.