Nicht-Referenzfelder werden zu Referenzfeldern migriert

  • Freigeben Version: Yokohama
  • Aktualisiert 30. Januar 2025
  • 2 Minuten Lesedauer
  • sys_ids manuell in Referenzfeldern beibehalten, anstatt den Anzeigenamen als Zeichenfolge zu speichern.

    Bestimmen der zu migrierenden Tabellen

    Um den Datenmigrationsprozess zu starten, führen Sie das folgende Hintergrundskript aus. Dieses Skript erstellt Migrationsdatensätze für direkte Tabellenerweiterungen und zugehörige archivierte Datensätze in der Tabelle „Archivregel-Referenzmigration“ [sys_archive_ref_migration] und stellt sicher, dass nur gültige Tabellen verarbeitet werden.
    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();
                }
            }
        }

    Archivreferenzen werden kopiert

    Für jede Tabelle, die den Migrationsprozess durchläuft, identifiziert der Auftrag „Archivreferenz kopieren“ (RefCopyJob) die sys_id der Referenzfelder und aktualisiert den Anzeigewert auf die richtige sys_id. Die Aufgabe konfiguriert 10.000 Datensätze auf einmal, es sei denn, es gibt mehr als 10.000 Datensätze mit demselben Zeitstempel. Der Migrationsfortschritt beruht auf dem archivierten Zeitstempel.

    Feldtypen von Zeichenfolge in Referenz ändern

    Nachdem die einer Archivregel zugeordneten Tabellen vollständig migriert sind, wird der Auftrag ArchiveRefJob ausgeführt. Dieser Auftrag ändert die sys_dictionary-Typen der Archivtabelle von Zeichenfolge in Referenz.

    Beheben von Knotenfehlern für „RefCopyJob“ und „ArchiveRefJob“.

    Wenn während der Ausführung dieser Aufträge ein Knotenfehler auftritt, wird der Status der Datenmigration in einem falschen Zustand beibehalten. Wenn RefCopyJob fehlschlägt, kann eine Tabelle im Migrationsstatus belassen werden. Sie können diese Bedingung überprüfen, indem Sie überprüfen, ob Zeilen in „sys_archive_ref_migration“ übermäßig lange im Migrationsstatus verharren. Aktualisieren Sie den spezifischen Zeilenstatus von „Wird migriert“ auf „Warten“, und RefCopyJob setzt die Datenmigration in der Tabelle fort, wenn der Auftrag erneut ausgeführt wird.

    Der -Knoten kann auch fehlschlagen, wenn ArchiveRefJob vorzeitig beendet wird. Überprüfen Sie, ob Tabellen Felder haben, die Referenzfelder sind, und einige, die noch Felder vom Typ „Zeichenfolge“ sind. Der Auftrag wurde möglicherweise mitten in der Änderung der Feldtypen angehalten. Sie können diese Bedingung beheben, indem Sie einen Auslöserauftrag einrichten, der in einem Hintergrundskript ausgeführt wird, wodurch der Prozess erneut gestartet wird:
    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();