全テーブル定義はsys_db_object。フィールド定義(辞書)はsys_dictionary。ラベルはsys_documentation。sys_idは32文字GUIDで全レコードに存在。
taskがIncident/Problem/Change等の親。cmdb_ciがCI系の親。sys_userは単独テーブル(拡張ではない)。親のリストには子のレコードも表示される。新規テーブルにu_プレフィックス。
Reference(1対多)、List(複数参照)、Choice(sys_choiceで管理)。Dot-walkingで参照先フィールドにアクセス(例: caller_id.company.name)。
1対多=Reference、多対多=m2mテーブル、Database View=JOIN(読み取り専用)。
CI基底テーブルはcmdb_ci。CIリレーションシップはcmdb_rel_ciテーブル。
評価順序: テーブルレベル(具体→親→ワイルドカード)→フィールドレベル(具体→ワイルドカード)。両方パスしてアクセス可能。ACL変更にsecurity_adminへのelevate roleが必要。条件3種類: ロール/条件(フィルター)/スクリプト。
ACLスクリプトフィールド:
answer 変数に true または false をセットして返すcurrent でカレントレコードを参照gs.hasRole('role') でロールチェックUI Policy=フォームのみ。Data Policy=全入力経路(インポート・API含む)。Business Ruleはサーバーサイドのinsert/update/delete/queryロジック。
実行タイミング(When):
Before: DB保存前に実行。フィールド値の変更や処理のアボートに使用After: DB保存後に実行。他レコードの更新などに使用Async: 非同期実行。メール送信など重い処理に使用Display: フォーム表示前に実行。スクラッチパッドでデータを渡すcurrent オブジェクト:
current.field_name: フィールドの現在値を取得/設定current.getValue('field'): 文字列として取得current.setValue('field', value): 値をセットprevious オブジェクト:
previous.field_name: 更新前の古い値を参照(Beforeのupdate時のみ有効)previous.state: 変更前のStatフィールド値setAbortAction(true):
current.setAbortAction(true): DB保存をアボートしロールバックgs.addErrorMessage('メッセージ'): ユーザーへエラーメッセージ表示Scratchpad オブジェクト:
g_scratchpad.key = value: Display Business RuleかClient Scriptにデータを渡すサーバーサイドでテーブルを操作するJavaScript API。
単一レコード取得:
gr.get(sys_id) または gr.get('number', 'INC0000001')クエリ実行:
gr.addQuery('state', '1') — state = 1gr.addQuery('priority', '<', '3') — priority < 3gr.addEncodedQuery('active=true^state=1') — エンコードクエリgr.setLimit(10) — 件数制限gr.orderBy('priority') / gr.orderByDesc('sys_created_on')gr.query() — クエリ実行while (gr.next()) { ... } — レコード反復OR条件:
var qc = gr.addQuery('state', '1'); qc.addOrCondition('state', '2');値の取得・設定:
gr.getValue('field') — 文字列値gr.getDisplayValue('field') — 表示値gr.setValue('field', value) — 値セットレコード操作:
gr.insert() — 作成。sys_idを返すgr.update() — 更新。保存gr.deleteRecord() — 削除Auto Number (自動番号):
Dictionary Entry の主なフィールド:
Reference フィールド: Reference qualifier で参照先レコードを絞り込む条件スクリプト
辞書オーバーライド: 子テーブルだけフィールド属性を変更(親の定義はたそのまま)
Auditing: sys_auditに変更履歴を記録(テーブルごとに有効化必要)。
辞書オーバーライド: 子テーブルだけ属性変更(親の定義は変えない)。
【スキーマ層】
sys_db_object(テーブル定義)
├─→ sys_dictionary(フィールド定義・辞書)
└─→ sys_choice(Choiceフィールドの選択肢)
【テーブル継承ツリー】
task(親) → incident / problem / change_request
cmdb_ci(親) → cmdb_ci_computer / cmdb_ci_server
sys_user — (継承なし・独立テーブル)
【ACL 評価フロー】
リクエスト → テーブルACL評価(具体→親→*)
→ フィールドACL評価(具体→*) → アクセス許可/拒否
ACL条件: ロール → 条件 → スクリプト(answer=true/false)
admin ロールはACLをバイパス
【Business Rule タイミング】
Before — DB保存前 — current変更・setAbortAction・バリデーション
After — DB保存後 — 他レコード更新・後処理
Async — 非同期 — メール送信・重い処理
Display — 表示前 — scratchpadでClient Scriptにデータ渡し
current.setAbortAction(true) → 保存をロールバック
previous.field → 更新前の値(Beforeのupdate時)
【GlideRecord APIフロー】
new GlideRecord('table')
├─ addQuery() / addEncodedQuery()
├─ setLimit() / orderBy()
├─ query() → while (gr.next())
├─ getValue / getDisplayValue / setValue
└─ insert() / update() / deleteRecord()
タスク1: Business Ruleを作成してsetAbortActionを試す
incident、When: Before、InsertとUpdateにチェックタスク2: GlideRecordをBackground Scriptで試す
タスク3: ACLのelevate roleとACL編集を体験する
Elevate Roles をクリックし、security_admin にチェックincident テーブルのACLを開き、Roles/Condition/Scriptの3タブを確認するanswer = gs.hasRole('itil'); のようなスクリプトを確認するタスク4: 辞書オーバーライドで子テーブルだけ属性変更する
incident テーブルの short_description フィールドを開くMandatory を true に設定して保存「新しいカスタムテーブルのプレフィックスは」→ u_ が自動付与される。
「ACLの評価順序として正しいものはどれか」→ テーブルレベル(具体→親→)の後にフィールドレベル(具体→)。両方パスで初めてアクセス可能。
「UI PolicyとData Policyの違いとして正しい記述はどれか」→ UI Policyはフォームのみ。Data PolicyはAPIやImport Setにも適用される。
「Business RuleのcurrentとpreviousはどのWhenで両方使えるか」→ Before + Updateの組み合わせでのみ previous が有効。
「GlideRecordでクエリを実行した後にレコードを反復するメソッドは」→ gr.next()。whileループで使用。
「setAbortAction(true)を使う主な目的は何か」→ バリデーション失敗時にデータベースへの保存をキャンセルするため。