ServiceNow에서 데이터 정리 일괄 처리 만들기

개요



일상 업무에 따라 트랜잭션 테이블에 데이터를 추가했을 때 보존 기한이 만료되면 자동으로 삭제하는 구조를 배치 처리로 작성하는 경우가있다.
이번은 ServiceNow의 Scheduled script execution을 이 구조를 작성한다.

사양



정리 대상의 테이블과 데이터의 보존 기한, 데이터의 보존 기한을 판정하기 위한 대상 테이블의 열명을 보관 유지하는 테이블 「DataReductionSettings」테이블을 작성해 둔다.
Schedule script execution에서 작성된 처리가 기동되면, 「DataReductionSettings」테이블로부터 정리 대상의 테이블명, 일자 보관 유지의 열명, 보관 기간(일수)을 취득한다.
취득한 정보를 바탕으로, GlideRecord의 deleteMultiple에서 조건에 일치하는 레코드를 일괄 삭제한다.

환경



ServiceNow:KINSGTONE

절차



DataReductionSettings 테이블 만들기



다음 항목을 가진 테이블을 만듭니다.
덧붙여 Table Name은 Label로부터 자동 생성되지만, 이번 나의 환경에서는 「x_211750_angular_a_datareductionsettings」가 되어 있다.
이것은 나중에 스크립트에서 이용하기 때문에, 각자의 환경에 맞추어 변경이 필요하다.


Column Name
유형
해설


tablename
String (Full UTF-8)
정리 대상 테이블 이름

periodcolumnname
String (Full UTF-8)
날짜 결정용 열 이름

period
Integer
보유 일수


Schedule script execution 만들기



studiio의 Create Application File에서 Server Development 카테고리에서 Schedule script execution을 선택하고 Create를 클릭하십시오. Name이나 실행 간격 등은 적당하게 설정한다. 또한 Active의 체크는 일단 제거하고 저장한다.



아래 스크립트를 Run this script에 입력한다.

// 整理対象設定テーブルからレコードを読み込む
var reductionSettingsRecord = new GlideRecord('x_211750_angular_a_datareductionsettings');  
reductionSettingsRecord.query();


while (reductionSettingsRecord.next()) {
    // 整理対象テーブル名
    var tableName = reductionSettingsRecord.getValue('tablename');
    // 整理対象日付判定用の列名
    var periodColumnName = reductionSettingsRecord.getValue('periodcolumnname');
    // 保持期限(日数)
    var period = reductionSettingsRecord.getValue('period');

    gs.info('target table = ' + tableName);
    gs.info('periodColumnName = ' + periodColumnName);
    gs.info('period = ' + period);

        // 整理対象日付を「本日日付 - 保持期限(日数)」で算出
    var expiredDate = new GlideDateTime();
    expiredDate.addDaysLocalTime(Number(period * -1));

    gs.info('expiredDate = ' + expiredDate.getLocalDate());

    var reductionRecord = new GlideRecord(tableName);
        // 整理対象テーブルを「判定用の列名 <= 整理対象日付」で抽出 
    reductionRecord.addQuery(periodColumnName, '<=', expiredDate);
    reductionRecord.query();
    // 処理対象件数をあらかじめ取得しておく
    var targetCount = reductionRecord.getRowCount();

    gs.info('targetCount = ' + targetCount);
    // 一括削除実行
    reductionRecord.deleteMultiple();

}

스크립트의 설명은 스크립트 코멘트에 기재되어 있기 때문에 생략한다.

실행



Active의 체크는 제외하고 있기 때문에 정기 실행은 되지 않지만 설정 화면의 「Execute Now」를 클릭하면 즉시 실행된다.

마지막으로



조금 잃은 적이 있다. 일자의 연산 처리로, GlideDateTime에 subtract(감산)가 있었으므로, subtractDay같은 것을 찾아 버렸지만 없었다.
조금 생각해 「addDaysLocalTime」로 인수에 부수를 건네주면 좋은 일을 깨달았다.

또한 조금은 빠진 적이 있습니다.

날짜의 연산 결과를 대입하려고 처음에는 아래와 같은 코드를 써 버렸다.
var today = new GlideDateTime();
var expiredDate = today.addDaysLocalTime(Number(period * -1));

최근에는, Java로 오브젝트는 기본적으로 이뮤터블로 만드는 것에 익숙하고 있고, 각종 프레임워크등도 그렇게 설계되고 있는 것이 많기 때문에 상기의 코드를 자연스럽게 써 버리고 있었다. javascript는 기본적으로 뮤터블 객체군요.

조금 곤란한 일
deleteMultiple에서 처리 대상이 된 건수를 반환 값으로 반환하지 않습니다.
EffectCount와 같은 메소드도 없다.
이번에는 실행 직전에 같은 검색 조건으로 건수를 취득하고 있지만, 이것으로 좋은지 그 밖에 좋은 쓰기가 없는지 찾고 있다.

좋은 웹페이지 즐겨찾기