CSA Hub Part 2 Tables & Dictionary
🔧 Part 2 · Topic 2 of 3

Tables & System Dictionary

⏱ ~55 min read 📋 6 sections 🎯 High exam weight

What Are Tables?

ServiceNow is fundamentally a database platform. Every piece of data — incidents, users, CIs, knowledge articles, system properties — lives in a database table. Understanding how tables work is the foundation of everything else in the platform.

Tables have columns (fields) and rows (records). To navigate directly to any table's list view, type the table name followed by .list in the Application Navigator filter (e.g., incident.list, sys_user.list).

Analogy: A ServiceNow table is exactly like a database table or Excel spreadsheet. Each row is one record, each column is a field. The incident table has one row per incident ticket — with columns for number, state, priority, description, and so on.

Tables are themselves records in ServiceNow — every table definition is stored in the sys_db_object table. You can navigate there with sys_db_object.list to see every table in the instance.

Table Naming Conventions

Table names use snake_case (lowercase with underscores). The naming often reflects ownership or grouping:

  • sys_ prefix — core system tables (e.g., sys_user, sys_properties)
  • sc_ prefix — Service Catalog tables (e.g., sc_request, sc_req_item)
  • cmdb_ prefix — Configuration Management DB (e.g., cmdb_ci)
  • kb_ prefix — Knowledge Base (e.g., kb_knowledge)
  • No prefix — core ITSM tables (e.g., incident, problem, change_request)

Key Tables to Know by Heart

task
Task
Parent of ALL task-type records — foundational table
incident
Incident
Incident records (INC prefix)
problem
Problem
Problem records (PRB prefix)
change_request
Change
Change requests (CHG prefix)
sc_request
Request
Service catalog requests (REQ prefix)
sc_req_item
Requested Item
Catalog items ordered (RITM prefix)
sc_task
Catalog Task
Tasks created under RITMs (SCTASK prefix)
sys_user
User
User accounts and profiles
sys_user_group
Group
Assignment groups and teams
core_company
Company
Company / organization records
cmdb_ci
Configuration Item
Base class for all CIs in the CMDB
kb_knowledge
Knowledge
Knowledge base articles
sysapproval_approver
Approval
Approval records for workflows
sys_properties
System Property
Instance-wide configuration settings
sys_update_xml
Update XML
Individual records within update sets

Table Inheritance CRITICAL CONCEPT

ServiceNow uses object-oriented inheritance for tables. A parent table defines base fields shared by all its children. A child table extends the parent, adds its own fields, and automatically inherits every field from the parent.

Exam Critical: The task table is the parent of ALL task-type records. Fields defined on task — such as number, state, assigned_to, priority, short_description, and description — appear on all child tables because they are inherited.

The Task Inheritance Chain

task
incident
+ caller_id, business_service
task
problem
+ known_error, workaround
task
change_request
+ type, risk, cab_required
task
sc_request
sc_req_item
+ cat_item, quantity
task
sc_task
+ request_item (ref to RITM)

Why Inheritance Matters Practically

Inheritance has major consequences for security, reporting, and scripting:

Shared Fields
All task children share: number, state, assigned_to, priority, short_description, description, opened_by, resolved_at. These are defined once on task and inherited by all.
ACL Inheritance
An ACL (Access Control Rule) placed on the task table automatically protects all child tables. You don't need to duplicate security rules for each ITSM table.
Cross-Table Reporting
A report targeting the task table can aggregate data from incidents, problems, and changes all at once — because they are all stored as task records at the parent level.
Business Rules
A Business Rule on task fires for incidents, problems, and change requests. Be careful — rules on parent tables have very broad reach.
Exam Trap: If you create an ACL on the task table, it also protects incident, problem, and change_request. Child tables inherit parent ACLs. This is one of the most commonly tested inheritance facts.
Exam Trap: You cannot delete a table that has child tables. You must remove or re-parent all child tables before the parent can be deleted.

The System Dictionary (sys_dictionary)

The System Dictionary is ServiceNow's master catalog of every field on every table. Each row in sys_dictionary defines one column on one table — its data type, constraints, default value, and behavior.

Navigate to it via: System Definition > Dictionary, or type sys_dictionary.list in the navigator filter.

Navigation Tip: To find the dictionary entry for a specific field while looking at a form, right-click the field label and choose "Show in Dictionary". This jumps straight to that field's sys_dictionary record.

Key Dictionary Field Properties

Property What It Controls Notes
Table name Which table this field belongs to Links the field definition to its table
Column name The database column name (snake_case) Cannot be changed after creation without risk
Type Data type (String, Integer, Reference, etc.) Determines storage, UI widget, and validation
Max length Maximum characters allowed (String fields) Default is 40 for most strings
Mandatory Is this field required at the database level? Dictionary mandatory vs. form-level mandatory
Default value What value pre-populates on new records Can use JavaScript or dynamic values
Read only Can users edit this field? Enforced at dictionary level, not just UI
Dependent Show this field only when another field has a specific value Used for conditional field visibility
Choices For Choice fields — the list of valid dropdown values Stored in sys_choice table (not sys_dictionary)
Reference For Reference fields — which table the lookup points to E.g., assigned_to references sys_user
Active Whether this field is currently active/visible Deactivating hides the field without deleting

Creating a New Field (Column)

There are two main methods to add a new field to a table:

  1. Navigate to the table's list view by typing tablename.list in the navigator (e.g., incident.list).
  2. Right-click any column header in the list and select Configure → Table. This opens the table's field list.
  3. Click the New button at the top of the field list to create a new field.
  4. Fill in the required properties: Column label, Type, and optionally Column name, Max length, Default value, etc.
  5. Save the field definition. The column is now added to the database table.
  6. Go to Configure → Form Layout to drag the new field onto the form — it won't appear automatically.
Exam Trap: Adding a field to sys_dictionary does NOT automatically add it to the form. You must separately go to Form Layout and drag the field into the form's sections. The field exists in the database but is hidden until you expose it via the layout.
Quick Method: The fastest way to add a field is from the list view — right-click a column header → Configure → Table. This opens the table definition with a new field form pre-populated with the correct table name already filled in.

Field Types Reference — Comprehensive

Every dictionary entry has a Type. The type controls the database storage format, the UI input widget displayed on forms, and how values are validated and queried.

Exam Critical: Reference fields store the sys_id of the referenced record, NOT the display value. When you see "John Smith" in an Assigned To field, the database column actually stores a 32-character sys_id like 6816f79cc0a8016401c5a33be04be441. Scripts must use .getReferenceValue() to get the sys_id and .getDisplayValue() to get the readable name.
Type DB Storage Input Widget Example Use
String VARCHAR Single-line text box Name, short description, subject
Integer INT Number input field Priority (1–5), count, sequence
Float FLOAT Decimal number input Score, percentage, rating
Boolean TINYINT (0/1) Checkbox Active flag, mandatory, known error
Date DATE Date picker (calendar) Due date, birth date, start date
Date/Time DATETIME Date + time picker Opened at, resolved at, closed at
Duration BIGINT (ms) Duration picker (d h m s) SLA duration, business elapsed time
Choice VARCHAR Dropdown / select list State, category, impact, urgency
Reference VARCHAR (sys_id) Lookup popup / type-ahead Assigned to (user), caller, CI
Glide List VARCHAR (CSV sys_ids) Multi-select lookup Affected CIs, watch list members
Document ID VARCHAR (sys_id) Any-table lookup popup Dynamic reference to any table's record
Translated Field VARCHAR Localized text input Multi-language labels, descriptions
Journal Separate journal table Append-only textarea Work notes, additional comments
HTML CLOB Rich text / WYSIWYG editor Formatted descriptions, articles
URL VARCHAR Text field + external link icon External links, documentation URLs
Email VARCHAR Text field (email format) User email address
Phone VARCHAR Text field with formatting User or company phone number
Currency DECIMAL + currency code Amount + currency selector Cost fields, budget, price
Conditions VARCHAR (encoded query) Condition builder UI Filter criteria, business rule conditions
Script CLOB Code editor (syntax highlight) Business rule scripts, client scripts
Tip — Journal Fields: Journal fields (Work Notes, Comments) are special. They are append-only — each entry is stored as a separate record in a related journal table (sys_journal_field), not overwriting the previous value. This is why you can see the full history of all notes.
Tip — sys_id: Every record in ServiceNow has a sys_id — a 32-character hexadecimal globally unique identifier (GUID). It is the primary key for every table. You will see it in URLs, scripts, REST API responses, and update set XML everywhere.

Choice Fields & Choice Lists

A Choice field presents users with a fixed dropdown list of options. It is one of the most common field types in ServiceNow, used for fields like State, Category, Impact, Urgency, and Priority.

Choice values are not stored in sys_dictionary — they live in the sys_choice table. Each row in sys_choice represents one option in one dropdown.

Anatomy of a Choice Entry

Table
Which table this choice applies to (e.g., incident)
Element
The field name this choice belongs to (e.g., state)
Value
What is stored in the database (e.g., 1, 2, 6)
Label
What the user sees in the dropdown (e.g., "New", "In Progress", "Resolved")
Sequence
The display order in the dropdown (lower number = higher in list)
Language
Supports localized labels per language code for internationalization
Exam Critical — Value vs Label: The value is what is stored in the database. The label is what users see on screen. For Incident State: Value 1 → Label "New", Value 2 → Label "In Progress", Value 6 → Label "Resolved", Value 7 → Label "Closed". Scripts always work with the value, not the label.

Value vs Label — Visual Example

What the User Sees (Labels)

New
In Progress
On Hold
Resolved
Closed
Cancelled

What Is Stored in DB (Values)

1
2
3
6
7
8

Managing Choice Lists

To view or edit the choices for a field:

  • Right-click a Choice field on any form → "Show Choice List" — opens sys_choice filtered to that field
  • Navigate to sys_choice.list directly and filter by table and element
  • From the dictionary record for a Choice field, use the Choices related list at the bottom

Dependent Choice Lists

ServiceNow supports dependent choices — a subset of choices shown based on the value of another field. For example, the subcategory dropdown can show only relevant options depending on what category was selected. This is configured in sys_choice using the Dependent value field on each choice record.

Tables, Forms & Configuration

Form Layout Editor

The Form Layout editor controls which fields appear on a form, their order, and how they are organized into sections. Adding a field to the database does not show it on the form — you must use Form Layout to expose it.

To access Form Layout:

  • While viewing a form: right-click the form header → Configure → Form Layout
  • Or: right-click any field label → Configure → Form Layout

In the Form Layout editor you can:

  • Drag fields from Available (left) to Selected (right) to add them to the form
  • Create new collapsible sections to organize fields visually
  • Set fields as mandatory at the form level (different from dictionary-level mandatory)
  • Arrange fields in a 1-column or 2-column layout per section
  • Remove fields from the form without deleting them from the database
Exam Critical — Form Mandatory vs Dictionary Mandatory: There are two separate mandatory settings. Dictionary mandatory (in sys_dictionary) enforces the requirement at the database/API level — you cannot save without a value regardless of the form. Form-level mandatory (set in Form Layout) only enforces it through the UI form, and only in that specific view. Scripts and APIs can still bypass form-level mandatory.

Form Views

The same table can have multiple views of its form, each with different fields and layouts. Common built-in views include:

Default
The standard view shown to most users. Typically the most complete layout for IT staff.
ITIL
Shown to users with the ITIL role. Often has advanced fields like SLA timers, closure info, and extended attributes.
ESS
End-User Self Service view — simplified form shown to end users submitting tickets. Fewer technical fields.
Mobile
Optimized for mobile devices. Minimal fields, large touch targets, essential information only.
Exam Trap: Form Layout changes are view-specific. Adding a field to the "Default" view does not add it to the "ITIL" view, "ESS" view, or any other view. You must configure each view separately. Always confirm which view you are editing before saving.

List Layout

Separate from Form Layout, the List Layout controls which columns appear in the list view (tablename.list). Access it via right-clicking a column header → Configure → List Layout. Like Form Layout, list layouts are also per-view.

Script Includes (Brief Overview)

The sys_script_include table stores reusable JavaScript class and function libraries. Script Includes are not fields or forms — they are code modules that can be called from Business Rules, Client Scripts, REST APIs, and other server-side scripts. Each Script Include has a Name (the class/function name), Script (the code), and an API Name used to invoke it.

Quick Reference — Key Navigation Shortcuts

What you want How to get there
View all records in a table Type tablename.list in navigator
Open a new record form Type tablename.do in navigator
See all tables in the instance Navigate to sys_db_object.list
Open the System Dictionary System Definition → Dictionary or sys_dictionary.list
Edit a specific field's dictionary entry Right-click field label on form → Show in Dictionary
Edit form layout Right-click form header → Configure → Form Layout
Edit list columns Right-click column header → Configure → List Layout
View choice values for a dropdown Right-click Choice field on form → Show Choice List
Add a new field to a table Right-click column header → Configure → Table → New
Exam Summary — Must-Know Facts:
  • The task table is the parent of incident, problem, change_request, sc_request, sc_req_item, and sc_task
  • Child tables inherit ALL fields and ACLs from their parent table
  • Every field definition lives in sys_dictionary
  • Choice values live in sys_choice, not sys_dictionary
  • Reference fields store sys_ids, not display values
  • Adding a field to sys_dictionary ≠ adding it to the form (must use Form Layout separately)
  • Form Layout changes are view-specific — ITIL view ≠ Default view
  • Dictionary mandatory enforces at DB level; form mandatory enforces at UI level only
  • Every record has a 32-character sys_id as its unique primary key
  • You cannot delete a parent table that still has child tables
← Users & Roles Security & Access Controls →