Query, insert, update, and delete records in the ServiceNow database with emphasis on performance and security. Covers GlideRecord, GlideQuery, GlideAggregate, and secure data access patterns. Use when working with database records, aggregating data, or implementing data-driven logic.
Resources
1Install
npx skillscat add danielmadsendk/nowdev-ai-toolbox/servicenow-manipulate-data Install via the SkillsCat registry.
SKILL.md
Manipulate ServiceNow Data
Quick start
Querying records (traditional):
var gr = new GlideRecord('incident');
gr.addQuery('state', 'Open');
gr.addQuery('priority', '<=', 2);
gr.orderBy('created_on');
gr.query();
while (gr.next()) {
gs.info('Incident: ' + gr.getValue('number'));
}Modern fluent queries:
var records = new global.GlideQuery('incident')
.where('active', true)
.where('priority', '<=', 2)
.select();
for (var i = 0; i < records.length; i++) {
var incident = records[i];
}Aggregating data:
var agg = new GlideAggregate('incident');
agg.addAggregate('COUNT');
agg.addAggregate('SUM', 'time_worked');
agg.query();
while (agg.next()) {
var count = agg.getAggregate('COUNT');
var total = agg.getAggregate('SUM');
}Secure access (with ACL enforcement):
var gr = new GlideRecordSecure('confidential_table');
gr.query();
// Only returns records user has permission to seePerformance patterns
| Pattern | Use Case | Performance |
|---|---|---|
setLimit(1) |
Existence check | Fast |
getValue('field') |
Get single value | No dot-walk overhead |
GlideAggregate |
Count/Sum | Much faster than loop |
addEncodedQuery() |
Complex filters | Copy from list view |
Best practices
- Use
GlideQueryfor new code (modern, fluent) - Use
GlideRecordfor complex queries and CRUD operations - Never iterate to count; use
GlideAggregateinstead - Use
getValue()instead of dot-walking for performance - Use
GlideRecordSecurewhen ACLs matter - Use
setLimit(1)for existence checks - Copy
encodedQueryfrom list views for complex filters - Test queries on sub-production before production
- Refactor repeated query logic into Script Includes
- Always check if record exists with
next()before accessing
Key APIs
| API | Purpose |
|---|---|
| GlideRecord | CRUD operations, traditional |
| GlideQuery | NEW - fluent, modern queries |
| GlideAggregate | Counts, sums, aggregations |
| GlideRecordSecure | ACL-enforced queries |
| GlideFilter | Advanced filtering operations |
Reference
For Performance optimization, decision matrices, and anti-patterns, see BEST_PRACTICES.md