クローン後に sys_connection および TPC 子テーブルで発生する孤立レコードを解消Issue <!-- /*NS Branding Styles*/ --> .ns-kb-css-body-editor-container { p { font-size: 12pt; font-family: Lato; color: var(--now-color--text-primary, #000000); } span { font-size: 12pt; font-family: Lato; color: var(--now-color--text-primary, #000000); } h2 { font-size: 24pt; font-family: Lato; color: var(--now-color--text-primary, black); } h3 { font-size: 18pt; font-family: Lato; color: var(--now-color--text-primary, black); } h4 { font-size: 14pt; font-family: Lato; color: var(--now-color--text-primary, black); } a { font-size: 12pt; font-family: Lato; color: var(--now-color--link-primary, #00718F); } a:hover { font-size: 12pt; color: var(--now-color--link-primary, #024F69); } a:target { font-size: 12pt; color: var(--now-color--link-primary, #032D42); } a:visited { font-size: 12pt; color: var(--now-color--link-primary, #00718f); } ul { font-size: 12pt; font-family: Lato; } li { font-size: 12pt; font-family: Lato; } img { display: ; max-width: ; width: ; height: ; } } クローン完了後、[sys_connection] テーブルおよび [jdbc_connection]、[http_connection] などの TPC(Table Per Class)子テーブルに孤立レコードが作成される問題を解決します。 Release<!-- /*NS Branding Styles*/ --> .ns-kb-css-body-editor-container { p { font-size: 12pt; font-family: Lato; color: var(--now-color--text-primary, #000000); } span { font-size: 12pt; font-family: Lato; color: var(--now-color--text-primary, #000000); } h2 { font-size: 24pt; font-family: Lato; color: var(--now-color--text-primary, black); } h3 { font-size: 18pt; font-family: Lato; color: var(--now-color--text-primary, black); } h4 { font-size: 14pt; font-family: Lato; color: var(--now-color--text-primary, black); } a { font-size: 12pt; font-family: Lato; color: var(--now-color--link-primary, #00718F); } a:hover { font-size: 12pt; color: var(--now-color--link-primary, #024F69); } a:target { font-size: 12pt; color: var(--now-color--link-primary, #032D42); } a:visited { font-size: 12pt; color: var(--now-color--link-primary, #00718f); } ul { font-size: 12pt; font-family: Lato; } li { font-size: 12pt; font-family: Lato; } img { display: ; max-width: ; width: ; height: ; } } サポート対象のすべてのリリース Cause<!-- /*NS Branding Styles*/ --> .ns-kb-css-body-editor-container { p { font-size: 12pt; font-family: Lato; color: var(--now-color--text-primary, #000000); } span { font-size: 12pt; font-family: Lato; color: var(--now-color--text-primary, #000000); } h2 { font-size: 24pt; font-family: Lato; color: var(--now-color--text-primary, black); } h3 { font-size: 18pt; font-family: Lato; color: var(--now-color--text-primary, black); } h4 { font-size: 14pt; font-family: Lato; color: var(--now-color--text-primary, black); } a { font-size: 12pt; font-family: Lato; color: var(--now-color--link-primary, #00718F); } a:hover { font-size: 12pt; color: var(--now-color--link-primary, #024F69); } a:target { font-size: 12pt; color: var(--now-color--link-primary, #032D42); } a:visited { font-size: 12pt; color: var(--now-color--link-primary, #00718f); } ul { font-size: 12pt; font-family: Lato; } li { font-size: 12pt; font-family: Lato; } img { display: ; max-width: ; width: ; height: ; } } ベースシステムのクローン構成では、Exclude 設定と Preserve 設定の両方が [sys_connection] ベーステーブルにのみ適用されており、その TPC 子テーブルには構成されていません。 PRB1403259(Clone — ベース TPC テーブルを除外すると、その子テーブルも除外される)の修正が 2020 年 5 月 28 日にリリースされました。この修正により、[sys_connection] が Exclude 構成に含まれている場合、クローン処理では [jdbc_connection]、[http_connection]、[orch_jms_ds] を含む TPC 子テーブルも自動的に除外されるようになりました。 しかし、Preserve 構成は [sys_connection] にのみ適用され、子テーブルには適用されないため、クローン処理では子テーブルのデータは除外されるものの保持されません。クローン完了後、[sys_connection] ベーステーブルには、sys_class_name が子テーブルクラスを参照するレコードが存在しますが、対応する子テーブルのレコードは保持されていないため、孤立レコード(orphan record)が作成されます。 除外構成 構成を保持 孤立レコードの例: Resolution<!-- /*NS Branding Styles*/ --> .ns-kb-css-body-editor-container { p { font-size: 12pt; font-family: Lato; color: var(--now-color--text-primary, #000000); } span { font-size: 12pt; font-family: Lato; color: var(--now-color--text-primary, #000000); } h2 { font-size: 24pt; font-family: Lato; color: var(--now-color--text-primary, black); } h3 { font-size: 18pt; font-family: Lato; color: var(--now-color--text-primary, black); } h4 { font-size: 14pt; font-family: Lato; color: var(--now-color--text-primary, black); } a { font-size: 12pt; font-family: Lato; color: var(--now-color--link-primary, #00718F); } a:hover { font-size: 12pt; color: var(--now-color--link-primary, #024F69); } a:target { font-size: 12pt; color: var(--now-color--link-primary, #032D42); } a:visited { font-size: 12pt; color: var(--now-color--link-primary, #00718f); } ul { font-size: 12pt; font-family: Lato; } li { font-size: 12pt; font-family: Lato; } img { display: ; max-width: ; width: ; height: ; } } Step1. 孤立レコードを特定 Scripts - Background(グローバルスコープ)で次のスクリプトを実行し、孤立レコードを検出するとともに、どのテーブルがその発生に寄与しているかを特定してください。 findOrphans('sys_connection', null, false);// ============== WARNING ================ //// Do not modify anything below this line! //// ======================================= //function findOrphans(table, query, remove) { GlideTransaction.get().setAllowExcessiveLogging(true); if (gs.getCurrentScopeName() != 'rhino.global') { gs.info("This script must be run in the global scope. Please switch your scope and try again."); return; } var orphanCount = 0, removedCount = 0; var gr = new GlideRecord(table); if (query !== null) { gs.info("Querying " + table + " with encoded query: " + query); gr.addEncodedQuery(query); } else gs.info("Querying all rows on " + table); gr.query(); gr.setWorkflow(false); while(gr.next()) { if(isOrphan(gr)) { gs.info("Found orphan on " + table + " (Class: " + gr.sys_class_name + " - Sys ID: " + gr.sys_id + ")"); orphanCount++; } } gs.info("Total orphans found: " + orphanCount);}function isOrphan(gr) { if(gr.sys_class_name == null || gr.sys_class_name == '') return false; var childClass = new GlideRecord(gr.sys_class_name); if(!childClass.isValid()) return true; childClass.get(gr.sys_id); return !childClass.isValidRecord();} Step2. 孤立レコードを削除 警告: このスクリプトはレコードを完全に削除します。このスクリプトを実行する前に前の手順(孤立レコードの特定)を実行し、出力結果を確認してください。本番環境へ適用する前に非本番環境でテストしてください。 findOrphans('sys_connection', null, true); // ============== WARNING ================ // // Do not modify anything below this line! // // ======================================= // function findOrphans(table, query, remove) { if (gs.getCurrentScopeName() != 'rhino.global') { gs.info("This script must be run in the global scope. Please switch your scope and try again."); return; } var orphanCount = 0, removedCount = 0; var gr = new GlideRecord(table); if (query !== null) { gs.info("Querying " + table + " with encoded query: " + query); gr.addEncodedQuery(query); } else gs.info("Querying all rows on " + table); gr.query(); gr.setWorkflow(false); while(gr.next()) { if(isOrphan(gr)) { gs.info("Found orphan on " + table + " (Class: " + gr.sys_class_name + " - Sys ID: " + gr.sys_id + ")"); orphanCount++; if (remove === true) { gs.info("Removing orphan"); gr.sys_class_name = table; gr.update(); gr.deleteRecord(); removedCount++; } } } gs.info("Total orphans found: " + orphanCount); gs.info("Total orphans removed: " + removedCount); } function isOrphan(gr) { if(gr.sys_class_name == null || gr.sys_class_name == '') return false; var childClass = new GlideRecord(gr.sys_class_name); if(!childClass.isValid()) return true; childClass.get(gr.sys_id); return !childClass.isValidRecord(); } スクリプト実行後、クリーンアップを行う前に、出力結果を確認して孤立レコード数と影響を受けるクラスを確認してください。 Step3. 今後のクローンで孤立レコードが発生しないようにする ソースインスタンスの Preserve 設定に、[sys_connection] の TPC 子テーブルを追加します。少なくとも、次のテーブルを追加してください。 jdbc_connectionhttp_connectionorch_jms_ds または [sys_connection] を拡張しているその他のテーブル。どのテーブルが [sys_connection] を拡張しているかを確認するには、[sys_db_object] テーブルで Extends = sys_connection を条件に検索してください。 データプリザーバーの作成方法については、「クローン時にターゲットインスタンスのデータを保持する方法」を参照してください。