Tables & System Dictionary
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).
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
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.
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
Why Inheritance Matters Practically
Inheritance has major consequences for security, reporting, and scripting:
number, state, assigned_to, priority, short_description, description, opened_by, resolved_at. These are defined once on task and inherited by all.task table automatically protects all child tables. You don't need to duplicate security rules for each ITSM table.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.task fires for incidents, problems, and change requests. Be careful — rules on parent tables have very broad reach.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.
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.
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:
- Navigate to the table's list view by typing
tablename.listin the navigator (e.g.,incident.list). - Right-click any column header in the list and select Configure → Table. This opens the table's field list.
- Click the New button at the top of the field list to create a new field.
- Fill in the required properties: Column label, Type, and optionally Column name, Max length, Default value, etc.
- Save the field definition. The column is now added to the database table.
- Go to Configure → Form Layout to drag the new field onto the form — it won't appear automatically.
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.
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.
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 |
| 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 |
sys_journal_field), not overwriting the previous value. This is why you can see the full history of all notes.
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
incident)state)1, 2, 6)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)
What Is Stored in DB (Values)
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_choicefiltered to that field - Navigate to
sys_choice.listdirectly 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
Form Views
The same table can have multiple views of its form, each with different fields and layouts. Common built-in views include:
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 |
- The
tasktable is the parent ofincident,problem,change_request,sc_request,sc_req_item, andsc_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, notsys_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_idas its unique primary key - You cannot delete a parent table that still has child tables