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);
}
}
Reference
이 문제에 관하여(ServiceNow에서 다양한 정보를 GlideRecord 등으로 취득), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/20_percent_cooler/items/f5b46185999b6ef4f059
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
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++;
}
// 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");
}
}
}
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);
}
}
Reference
이 문제에 관하여(ServiceNow에서 다양한 정보를 GlideRecord 등으로 취득), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/20_percent_cooler/items/f5b46185999b6ef4f059
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
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의 일람도 원했기 때문에 만들어 보았습니다 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);
}
}
Reference
이 문제에 관하여(ServiceNow에서 다양한 정보를 GlideRecord 등으로 취득), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/20_percent_cooler/items/f5b46185999b6ef4f059텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)