☃️
ServersideScriptをSystemとして実行する
概要
Scriptを実行すると、実行者がログインしているユーザーになるがレコードの作成、更新、削除を実行するとfulfillerとしてカウントされる危険性がある。
そのため上記の作業は実行者をSystemとして実行する必要がある。
方法
スクリプトをスケジュールして実行した場合、実行者がSystemとなるためこれを応用して回避する。
- スケジュールを実行するメソッドを定義する
_execDMLScript: function(script, label) {
var startDate = new GlideDateTime();
startDate.addSeconds(1); //一秒後に起動する
var so = new ScheduleOnce();
so.script = script; //String化された実行するスクリプト
so.setTime(startDate);
so.setLabel(label); //実行中にテーブルで表示されるラベル
so.schedule();
gs.sleep(2000); //同期処理のため待機します
}
- 実行するスクリプトを定義して前述のメソッドに引き渡す
var sampleName = "test";
car sampleValue = "hoge";
//変数が文字列の場合は展開されるとシングルコーテーションが付かないため、前後の文字列にシングルコーテーションを加える必要がある。
var script = "var gr = GlideRecord('sys_sample_list');" +
"gr.initialize();" +
"gr.name='" + sampleName + "';" +
"gr.value='" + sampleValue + "';" +
"gr.insert();";
this._execDMLScript(script, 'sample execute');
- 実行されると
sys_trigger
テーブルにQueが登録されます。
注意点
sys_trigger
では実行中や準備完了などのステータスがありますが完了のステータスがありません。完了するとQue自体が削除されるためステータス管理が難しいのでSleepを使っています。
非同期で実行してもいい場合は、特段使う必要がありません。
Discussion