Migrando campos de não referência para campos de referência

  • Versão de lançamento: Zurich
  • Atualizado 31 de jul. de 2025
  • 2 min. de leitura
  • Preserve manualmente sys_ids em campos de referência em vez de armazenar o nome de exibição como uma cadeia de caracteres.

    Determinando tabelas a serem migradas

    Para iniciar o processo de migração de dados, execute o script em segundo plano a seguir. Este script cria registros de migração para extensões de tabela direta e registros arquivados relacionados na tabela Migração de referência de regra de arquivamento [sys_archive_ref_migration], garantindo que somente tabelas válidas sejam processadas.
    var tables = GlideDBObjectManager.get().getAllExtensions(current.table);
        for (i = 0; i < tables.size(); i++) {
            var gr = new GlideRecord('sys_archive_ref_migration');
            gr.addQuery('table', 'ar_' + tables.get(i));
            gr.query();
            if (!gr.next()) {
                if (GlideTableDescriptor.isValid('ar_' + tables.get(i))) {
                    var gr2 = new GlideRecord("sys_archive_ref_migration");
                    gr2.initialize();
                    gr2.setValue('rule', current.sys_id);
                    gr2.setValue('table', 'ar_' + tables.get(i));
                    gr2.setValue('reference_migration_progress', 'waiting');
                    gr2.insert();
                }
            }
        }
        //Also get insert related records tables as well
        var map = new GlideRecord('sys_archive');
        map.addQuery('table', current.table);
        map.query();
        if (map.next()) {
            var id = map.getValue('sys_id');
            if (!(id === undefined)) {
                var related = new GlideRecord('sys_archive_related');
                related.addQuery('archive_map', id);
                related.addQuery('action', 'archive');
                related.query();
                while (related.next()) {
                    if (!GlideTableDescriptor.isValid('ar_' + related.getValue('table'))) {
                        gs.log('Related Record table: ' + related.getValue('table') + ' not created yet');
                        continue;
                    }
     
                    var gr3 = new GlideRecord("sys_archive_ref_migration");
                    gr3.initialize();
                    gr3.setValue('rule', current.sys_id);
                    gr3.setValue('table', 'ar_' + related.getValue('table'));
                    gr3.setValue('reference_migration_progress', 'waiting');
                    gr3.insert();
                }
            }
        }

    Copiando referências de arquivamento

    Para cada tabela que passa pelo processo de migração, o trabalho Cópia de referência de arquivamento (RefCopyJob) identifica o sys_id dos campos de referência e atualiza o valor de exibição para ser o sys_id correto. O trabalho configura 10.000 registros por vez, a menos que haja mais de 10.000 registros com o mesmo carimbo de data/hora. O andamento da migração depende do carimbo de data/hora arquivado.

    Alterando os tipos de campo de cadeia de caracteres para referência

    Depois que as tabelas associadas a uma regra de arquivamento migrarem completamente, o trabalho ArchiveRefJob será executado. Este trabalho muda os tipos sys_dictionary da tabela de arquivamento de cadeia de caracteres para referência.

    Corrigindo falhas de nó para RefCopyJob e ArchiveRefJob

    Se ocorrer falha de nó enquanto esses trabalhos estiverem em execução, isso deixará o status da migração de dados em um estado inadequado. . RefCopyJobfalha, ele pode deixar uma tabela em um status de migração. Você pode verificar essa condição verificando se as linhas em sys_archive_ref_migration estão travadas em migrando status por um período extraordinário. Atualize o status de linha específico de migrando para aguardando e o. RefCopyJobcontinua a migração de dados na tabela quando o trabalho é executado novamente.

    O nó também pode falhar quando ArchiveRefJobé encerrado prematuramente. Verifique se as tabelas têm campos que são campos de referência e alguns que ainda são campos do tipo cadeia de caracteres. O trabalho pode ter parado no meio da mudança dos tipos de campo. Você pode resolver essa condição configurando um trabalho de gatilho para executar em um script em segundo plano, que inicia o processo novamente:
    GlideRecord trigger = new GlideRecord('sys_trigger');
    trigger.initialize();
    trigger.setValue('state', 0);
    trigger.setValue('trigger_type', 0);
    trigger.setValue('next_action', new GlideDateTime());
    trigger.setValue('job_context', 'fcRuleId=' + ruleId);
    trigger.setValue('name', 'Job Reference Migration' + ' Node - ' + new GlideClusterSynchronizer().getSystemID());
    trigger.setValue('trigger_class', 'com.glide.db.auxiliary.job.ArchiveRefJob');
    trigger.insert();