メインコンテンツへスキップ
見出し画像

辞書オーバーライド:継承フィールドを子だけ上書き


    ServiceNow のテーブルは、task を継承する incident、cmdb_ci を継承する各 CI クラスのように、継承(extends) で積み上がっています。継承すると、親テーブルのフィールド定義(sys_dictionary)はそのまま子テーブルにも引き継がれます。では「親と同じフィールドを使いたいが、子テーブルだけ既定値や必須・参照先を変えたい」ときはどうするのか。その答えが辞書オーバーライド(Dictionary Override)、テーブル名で言うと sys_dictionary_override です。

    この記事は、テーブルの継承と sys_dictionary は見たことがあるが、「継承したフィールドを子テーブルだけで変える仕組み」を確認したい管理者・開発者を想定しています。PDI(Zurich / OOTB)で sys_dictionary_override を実際に開き、次を順に確認します。

    • 1行=「どの基底フィールドを・どの拡張テーブルで・どう上書きするか」の宣言であること

    • 上書きできる属性の種類とその実機での使われ方

    • incident(task 継承)の具体例

    この記事で分かること

    • 辞書オーバーライドは sys_dictionary_override の1行=base_table(定義元)・name(拡張テーブル)・element(フィールド)で対象を指す宣言であること

    • 上書きは「値の列+上書きONフラグ(boolean)」のペアで、フラグが true の属性だけが基底定義を上書きすること

    • PDI 実機の 404件中 173件が必須(mandatory_override)の上書きで、必須化/必須解除が主役であること

    • incident は task の priority の既定値を 5、assigned_to などの参照修飾子を incident 文脈に差し替えていること

    • sys_dictionary_override が sys_metadata 系(Application File)のメタデータで、設定としてパッケージに乗ること

    この記事の内容は ServiceNow の PDI(Personal Developer Instance)Zurich(ズーリッヒ)リリースの OOTB(初期設定)で確認した個人メモです。本番環境やカスタマイズ済み環境では、フィールド・件数・上書きの内容が異なる場合があります。


    辞書オーバーライドとは

    辞書オーバーライドとは、継承元(基底テーブル)で定義したフィールドの属性を、拡張テーブルの上だけで上書きする仕組みです。フィールドそのものを再定義するのではなく、「既定値はこれにする」「必須にする」「参照先の絞り込みを変える」といった差分だけを1件のレコードとして持ちます。

    下の実画面は、その1行をフォームで開いたものです。これは incident の priority に対する上書きです。Base table=task、Table=incident、Column name=priority です。そして Override default value にチェックが入り、Default value=5 が設定されています。


    画像

    つまり「task が定義した priority というフィールドを、incident の上では既定値 5 で使う」という1件の宣言です。task 本体の辞書定義(sys_dictionary)は変えずに、incident だけ初期値を変えられます。


    画像

    なお sys_dictionary_override(label は Dictionary Entry Override)の継承元は Application File です。つまり sys_metadata 系のメタデータでした。設定として更新セット/プラグインに乗って運ばれる種類のレコードです。


    どこを上書きするか:base_table・name・element の3点セット

    1行のオーバーライドが「どのフィールドを・どこで」上書きするかは、次の3つで決まります。

    • base_table(Base table)… フィールドが元々定義されている基底テーブル(incident の例なら task)。

    • name(Table)… 上書きを適用する拡張テーブル(incident)。

    • element(Column name)… 対象のフィールド名(priority)。

    そして「何を」上書きするかは、属性ごとに用意された「値の列」と「上書きONフラグ」のペアで決まります。たとえば既定値なら default_value(値)と default_value_override(ONフラグ)の組です。


    画像


    画像

    ポイントは、上書きフラグが true の属性だけが効くことです。フラグが false の属性は、継承元の辞書定義の値をそのまま使います。だから1件のオーバーライドで、必須だけ・既定値だけ、とピンポイントに差分を当てられるわけです。


    実機ではどの上書きが多いか

    sys_dictionary_override は PDI(Zurich / OOTB)に 404件ありました。どの属性の上書きが多いかを、各フラグが true の件数で見てみます。


    画像

    最多は必須(mandatory_override)の 173件でした。拡張テーブルで「この項目は必須にする(または必須を外す)」という用途が、辞書オーバーライドの一番の使いどころです。次いで件数は次のとおりでした。

    • 既定値:98件

    • 属性:65件

    • 読み取り専用:44件

    • 参照修飾子:42件

    • 計算値(calculation):0件


    画像

    一覧を Table(name)順に眺めると、CMDB の各 CI クラス(cmdb_ci_appl 系など)や task 系の拡張テーブルが見えます。継承したフィールドを各テーブルの事情に合わせて上書きしている様子が分かります。


    画像

    オーバーライド自身のフィールド定義は、次のURLで確認できます(先頭の <YourInstance> は自分のインスタンスに置き換えてください)。

    https://<YourInstance>/sys_dictionary_list.do?sysparm_query=name=sys_dictionary_override^elementISNOTEMPTY


    画像

    実例:incident(task 継承)の上書き

    base_table と name の関係を実データで確かめます。name=incident のオーバーライドは 9件で、全件 base_table=task でした。incident は task を継承しているので、「task が定義したフィールドを incident の上だけで上書きする」という構造がそのまま見えます。


    画像


    画像

    9件の内訳は次の通りです。


    画像

    代表的なのが assigned_to の参照修飾子の上書きです。Override reference qualifier が ON で、値は roles=itil^ORroles=sn_incident_write。これにより incident の担当者候補を、該当ロールを持つユーザーに絞り込んでいます。


    画像

    ほかにも cmdb_ci・business_service は TaskUtils().getConfigurationItemFilter で対象 CI を絞ります。priority は既定値を 5 にしています。参照修飾子そのものの考え方は、別記事の参照フィールドと参照修飾子(reference_qual)で扱っています。なお incident では mandatory_override=true の項目はありませんでした(必須化は他テーブルで多用)。

    参考:参照フィールドと参照修飾子(reference_qual)


    まとめ

    • 辞書オーバーライドは sys_dictionary_override の1行=base_table(定義元)・name(拡張テーブル)・element(フィールド)で対象を指す。継承したフィールドの属性を拡張テーブルだけで上書きする。

    • 上書きは「値の列+上書きONフラグ」のペア。フラグが true の属性だけが基底定義を上書きし、false は継承元の値を使う。

    • PDI 実機では 404件中 173件が必須(mandatory_override)の上書き。次いで既定値 98、属性 65、読み取り専用 44、参照修飾子 42。

    • incident(task 継承)は priority の既定値を 5、assigned_to / cmdb_ci などの参照修飾子を incident 文脈に差し替えている。

    • sys_dictionary_override は sys_metadata 系(Application File)のメタデータで、設定としてパッケージに乗る。

    辞書オーバーライドが分かると、「テーブル定義まわり」のシリーズが、継承と上書きという軸でつながって見えてきます。次のテーマを扱っています。

    • テーブルとフィールド(sys_db_object / sys_dictionary)

    • 選択肢(sys_choice)

    • 参照フィールドと参照修飾子

    • Data Policy

    参考:テーブルとフィールド(sys_db_object / sys_dictionary) / 選択肢(sys_choice) / 参照フィールドと参照修飾子 / Data Policy

    なお公式の説明は ServiceNow ドキュメントにもあります。

    参考:Dictionary overrides(Zurich)

     
     
    ServiceNowのPDI(Personal Developer Instance)を実機で観察して、Noteに記事を書いています 実装・運用・教育の現場視点で淡々と記録中です リクエストがあればその記事も書きます 個人の観察日記です

    あなたへのおすすめ