ServiceNow の開発やデータメンテナンス、テスト環境の初期化などでは、テーブル内のレコードをまとめて削除する処理が必要になることがあります。
削除処理は非常に影響範囲が広く、ビジネスルールやフロー、参照整合性に影響を与える可能性があるため、適切な方法で実装することが重要です。本記事では、GlideRecord の deleteMultiple() の仕組みと安全な使い方について解説します。
deleteMultiple() とは
deleteMultiple() は、GlideRecord に設定された条件(クエリ)に一致するレコードをまとめて削除するためのメソッドです。
通常の deleteRecord() が 1 件ずつ削除するのに対し、deleteMultiple() は複数レコードを一括で処理できるため、パフォーマンス面で非常に優れています。ただし、条件設定のミスは即座に広範囲なデータ損失につながるため、実行前の確認プロセスが極めて重要です。
実装コード例
✅ フィルタ条件を指定した一括削除
削除対象を明確に限定した上で、副作用を抑えながら効率的に一括削除を実行する標準的な方法です。
var gr = new GlideRecord("core_company");
// 削除対象を特定する条件を確実に設定
gr.addQuery("vendor", true);
// Business Rule、Workflow、Flow Designer などの実行を抑制し、副作用を軽減
gr.setWorkflow(false);
// 一括削除の実行
gr.deleteMultiple();✅ 削除対象件数の事前確認(安全性の向上)
deleteMultiple() を実行する前に、実際に何件が対象になっているかを正確に把握することで、事故を未然に防ぐことができます。より正確な件数確認のために、以下のプロセスを推奨します。
var gr = new GlideRecord("ast_contract");
gr.addQuery("state", "expired");
// 件数確認のためにクエリを実行
gr.query();
// getRowCount() だけでなく、重要度に応じて以下のループによる件数確認も有効です
var count = 0;
while (gr.next()) {
count++;
}
gs.info("削除対象の正確な件数: " + count);
// ※ 件数を確認した後に、必要に応じて以下の行を有効化して実行してください
// gr.deleteMultiple(); 実務における動作ポイントと注意点
- ポイント①:クエリ条件の明確化:
deleteMultiple()は「設定された条件に基づいて一括で削除を実行」します。意図しない全件削除を防ぐため、常にaddQuery()とセットで使用することを意識しましょう。 - ポイント②:ループ処理の不要化:
deleteMultiple()は内部的に一括処理を行うため、明示的なwhile(gr.next())内でのdeleteRecord()の繰り返し呼出しは不要です。 - ポイント③:setWorkflow(false) の適用範囲: Business Rule だけでなく、Workflow や Flow Designer の一部処理の実行も抑制されるため、削除に伴う連鎖的な挙動を最小限に抑えたい場合に有効です。
- ポイント④:全件削除の回避: 条件を指定せずに呼び出すと、テーブル全体のレコードが削除対象となります。これは非常にリスクの高い操作であるため、実務では避けるべきです。
まとめ
- deleteMultiple() は、条件に基づいた効率的な一括削除メソッドです。
- 実行前には query() や 件数確認 のプロセスを挟むことで、安全性が格段に向上します。
- setWorkflow(false) を適切に使い、意図しない大規模な副作用を防いでください。
👉 一言まとめ: 「deleteMultiple は非常に効率的ですが、条件ミスは即データ損失につながるため、実行前の確認プロセスが最も重要です。」