mcpField
G
gliderecord-patterns

gliderecord-patterns

github.com/serac-labsデータ・データベース7760 回インストール9 週間前に更新
リポジトリ

gliderecord-patterns について

ServiceNow開発者向けのGlideRecordデータベース操作ガイドです。クエリ、CRUD、パフォーマンス上の注意点に加え、クエリ演算子やアクセス権確認、入力検証などの安全上の留意事項を扱います。

主な機能

  1. 01単一レコードと複数レコードの検索例
  2. 02エンコードクエリと演算子の説明
  3. 03挿入・更新・削除の方法
  4. 04クエリ負荷を抑える方法
  5. 05ACLと入力検証の注意点

活用シーン

  1. 01ServiceNowテーブル内のレコード検索
  2. 02レコードの作成・更新・削除
  3. 03一括クエリと件数取得の最適化
  4. 04スクリプトの権限と入力処理の確認

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/serac-labs/serac --skill gliderecord-patterns

インストール後、Claude Code で/gliderecord-patternsを入力して読み込まれたか確認します。

詳細

ServiceNow 向け GlideRecord のベストプラクティス

GlideRecord は、ServiceNow でデータベース操作を行うための主要な API です。以下のパターンに従うことで、効率的で安全なクエリを実行できます。

基本的なクエリパターン

sys_id で単一のレコードを取得する
var gr = new GlideRecord("incident")
if (gr.get("sys_id_here")) {
  gs.info("Found: " + gr.getValue("number"))
}
フィールドで単一のレコードを取得する
var gr = new GlideRecord("sys_user")
if (gr.get("user_name", "admin")) {
  gs.info("Found user: " + gr.getValue("name"))
}
複数のレコードをクエリする
var gr = new GlideRecord("incident")
gr.addQuery("active", true)
gr.addQuery("priority", "1")
gr.orderByDesc("sys_created_on")
gr.setLimit(100)
gr.query()

while (gr.next()) {
  gs.info(gr.getValue("number"))
}

エンコードクエリ(高速)

複雑な条件にはエンコードクエリを使用してください。複数の addQuery 呼び出しよりも効率的です。

var gr = new GlideRecord("incident")
// Encoded query from list view URL or Query Builder
gr.addEncodedQuery("active=true^priority=1^assigned_toISEMPTY")
gr.query()

while (gr.next()) {
  // Process records
}

パフォーマンスのヒント

1. 必ず setLimit() を使用する
// When you only need X records
var gr = new GlideRecord("incident")
gr.addQuery("active", true)
gr.setLimit(10) // Don't fetch more than needed
gr.query()
2. 文字列には getValue() を使用する
// CORRECT - Returns string value
var number = gr.getValue("number")

// ALSO WORKS but returns GlideElement
var element = gr.number
var numberStr = gr.number.toString()
3. 参照フィールドには getDisplayValue() を使用する
// Get the display value of a reference field
var assignedToName = gr.getDisplayValue("assigned_to")

// Get the sys_id of a reference field
var assignedToId = gr.getValue("assigned_to")
4. ループ内でのクエリを避ける
// BAD - Query inside loop
for (var i = 0; i < userIds.length; i++) {
  var gr = new GlideRecord("sys_user")
  gr.get(userIds[i]) // N queries!
}

// GOOD - Single query with IN clause
var gr = new GlideRecord("sys_user")
gr.addQuery("sys_id", "IN", userIds.join(","))
gr.query()
while (gr.next()) {
  // Process all users at once
}
5. 件数の取得には GlideAggregate を使用する
// BAD - Counting with GlideRecord
var count = 0
var gr = new GlideRecord("incident")
gr.addQuery("active", true)
gr.query()
while (gr.next()) {
  count++
}

// GOOD - Use GlideAggregate
var ga = new GlideAggregate("incident")
ga.addQuery("active", true)
ga.addAggregate("COUNT")
ga.query()
if (ga.next()) {
  var count = ga.getAggregate("COUNT")
}

CRUD 操作

挿入
var gr = new GlideRecord("incident")
gr.initialize()
gr.setValue("short_description", "New incident")
gr.setValue("caller_id", gs.getUserID())
gr.setValue("priority", "3")
var sysId = gr.insert()
更新
var gr = new GlideRecord("incident")
if (gr.get("sys_id_here")) {
  gr.setValue("state", "6") // Resolved
  gr.setValue("close_notes", "Issue fixed")
  gr.update()
}
削除(慎重に使用してください!)
var gr = new GlideRecord("incident")
if (gr.get("sys_id_here")) {
  gr.deleteRecord()
}
一括更新
var gr = new GlideRecord("incident")
gr.addQuery("state", "6") // Resolved
gr.addQuery("resolved_at", "<", gs.daysAgoStart(30))
gr.query()

while (gr.next()) {
  gr.setValue("state", "7") // Closed
  gr.update()
}

クエリ演算子

演算子例説明
=addQuery('active', true)等しい
!=addQuery('active', '!=', true)等しくない
>, <addQuery('priority', '<', '3')より大きい/小さい
>=, <=addQuery('sys_created_on', '>=', gs.daysAgoStart(7))以上/以下
CONTAINSaddQuery('short_description', 'CONTAINS', 'error')文字列を含む
STARTSWITHaddQuery('number', 'STARTSWITH', 'INC')で始まる
ENDSWITHaddQuery('email', 'ENDSWITH', '@company.com')で終わる
INaddQuery('state', 'IN', '1,2,3')リスト内にある
NOT INaddQuery('state', 'NOT IN', '6,7')リスト内にない
ISEMPTYaddQuery('assigned_to', 'ISEMPTY', '')フィールドが空
ISNOTEMPTYaddQuery('assigned_to', 'ISNOTEMPTY', '')フィールドが空でない

セキュリティに関する考慮事項

  1. setWorkflow(false) - 一括操作ではビジネスルールをスキップします
  2. setLimit() - 過剰なクエリを防ぎます
  3. canRead()/canWrite() を確認する - ACL 権限を確認します
  4. ユーザー入力を決して信頼しない - クエリで使用する前に検証します

コメント