一覧へ戻る
ITSM

ServiceNow におけるレコード一括削除(deleteMultiple)の仕組みと実装

ServiceNow の開発やテスト、あるいはデータ移行の準備段階において、テーブル内の大量のレコードを一括して削除しなければならない場面があります。 しかし、不完全な削除処理を行ってしまうと、ビジネスルールや通知が意図せず無数にトリガーされ、深刻なシステムパフォーマンスの低下を招きかねません。 ここでは、安全かつ効率的にレコードを一括削除するための deleteMultiple() メソッドと setWorkflow() の正しい使い方を解説します。

GlideRecord を使用した一括削除

  • ServiceNow の「バックグラウンドスクリプト(Background Scripts)」を使用して実行する、最も標準的で安全な方法です。
  • deleteMultiple() メソッドを活用することで、ループ処理で一つずつレコードを削除するよりも遥かに高速に処理が可能です。
  • 処理前に setWorkflow(false) を設定することで、削除処理に付随して発生するワークフローや通知を完全に停止できるため、安全性が飛躍的に高まります。

例: 特定の条件(例:ベンダーフラグが True の会社レコード)に合致するレコードをすべて削除する場合

function deleteVendorCompanies() {
    var gr = new GlideRecord("core_company");
    gr.addQuery('vendor', true);
    gr.setWorkflow(false); // ビジネスルールや通知の大量実行を防止
    gr.deleteMultiple();
}
deleteVendorCompanies();

全レコードを強制削除する場合の注意点

  • フィルタ条件を付けずにテーブル全体を完全に削除を行う場合も、基本的なスクリプト構成は同じです。
  • addQuery を省略した状態で直接 deleteMultiple() を呼び出すことで、ターゲットとなるテーブル内のすべてのレコードが対象となります。
  • deleteMultiple() には暗黙的にクエリを実行するロジックが含まれているため、直前に gr.query() を記述する必要はありません。

例: 「契約(ast_contract)」テーブルの全レコードを削除する場合

function deleteContractRecords() {
    var gr = new GlideRecord("ast_contract");
    gr.setWorkflow(false);
    gr.deleteMultiple();
}
deleteContractRecords();

実装時のベストプラクティス

  • setWorkflow(false) の徹底: 不要なビジネスルールや通知の大量発火によるシステム障害を防ぐため、必ず設定するようにしてください。
  • カスケード削除の影響: 削除対象のレコードが他のテーブルから参照されている場合、関連レコードごと連鎖的に削除される設定(Cascade Delete)になっているケースがあるため注意が必要です。
  • 環境の確認: データの完全な復旧は非常に困難である場合が多いため、まずは非本番環境(Sub-production)で十分にテストを実施し、本番環境での実行は細心の注意を払ってください。

まとめ

  • 手軽かつ安全に一括削除を行うなら deleteMultiple()setWorkflow(false) の組み合わせ
  • パフォーマンスの観点から、不要な gr.query() の記述は避ける
  • 実行前には関連テーブルへの影響を考慮し、必ず 非本番環境での動作確認 を実施する

これで ServiceNow における不要なデータクリーンアップ作業を安全に進めることができ、予期せぬエラートラブルを未然に防ぐことが可能になります。