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