ServiceNow에서 다양한 정보를 GlideRecord 등으로 취득

7327 단어 ServiceNow
거의 잡기입니다 여러가지 데이터를 정리해 취득할 필요가 있어 효율이 좋은 방법을 생각중입니다

Version: London

sys_domain의 열이 있는 테이블 목록 만들기



Excel에서 시도



[System Definition] - [Dictionary]로 테이블의 컬럼 일람을 표시할 수 있습니다 자신의 환경이면 컬럼의 수는 98,457과 같습니다



Column name is "sys_domain"을 지정하여 sys_domain이 있는 테이블을 나열하면 1,360개 존재하는 것으로 나타났습니다.



목록의 헤더를 마우스 오른쪽 버튼으로 클릭하고 [Export] - [Excel(.xlsx)]를 선택하고…



일단 Excel이라고 이 방법으로 취득할 수 있습니다만 이 후에 여러 테이블의 데이터를 여러가지 join 하거나 해서 성형하고 싶기 때문에 Script로 간단하게 할 수 없는가 생각합니다

스크립트로 시도



이 기사에서도 쓴 [Scripts - BackGround]로 이동하여

[ServiceNow에서 Java HttpClient 작업]
htps : // 코 m / 20_ 페르센 t_ 코오 r / ms / 217666f16d3661 아 90d65



다음 코드를 Run script(JavaScript execute on server)에 복사하여
var gr = new GlideRecord("sys_dictionary");
gr.addQuery('element',"sys_domain");
gr.query();
var i = 1;
//var table_list = [];
while (gr.next()) {
gs.info("[" + i + "]," + gr.name + "," +  gr.element);
i++;
}



실행 스크립트를 실행합니다.



성공한 것 같습니다.



상위 테이블에 sys_domain이 있는 것도 고려



이대로의 결과에서도 잘못은 아닙니다만 테이블을 extend한 테이블의 부모가 sys_domadin를 가지고 있는 경우에도 대응할 수 있는 Script를 생각합니다 부모 도메인이 존재하는 경우에는 재귀적으로 같은 function을 부르고 있습니다
// get table list
var gr = new GlideRecord("sys_db_object");
gr.orderBy('name');
gr.query();
while (gr.next()) {
  gs.log("check sys_domain:" + gr.name);
  check_sys_domain(gr);
}

// check have sys_domain
function check_sys_domain(gr) {
  var grd = new GlideRecord('sys_dictionary');
  grd.addQuery('name', gr.name);
  grd.addQuery('element', 'sys_domain');
  grd.query();
  if (grd.next()) {
    gs.log("have sys_domain:" + gr.name);
  } else {
    gs.log("have no sys_domain:" + gr.name);
    if (gr.super_class) {
      gs.log("-- check parent:" + gr.super_class.name);
      var grs = new GlideRecord("sys_db_object");
      grs.addQuery('name', gr.super_class.name);
      grs.query();
      if (grs.next()) {
        check_sys_domain(grs);
      }
    } else {
      gs.log("OUT");
    }
  }
}

아직 만드는 도중이지만 복사하고 넣습니다.

조사한 뒤에 그 밖에도 여러가지 정보가 Script로 취득할 수 있었으므로 copipe 해 놓습니다

모든 테이블을 부모와 자식 관계로 Script로 출력



ER 그림은 이 기사에서 출력 방법을 쓰고 있습니다만

[ServiceNow에서 테이블 확인/만들기]
htps : // 코 m / 20_ 페르 센 t_ 코오 r / 그리고 ms / 아 421에 f 9fcb 6335b1

텍스트로 출력한 결과를 편집 등 하고 싶었기 때문에 이하에서 시험해 보았습니다 이쪽도 부모가 있는 경우에는 재귀적으로 function을 부르고 있습니다
gs.log("**** ***** creating all tables tree...");
var gr = new GlideRecord("sys_db_object");
gr.orderBy('name');
gr.query();
var ok_cnt = ng_cnt = 0;
while (gr.next()) {
  var msg = gr.name;
  check_parent(gr);
}
function check_parent(gr) {
  if (gr.super_class) {
    msg = gr.super_class.name + " - "  + msg;
    var grs = new GlideRecord("sys_db_object");
    grs.addQuery('name', gr.super_class.name);
    grs.query();
    if (grs.next())
      check_parent(grs);
  } else {
    gs.log(msg);
  }
}

모든 테이블을 부모와 자식 관계로 ACL과 role도 Script로 출력한다



테이블의 ACL과 ACL에 대한 role도 내 ​​보았습니다.
gs.log("**** ***** creating all tables tree and ACL...");
var gr = new GlideRecord("sys_db_object");
gr.orderBy('name');
gr.query();
while (gr.next()) {
    var msg = gr.name;
    check_parent(gr);
    getACL(gr);
}
function check_parent(gr) {
    if (gr.super_class) {
        msg = gr.super_class.name + " - "  + msg;
        var grs = new GlideRecord("sys_db_object");
        grs.addQuery('name', gr.super_class.name);
        grs.query();
    if (grs.next())
        check_parent(grs);
    } else {
        gs.log(msg);
    }
}
function getACL(gr){
    var gsa = new GlideRecord("sys_security_acl");
    var qc = gsa.addQuery('name', gr.name);
    qc.addOrCondition('name','STARTSWITH', gr.name + ".");
    //gsa.addQuery("name", gr.name);
    gsa.query();
    while(gsa.next()){
        var scpt = gsa.script;
        var gsar = new GlideRecord("sys_security_acl_role");
        gsar.addQuery("sys_security_acl", gsa.sys_id);
        gsar.query();
        if (gsar.getRowCount() == 0){
            gs.log(msg + " : " + gsa.name + ":" + gsa.operation); //+ " - " + scpt);
        } else {
            while(gsar.next()){
                gs.log(msg + " : " + gsa.name + ":" + gsa.operation  + " - " + gsar.sys_user_role.getDisplayValue()); //+ " - " + scpt);
            }
        }  
    }
}

모든 role을 contain 포함해 Script로 출력한다



role의 일람도 원했기 때문에 만들어 보았습니다 role의 1계층째의 contain에 모든 role가 포함되어 있다고 전제가 있으면 모든 contain이 나오고 있다고 생각됩니다(미확인입니다 )
gs.log("**** **** creating all roles tree...");
var gr = new GlideRecord("sys_user_role");
gr.orderBy('name');
//gr.addQuery('role', 'itil');
gr.query();
while (gr.next()) {
  var msg = gr.name.getDisplayValue();
  gs.log(msg);
  get_contain_roles(gr);
}
function get_contain_roles(gr) {
  var grr = new GlideRecord('sys_user_role_contains');
  grr.addQuery('role', gr.sys_id);
  grr.query();
  while(grr.next()){
    gs.log(msg +  " - " + grr.contains.getDisplayValue());
    //get_role(grr);
  }
}
function get_role(grr){
  var grrr = new GlideRecord("sys_user_role");
  grrr.addQuery('sys_id', grr.contains);
  grrr.query();
  if (grrr.next()) {
    get_contain_roles(grrr);
  }
}

좋은 웹페이지 즐겨찾기