2021年4月12日月曜日

同姓同名のユーザ(あるいは同一文字列で表現される)の情報をルックアップ元のテーブルから正しく識別してインポートする

Servicenowのインポート機能は強力なのだが、時に躓くことがある。

この例も実際自分が躓いた例。Type がReferenceになっていて同名レコードが元テーブル(参照先テーブル)に存在するフィールドの正しいインポート方法。

例えばであるがsys_userに「山田 太郎」という名前の人物が2名いる。

例えばこんなケース。

yamada.taro1とyamada.taro2は「User ID」や「Sys_ID」では区別ができるので、sys_userテーブルに対するインポートや更新では特に問題になる事はない。

問題になるのはこの同名のエントリをルックアップしているテーブルのインポートを行うときである。

例えばグループとユーザの関係性を定義している、sys_user_grmemberテーブルを見ると次のようになっている。

Help Deskグループに山田 太郎が二人とも所属している場合こうなる。

インポート機能を使った事がある方はお分かりと思うが、このようなデータをインポートしようとして、テーブルをエクスポートしたり、更新インポート用のエクセルフォーマットを出力したとしても、次のようなフィールドが得られるだけである。

要するにこのままでは、「山田 太郎」がyamada.taro1とyamada.taro2のいずれなのかを区別して扱う事が出来ない。

当然ながらこのようなデータをインポートしても、1と2どちらの山田太郎が選択されたデータが出来上がるかが不明である(ちゃんと検証していないがSys_IDが若い方が勝手に選ばれていた様な気がする)。

これでは困るので、SYS IDなりユーザIDなり一意の情報を指定してインポートしたいわけだが、User列にyamada.taro1のIDなりSYS_IDなりを記載してインポートしてもエラーになるだけなのである。

色々と検索してみても(どこかにはあるのかもしれないが)なかなかこれを解決するためのドキュメントが見つからず困った。

で、この同名レコードのルックアップ元テーブルからのインポート問題(Type がReferenceになっていて同名レコードが元テーブルに存在するフィールドの正しいインポート方法)、を解決するには、結論としてはインポート用のデータを少し工夫した上で、変換マップでそれに応じた定義をしてやる必要がある。

ちなみに↓この辺の記事を検索して、もしかしてScriptを書かなきゃいけないのか?とかいろいろ逡巡したが・・・よく読んだらこれは別件。

https://community.servicenow.com/community?id=community_question&sys_id=cab707e9db1cdbc01dcaf3231f9619cf

↓こっちの最後の方のやり方で解決。

https://community.servicenow.com/community?id=community_question&sys_id=be6f6363dba2db40f7fca851ca961941

まずyamada.taro1とyamada.taro2を一意に特定可能なカラムをインポート元のファイルに用意する。

ここではUser IDを使用したが、sys_id等を使っても基本的に考え方は同じ。

このデータをインポートすると、

・yamada.taro1がApplication Developmentに、

・yamada.taro2がTeam SNOWとApplication Developmentの両方に、

・Helpdeskへの所属は両名とも上書きで無くなる、

という変化を想定する。

では実際定義を進めてみたい。


まずSystem Import Sets -> Load Dataからこのファイルをロードする。

Submit。しばらく待って次の画面で、Create transform map。

次のようにしていったん保存。

Auto Map Matching Fieldsでいったん簡単にマッピングできるところはしてしまう。

更新インポートにしたいのでSYSIDもマッピングする必要がある。NewボタンでField MAPの定義を出し、次のようにSys_IDのマッピングを定義。Submit

また、User列も問題になるので、画面下部のリストから〇にiマークのアイコンからOpen Record。


次のような定義になっているのを、

次の通り変更する。

 Source field:User_ID ←こちらはExcelファイル上のカラム名

 Referenced value field name:User_ID ←こちらはsys_userテーブル上のカラム名

これでExcelのUser_ID列を、sys_userテーブルのuser_idカラムをリファレンスにしてsys_user_grmemberテーブルのuserフィールドに対応付けるという定義が出来たので、Update。

次の画面に戻るので、Create new record on empty coalesce fieldsにチェックしておき、Save。

Transform。

今度はTransformボタン。

完了。

sys_user_grmember.listで確認してみると・・・

あれ、追加は正しくされている物の、アップデートが変化してないぞ。。。

うーん。Application Development に yamada.taro2が所属、という新規レコードは正しく反映されているのと、ほかの2レコードもレコードの最終更新日時は上書きされているので、インポート手順とは別問題の様な気がする。

そもそもsys_user_grmemberの既存エントリって、編集不可なんだよな、フォームで直接開いても。。。

・・・という事で消化不良ながら、この方法でSysIDなり、その他のUser IDの様な一意の値を使って、参照タイプのフィールドも適切に設定する事自体は可能な事がわかった。

sys_user_grmemberテーブルに更新インポートが通らないのは別問題として調査継続としたい。

0 件のコメント:

ウェブサイトのURLにおけるトレイリングスラッシュの解釈と有無による動作の違い

インターネットが現代社会におけるコミュニケーションの基盤となっている今日、ウェブサイトのURLはビジネスや個人ブランディングにとって重要な役割を果たしています。URLは単にウェブページへの経路を示すだけでなく、SEO(検索エンジン最適化)においても重要な要素です。この記事では、U...