ほぼ雑記です色々とデータを整理して取得する必要があって効率が良い方法を考え中です
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で簡単に出来ないか考えます
Scriptで試す
こちらの記事でも書いていた[Scripts - BackGround]に移動して
[ServiceNowでJavaのHttpClientを操作する]
https://qiita.com/20_percent_cooler/items/217666f16d3661a90d65
以下のコードを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++;
}
[Run script]を実行します
成功したようです
親テーブルが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で取得出来たのでコピペして置きます
全てのtableを親子関係込みでScriptで出力する
ER図はこちらの記事で出力方法を書いていますが
[ServiceNowでテーブルを確認/作成する]
https://qiita.com/20_percent_cooler/items/a421efce9fcbfe6335b1
テキストで出力した結果を編集などしたかったので以下で試してみましたこちらも親がある場合には再帰的に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);
}
}
全てのtableを親子関係込みで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の一階層目の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);
}
}