关于 application-scope
面向 ServiceNow 自定义应用开发者的技能,指导设置当前应用范围并使更新集与应用对齐。通过查询、切换和验证操作,帮助确保开发记录归属正确,并说明跨范围访问注意事项。
主要功能
- 01查询并选择目标应用
- 02设置当前应用范围
- 03创建并切换应用更新集
- 04验证范围与更新集的关联
- 05管理跨范围访问权限
适用场景
- 01开始自定义应用开发前配置范围
- 02为独立功能创建应用专属更新集
- 03排查记录未捕获或范围错误
- 04为应用访问其他表配置权限
MCP 相关
该技能使用 ServiceNow MCP 工具查询应用和更新集、设置当前应用范围与更新集,并验证配置是否匹配。
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ happy-technologies-llc/ happy-platform-skills --skill application-scope安装后在 Claude Code 中输入/application-scope确认已加载。
详细介绍
应用范围管理
概述
在 ServiceNow 中进行范围应用开发,需要谨慎管理应用上下文并确保更新集保持一致。本技能介绍如何设置当前应用范围、了解范围应用与全局应用的区别,以及确保更新集与应用开发正确对齐。
- 解决什么问题? 防止记录被创建在错误的应用范围内,并确保范围应用的更新集能正确捕获变更
- 谁应该使用此技能? 构建自定义范围应用的 ServiceNow 开发者
- 预期结果是什么? 应用构件范围设置正确,更新集能正确捕获变更,命名空间相互隔离
前提条件
- 必需的 ServiceNow 角色:
admin或application_creator - 已有范围应用,或有权创建应用
- 了解 ServiceNow 应用范围和命名空间
- 相关技能:
admin/update-set-management(必须先了解更新集)
操作步骤
步骤 1:识别目标应用
首先,找到你要使用的应用。
使用 MCP 工具:
Tool: SN-Query-Table
Parameters:
table_name: sys_app
query: scope!=global^active=true
fields: sys_id,name,scope,version,vendor
limit: 50
预期响应:
{
"result": [
{
"sys_id": "abc123def456...",
"name": "My Custom Application",
"scope": "x_myco_custom_app",
"version": "1.0.0",
"vendor": "My Company"
}
]
}
决策点:
- 如果应用存在 → 继续步骤 2
- 如果未找到应用 → 创建新应用(参见示例 3)
- 如果需要从多个应用中选择 → 确认范围前缀与预期命名空间一致
步骤 2:设置当前应用范围
为后续所有操作设置应用上下文。
使用 MCP 工具:
Tool: SN-Set-Current-Application
Parameters:
app_sys_id: abc123def456...
重要提示: 这是通过 sys_trigger 机制执行的自动化操作。大约需要 1-2 秒。
验证:
Tool: SN-Query-Table
Parameters:
table_name: sys_user_preference
query: user=javascript:gs.getUserID()^name=apps.current_app
fields: value
步骤 3:验证或创建应用更新集
范围应用应有各自的更新集,以保持清晰隔离。
查询应用现有的更新集:
Tool: SN-Query-Table
Parameters:
table_name: sys_update_set
query: application=abc123def456...^state=in progress
fields: sys_id,name,state,application
limit: 10
决策点:
- 如果存在合适的更新集 → 使用现有更新集(步骤 4)
- 如果没有更新集,或所有更新集均已完成 → 创建新的更新集
创建应用专用更新集:
Tool: SN-Create-Record
Parameters:
table_name: sys_update_set
data:
name: "My Custom App - Feature Development v1.1"
application: abc123def456...
state: in progress
description: "Development update set for new features"
步骤 4:设置当前更新集
使更新集与应用范围保持一致。
使用 MCP 工具:
Tool: SN-Set-Update-Set
Parameters:
update_set_sys_id: xyz789ghi012...
验证:
Tool: SN-Get-Current-Update-Set
Parameters: (none required)
预期响应:
{
"name": "My Custom App - Feature Development v1.1",
"sys_id": "xyz789ghi012...",
"state": "in progress",
"application": "abc123def456..."
}
步骤 5:验证范围与更新集是否一致
在开始开发前,确认范围和更新集均已正确设置。
完整验证查询:
Tool: SN-Query-Table
Parameters:
table_name: sys_update_set
query: sys_id=xyz789ghi012...
fields: sys_id,name,application.name,application.scope
一致性检查清单:
- 应用范围与预期应用一致
- 更新集的应用字段引用了正确的应用
- 更新集状态为“进行中”
- 用户对该范围具有写入权限
工具用法
MCP 工具(Claude Code/Desktop)
| 工具 | 用途 |
|---|---|
SN-Set-Current-Application | 设置当前应用范围 |
SN-Set-Update-Set | 设置当前更新集 |
SN-Get-Current-Update-Set | 验证当前更新集 |
SN-Query-Table | 查询应用和更新集 |
SN-Create-Record | 创建新的更新集 |
REST API(ChatGPT/其他)
| 端点 | 方法 | 用途 |
|---|---|---|
/api/now/table/sys_app | GET | 列出应用 |
/api/now/table/sys_update_set | GET | 列出更新集 |
/api/now/table/sys_update_set | POST | 创建更新集 |
注意: 通过 REST API 设置当前应用,需要执行后台脚本或操作会话,过程较为复杂。MCP 工具会自动处理。
原生工具(Claude Code)
| 工具 | 用途 |
|---|---|
Bash | 执行 curl 命令进行 REST 操作 |
Read | 读取应用配置文件 |
范围应用与全局应用的注意事项
何时使用 Scoped 应用程序
使用 Scoped 应用程序的情况:
- 构建可复用、可分发的应用程序
- 开发需要命名空间隔离的功能
- 为 ServiceNow Store 创建应用程序
- 在多租户场景中构建特定于租户的自定义功能
- 实现可在升级后正常保留的功能
使用 Global Scope 的情况:
- 进行小型的一次性自定义
- 修改 ServiceNow 开箱即用的功能
- 创建需要广泛访问表的集成
- 在采用 Scoped 架构前进行原型设计
Scoped 应用程序的优势
| 优势 | 说明 |
|---|---|
| 命名空间隔离 | 表、脚本和 UI 元素带有 Scope 前缀(例如,x_myco_app_*) |
| 升级保护 | Scoped 工件与平台升级相互隔离 |
| 依赖项管理 | 明确应用程序之间的依赖关系 |
| 访问控制 | 应用程序级别的访问限制 |
| 可移植性 | 可通过更新集或 Store 轻松导出/导入 |
Scoped 应用程序的限制
| 限制 | 影响 | 解决方法 |
|---|---|---|
| GlideRecord 访问受限 | 默认情况下无法查询所有 Global 表 | 通过 Application Properties 请求跨 Scope 访问权限 |
| API 受限 | 某些 GlideSystem API 不可用 | 使用允许的 API 或请求提升权限 |
| UI 限制 | 无法修改 Global UI 元素 | 创建 Scoped UI 组件 |
| Script Include 可见性 | 必须明确开放跨 Scope 访问 | 设置 accessible_from: all_application_scopes |
跨 Scope 访问
如需允许 Scoped 应用程序访问 Global 表或其他 Scoped 表:
Tool: SN-Create-Record
Parameters:
table_name: sys_scope_privilege
data:
application: abc123def456...
table: incident
operation: read_write
status: allowed
最佳实践
- 设置 Scope 后再设置更新集: 始终先设置应用程序 Scope,再设置更新集。这样可确保更新集与正确的应用程序关联。
- 每项功能使用一个更新集: 为不同的功能或冲刺创建单独的更新集,以便进行精细部署
- 命名约定: 使用一致的命名格式:
{App Name} - {Feature/Sprint} - {Version}(例如,“My App - User Portal v1.2”) - 开发前验证: 每次开发会话开始时,运行完整的验证流程(步骤 1-5)
- 与应用程序关联的更新集: 创建更新集时,始终将
application字段设为 Scoped 应用的 sys_id - Scope 前缀一致性: 在相关应用程序之间保持 Scope 前缀一致(例如,
x_myco_*)
故障排除
常见问题 1:记录创建在错误的 Scope 中
症状: 新记录出现在 Global Scope,而不是预期的应用程序中
原因: 创建记录前未设置应用程序 Scope
解决方案:
- 使用
SN-Set-Current-Application设置应用程序 Scope - 通过查询 sys_user_preference 验证 Scope 已激活
- 删除 Scope 错误的记录并重新创建
常见问题 2:更新集未捕获记录
症状: 更改未出现在更新集中
原因: 更新集与应用程序 Scope 不匹配,或更新集未激活
解决方案:
- 验证更新集的
application字段与当前 Scope 相匹配 - 确认更新集状态为 “in progress”
- 检查所修改的表是否会被更新集捕获(某些表不包含在内)
常见问题 3:无法设置应用程序 Scope
症状: SN-Set-Current-Application 失败或不起作用
原因: 权限不足或找不到应用程序
解决方案:
- 验证用户具有
admin或application_creator角色 - 确认 app_sys_id 正确且应用程序存在
- 检查应用程序是否处于活动状态(未退役)
常见问题 4:跨作用域访问被拒绝
症状: GlideRecord 查询没有返回结果或抛出错误 原因: 受作用域限制的应用缺少访问目标表的权限 解决方案:
- 创建授予访问权限的 sys_scope_privilege 记录
- 或修改脚本包含,以便使用具有提升权限的
GlideRecordSecure - 在应用程序属性中申请跨作用域访问权限
常见问题 5:更新集关联到了错误的应用程序
症状: 更新集存在,但关联到了 Global 或其他应用 原因: 在设置应用程序作用域之前创建了更新集 解决方案:
- 更新更新集的
application字段:
Tool: SN-Update-Record
Parameters:
table_name: sys_update_set
sys_id: xyz789ghi012...
data:
application: abc123def456...
- 如有需要,将现有记录移至与新应用程序关联的更新集
示例
示例 1:标准开发会话设置
启动受作用域限制的开发会话所需的完整设置:
# Step 1: Find application
Tool: SN-Query-Table
Parameters:
table_name: sys_app
query: scope=x_myco_custom_app
fields: sys_id,name,scope
# Step 2: Set application scope
Tool: SN-Set-Current-Application
Parameters:
app_sys_id: abc123def456...
# Step 3: Find or create update set
Tool: SN-Query-Table
Parameters:
table_name: sys_update_set
query: application=abc123def456...^state=in progress
fields: sys_id,name
# Step 4: Set update set
Tool: SN-Set-Update-Set
Parameters:
update_set_sys_id: xyz789ghi012...
# Step 5: Verify setup
Tool: SN-Get-Current-Update-Set
Parameters: (none)
示例 2:为应用程序创建新的更新集
创建正确关联的更新集:
# Create update set linked to application
Tool: SN-Create-Record
Parameters:
table_name: sys_update_set
data:
name: "Customer Portal - Sprint 14"
application: abc123def456...
state: in progress
description: "Sprint 14 features: ticket submission, knowledge base search"
# Set as current
Tool: SN-Set-Update-Set
Parameters:
update_set_sys_id: [sys_id from above]
示例 3:创建新的受作用域限制的应用程序
从头开始创建新的受作用域限制的应用程序:
# Step 1: Create the application
Tool: SN-Create-Record
Parameters:
table_name: sys_app
data:
name: "My New Application"
scope: "x_myco_newapp"
version: "1.0.0"
vendor: "My Company"
short_description: "Application for managing custom workflows"
# Step 2: Set as current application
Tool: SN-Set-Current-Application
Parameters:
app_sys_id: [sys_id from above]
# Step 3: Create initial update set
Tool: SN-Create-Record
Parameters:
table_name: sys_update_set
data:
name: "My New Application - Initial Development"
application: [sys_id from step 1]
state: in progress
# Step 4: Set update set
Tool: SN-Set-Update-Set
Parameters:
update_set_sys_id: [sys_id from step 3]
示例 4:多实例受作用域限制的开发
在特定实例上设置作用域:
# Set application on dev instance
Tool: SN-Set-Current-Application
Parameters:
app_sys_id: abc123def456...
instance: dev
# Set update set on dev instance
Tool: SN-Set-Update-Set
Parameters:
update_set_sys_id: xyz789ghi012...
instance: dev
# Verify on dev instance
Tool: SN-Get-Current-Update-Set
Parameters:
instance: dev
示例 5:验证更新集记录捕获情况
确认记录是否正确捕获:
# Create a test record
Tool: SN-Create-Record
Parameters:
table_name: sys_properties
data:
name: x_myco_app.test_property
value: test_value
type: string
# Verify capture in update set
Tool: SN-Query-Table
Parameters:
table_name: sys_update_xml
query: update_set=xyz789ghi012...^nameSTARTSWITHsys_properties
fields: sys_id,name,type,action
limit: 10
完整自动化工作流
结合作用域与更新集管理的完整自动化示例:
# FULLY AUTOMATED SCOPED APP DEVELOPMENT (Zero Manual Steps!)
# 1. Query for existing application
Tool: SN-Query-Table
Parameters:
table_name: sys_app
query: scope=x_myco_custom_app
fields: sys_id,name,scope,version
# 2. Set as current application (automated via sys_trigger)
Tool: SN-Set-Current-Application
Parameters:
app_sys_id: abc123def456...
# 3. Find or create update set
Tool: SN-Query-Table
Parameters:
table_name: sys_update_set
query: application=abc123def456...^state=in progress
fields: sys_id,name
# 4. Set update set (automated via sys_trigger)
Tool: SN-Set-Update-Set
Parameters:
update_set_sys_id: xyz789ghi012...
# 5. Verify both are active
Tool: SN-Get-Current-Update-Set
Parameters: (none)
# 6. Begin development - create business rule
Tool: SN-Create-Record
Parameters:
table_name: sys_script
data:
name: Validate Custom Record
table: x_myco_custom_app_records
when: before
active: true
script: |
(function executeRule(current, previous) {
if (!current.name) {
gs.addErrorMessage('Name is required');
current.setAbortAction(true);
}
})(current, previous);
# 7. Verify capture
Tool: SN-Query-Table
Parameters:
table_name: sys_update_xml
query: update_set=xyz789ghi012...
fields: sys_id,type,name,action
相关技能
admin/update-set-management- 详细管理更新集admin/instance-management- 为受作用域限制的开发切换实例admin/deployment-workflow- 在多个实例间部署受作用域限制的应用程序admin/batch-operations- 在某个作用域内执行批量操作