sys_audit_delete レコードと sys_audit_relation レコードを自動的にクリーンアップするスクリプトIssue 削除レコードの監査 [sys_audit_delete] テーブルとリレーションシップの変更の監査 [sys_audit_relation] テーブルは、削除されたレコードと他のレコードとの関係についての情報を格納するために使用されます。これら 2 つのテーブルは、「削除の取り消し」機能を容易にします。つまり、レコードを削除した場合、[削除済みレコードの監査] [sys_audit_delete] リストでレコードを検索し、フォームを開いて [レコードの削除取り消し] UI アクションをクリックすることで、レコードを復元できます。オフにすると、これらのテーブルは非常に大きくなり、ServiceNow インスタンス内でパフォーマンスの問題が広範囲に及ぶ可能性があります。ある時点で、何年も前に削除されたレコードを復元するかどうか、これらの監査レコードを維持することに価値があるかどうかの検討が必要になることがあります。 まず、対応するテーブルの辞書属性を no_audit_delete に設定すると、これらのレコードが生成されなくなります。 ただし、多くの場合、これらのレコードを監査して、特定の期間のみ保持することがあります。この記事では、特定のテーブルに対して設定された日数より古いレコード (および対応するsys_audit_relationレコード) をsys_audit_deleteから消去するスクリプトを提案します。 警告:ServiceNow のお客様は、常に ServiceNow インスタンスに保存した情報のデータ所有者および管理者です。保存する情報、その使用方法、保持する期間はお客様が決定します。当社はお客様のデータの削除や変更は行わず、当社の契約上の義務およびお客様のインスタンスの構成に従ってのみデータを処理します。当社は 28 日間のバックアップを保持します。ServiceNow インスタンスからデータを削除すると、そのインスタンスのバックアップからの削除は 28 日後に実施されます。提供されているスクリプトはすべて自己責任でご使用いただくものであり、本番環境で使用する前に準本番インスタンスで十分にテストする必要があります。Resolution手順は簡単で、以下のとおりです。 注:最初に、このジョブをサポートするインデックスを作成することをお勧めします。(下記の「 追加情報 」セクションを参照してください。) [System Definition (システム定義)] > [Scheduled Jobs (スケジュール済みジョブ)] モジュールに移動します。[新規] ボタンをクリックします。[選択したスクリプトの自動実行] リンクをクリックします。以下の情報を入力します。 名前 (Name):Purge sys_audit_delete for sc_recurring_rollup after 7 days実行 (Run):定期的 (Periodically)繰り返し間隔 (Repeat Interval):1 分ごと (1 minute)このスクリプトを実行します。 var vTableName = 'sc_recurring_rollup';var vDaysAgo = 7;PurgeAuditDeletedRecords(vTableName, vDaysAgo); function PurgeAuditDeletedRecords(pTableName, pDaysAgo) { // Set total number of records to delete and maximum size of each batch (recommend leaving this as 100) var pRecordsToDelete = parseInt(2000); var pBatchSize = parseInt(100); // Check table name and delta are set, generate encoded query, set up variables if ((pTableName) && (pDaysAgo)) { var v_encoded_query = 'sys_created_on var pDeleteCount = parseInt(0); // Loop deleting records while (pDeleteCount < pRecordsToDelete) { // Check if we need to reduce pBatchSize if ((pDeleteCount + pBatchSize) > pRecordsToDelete) { pBatchSize = pRecordsToDelete - pDeleteCount } // Find records in sys_audit_delete var gr = new GlideRecord('sys_audit_delete'); gr.addEncodedQuery(v_encoded_query); gr.setLimit(pBatchSize); gr.query(); // Exit if there are no records to delete if (gr.getRowCount() == 0) { break } // Increment delete counter pDeleteCount += parseInt(gr.getRowCount()); // Build array of sys_audit_delete sys_ids to be removed var pTargetSysids = []; while (gr.next()) { pTargetSysids.push(gr.sys_id.toString()) } // Delete referencing records from sys_audit_relation gr = new GlideRecord('sys_audit_relation'); gr.addQuery('audit_delete', 'IN', pTargetSysids); gr.query(); gr.deleteMultiple(); // Delete records from sys_audit_delete gr = new GlideRecord('sys_audit_delete'); gr.addQuery('sys_id', 'IN', pTargetSysids); gr.query(); gr.deleteMultiple(); } // Log work done gs.log('Deleted ' + pDeleteCount + ' records for ' + pTableName + ' from sys_audit_delete (and related sys_audit_relation records)', 'PurgeAuditDeletedRecords'); }} 必要に応じて、[名前 (Name)] と [繰り返し間隔 (Repeat Interval)] の値、スクリプト内の変数vTableName と vDaysAgo を変更できます。 [送信] ボタンをクリックします。[sys_audit_delete/sys_audit_relation] テーブルからクリーンアップする他のすべてのテーブルについて、手順 2 〜 6 を繰り返します。保持する日数をコントロールするには、テーブルごとに複数のジョブを使用します。 /syslog_list.do?sysparm_query=source=PurgeAuditDeletedRecords に移動すると、ログを監視してスクリプトから詳細を確認できます。Related Linksフィールド (tablename、sys_created_on) の削除レコードの監査 [sys_audit_delete] テーブルにインデックスを追加すると、スクリプトの効率が向上されます。