ServiceNow テーブルのデータの管理と一括削除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: ; } } フィルター条件の有無にかかわらず、ServiceNow テーブルからデータを一括削除する方法を確認します。この記事では、UI アクション、クローン除外ルール、テーブルクリーンアップポリシー、JavaScript の 4 つのアプローチについて、最も単純なものから最も高度なものの順に説明します。また、データ削除要求に関する計画上の考慮事項、メンテナンス戦略、および ServiceNow ポリシーについても説明します。 最善のアプローチは、状況によって異なります。大量のレコードの場合、クローン除外ルールが最速のオプションですが、すべてのシナリオに適しているわけではありません。何百万件ものレコードを削除する必要があるビジネスクリティカルなニーズがあり、他の方法で必要な時間が待てない場合は、ServiceNow でケースをオープンしてテクニカルサポートエンジニアに相談してください。 データ削除要求に関する ServiceNow ポリシー プラットフォームデータの関係は複雑であり、単純なデータベーステーブル管理だけではありません。拡張されたテーブルモデル、参照フィールド、ビジネスロジック、ワークフロー、およびカスタマイズにより、リスクなしでバックエンドからデータを削除することが不可能になります。ServiceNow は、これらのレコードの存在によりビジネスクリティカルな運用が使用できなくなる、機能停止を引き起こした、または引き起こす予定であるか、またはそれらのレコードが欠陥や問題の結果でない限り、データ削除に介入できません。 免責事項 この記事のいかなる部分も、徹底的な検証とテストを行わずにライブインスタンスにそのまま実装されることを意図したものではありません。コンテンツは、特定の状況への適合性を保証するものではありません。この記事で提供されているスクリプトまたは実装の使用は、自己責任で行ってください。 計画 データを一括削除する前に、次の点を考慮してください。 どのようなカスケード削除が行われますか?(子レコードおよび関連レコード)どの参照が壊れたりクリアされたりしますか?どのようなビジネスルールがトリガーされますか?どのワークフローが実行されますか?影響を受ける可能性のある他の機能は何ですか?(クロススコープ権限の生成など)削除は更新セットによって追跡されますか? これらの質問を事前に調べておくと、潜在的な副作用を特定し、その後のクリーンアップを計画するのに役立ちます。たとえば、壊れた参照を置き換えるための計画が必要な場合があります。 バックアウトプランニング 一括削除のバックアウトオプションには制限があります。通常、多数のレコードをエクスポートすることはできません。削除の回復ツールは、削除を記録し、破損した参照の復元など、削除を復元できるため、最良のオプションです。詳細については、「 」「ロールバックと削除の復旧 」のドキュメントを参照してください。 自動元に戻すオプションはありません。計画を策定して実行するときは、細心の注意を払ってください。 UI アクションによる削除 長所シンプル短所遅い;UI トランザクションクォータルールによるキャンセルに対して脆弱です。柔軟性に欠ける これは最も簡単なアプローチです。テーブルからすべてのレコードを削除するには、そのテーブルのsys_db_objectレコードを開き、[Delete All Records] UI アクションを選択します。デフォルトでは、UI トランザクションは約 5 分に制限されています。削除がその期間を超えると、自動的にキャンセルされます。大量のデータを含むテーブル、または多くのビジネスルールやカスケード削除をトリガーするデータの場合、操作を完了するためにトランザクションクォータを増やす必要がある場合があります。 リストビューでテーブルをフィルタリングし、複数のレコードを選択して、[削除] UI アクションを選択することもできます。ページネーションのため、一度に選択して削除できるレコードの数には制限があります。大量のレコードの場合、このアプローチは実行できない場合があります。 UI アクションを使用した削除は、ビジネスルールとワークフローをトリガーし、更新セットによって追跡されます。これらの UI アクションは、GlideRecord オブジェクトと deleteMultiple() 関数を内部で使用します。パフォーマンスは、次のスクリプトに匹敵します。 var gr = new GlideRecord("table_name"); gr.query(); gr.deleteMultiple(); クローン除外ルールによる削除 長所非常に高速短所柔軟性がない:テーブル全体を切り捨てます。壊れた参照や孤立した記録を残す可能性があります。クローンが必要ですが、本番環境では実行できません クローンによってテーブルが除外されると、そのテーブルは切り捨てられます。切り捨てはレコードを個別に削除するよりも高速ですが、他のテーブルの除外されたレコードへの参照は壊れます。これらのフィールドには存在しなくなったレコードのsys_idが残っているため、意図しない結果が生じる可能性があります。 直接テーブルを切り捨てると、孤立するデータのリスクもあります。クラスごとのテーブル (TPC) 階層では、各拡張テーブルはデータベース内の個別の物理テーブルとして存在します。これらのテーブルが結合されて完全な行が形成されます。階層内の 1 つのテーブルを切り捨てると、その物理テーブルからデータが削除されますが、親テーブルと子テーブルの結合された行は残ります。この方法で破損したデータは孤立したと見なされ、通常のプラットフォーム手段ではアクセスできなくなります。タスク階層や CMDB 階層とは異なり、TPC 階層内のテーブルを除外する場合は、すべての親テーブルと子テーブルも除外して、孤立データが作成されないようにします。 テーブルクリーンアップポリシーによる削除 長所スケジュールに従ってバックグラウンドで実行されます。柔軟な構成。ビジネスルールまたはワークフローをトリガーしない (テーブルに iterativeDelete 属性がない場合)短所遅い;継続的なメンテナンス用に設計されており、1 回限りの削除には適していません テーブルクリーンアップポリシーは、単純な基準を満たすレコード (特定の時間が経過しても更新されていないクローズ済みタスクなど) を日常的に削除するための優れたソリューションです。テーブルクリーナージョブは 1 時間に 1 回実行されます。 テーブルの iterativeDelete 属性が true に設定されていない限り、基礎となるコードは削除の実行に GlideRecord を使用しません。つまり、ビジネスルールとワークフローがトリガーされないため、パフォーマンスが大幅に向上します。また、削除が更新セットによって監査または追跡されないことも意味します。iterativeDelete 属性が存在し、true に設定されている場合、これらのエンジンがトリガーされます。 大きなテーブルにテーブルクリーンアップポリシーを実装する場合は、クリーンアップ条件のサポートインデックスが存在することを確認します。 30 日間更新されていない [クローズ済み] ステータスのインシデントレコードを削除するテーブルクリーンアップポリシーの例を次に示します。 JavaScript による削除 長所ほぼ無限の柔軟性。ビジネスルール、ワークフロー、およびその他のエンジンをバイパスできます。直接実行することも、ビジネスルール、UI アクション、またはスケジュール済みジョブに追加することもできます。バックグラウンドで実行してもトランザクションクォータルールに対して脆弱ではありません短所遅い;危険な;スクリプティングのナレッジが必要 [Scripts - Background] モジュールを使用して、JavaScript コードを直接実行します。このモジュールには、デフォルトでオンになっている [Cancel after 4 hours] チェックボックスが含まれています。一括削除スクリプトの場合は、このチェックボックスをオフにします。スコープ対象テーブルからデータを削除する場合を除き、ドロップダウンで global スコープを選択します。 次のスクリプトは、ビジネスルールまたはワークフローをトリガーせずに、指定されたテーブルからすべてのレコードを削除します。 var gr = new GlideRecord("table_name"); gr.query(); gr.setWorkflow(false); // Bypass business rules and workflows gr.deleteMultiple(); 特定の条件に一致するレコードのみを削除するには、クエリフィルターを追加します。 var gr = new GlideRecord("table_name"); gr.addQuery("state", "closed"); gr.addQuery("category", "4ca01be0db31eb009540e15b8a961936"); gr.addNullQuery("user"); gr.query(); gr.setWorkflow(false); // Bypass business rules and workflows gr.deleteMultiple(); setWorkflow(false) を使用すると、更新セットの追跡も抑制されます。ビジネスルールやワークフローを実行する必要がなく、データをできるだけ早く削除する場合は、これを使用します。スクリプトにログ記録を追加すると、結果のデバッグと評価が容易になります。 このようなスクリプトをスケジュール済みスクリプト実行ジョブに追加してスケジュールに従って実行したり、特定のロジックに基づく一括削除が一般的な要件であるテーブルでカスタム UI アクションを作成したりできます。 重要: 本番インスタンスでテストされていないスクリプトを実行しないでください。最初に非本番インスタンスで徹底的にテストします。列名のスペルが間違っているなど、小さな間違いでも、意図しない結果につながる可能性があります。テスト中にデータが失われた場合は、非本番インスタンスのクローンを作成して復旧します。 メンテナンスと防止 一括削除を回避する最も効果的な方法は、データが管理不能なサイズまで増加しないようにすることです。この記事で説明されているテーブルクリーンアップポリシーを使用して、スケジュールに従ってデータを削除します。JavaScript を使用して削除を実行するスケジュール済みスクリプト実行ジョブを作成することもできますが、ほとんどの場合、テーブルクリーンアップポリシーの方がパフォーマンスが向上します。 データベースを無駄のない状態に保つことで、パフォーマンスと使いやすさが向上し、データへのアクセスと管理が容易になります。古いデータを廃止するための一貫した戦略、つまりデータベースの効率を維持しながらコンプライアンス要件を満たす戦略は、プラットフォームの運用に大きなプラスの影響を与えます。 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: ; } } Zurich 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: ; } } View Links Related Links<!-- /*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: ; } } ロールバックと削除の復旧テーブルクリーナー - Vancouver ドキュメントKB0694151 - テーブルクリーナーを使用して不要なデータを削除する方法KB1518213 - Mastering Data Management in ServiceNow: from tracking growth to efficient cleanup