
辞書オーバーライド:継承フィールドを子だけ上書き
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 の項目はありませんでした(必須化は他テーブルで多用)。
まとめ
辞書オーバーライドは 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 ドキュメントにもあります。