Snowflakeでの ServiceNow®データへのアクセス

ServiceNow®用Snowflakeコネクタは、 コネクタ規約 に従うものとします。

このトピックでは、Snowflakeアカウントから ServiceNow データにアクセスする方法について説明します。

このトピックの内容:

同期用に構成された ServiceNow 内のテーブルごとに、コネクタは次のテーブルとビューを作成します。

  • 各記録が単一の VARIANT 列に含まれる、生のデータを含む同じ名前のテーブル。

  • ServiceNow の記録に加えられた変更の履歴を含む table_name__event_log という名前のテーブル。

  • フラット化された形式のデータを含む table_name__view という名前のビュー。このビューには、元のテーブルにある各列の列と、元のテーブルに存在する各記録の行が含まれています。

  • table_name__view と同じデータと、 ServiceNow で削除された記録の行を含む table_name__view_with_deleted という名前のビュー。

注釈

コネクタを開始した後、ビューが作成されるまでに時間がかかる場合があります。

ビューの作成は、 ServiceNow sys_db_objectsys_dictionary、および sys_glide_object テーブルにあるデータに依存しています。コネクタは、ビジネステーブルの同期を有効にすると、これらのテーブルからメタデータをロードします。メタデータテーブルがインジェストされると、バックグラウンドタスクが有効化されたテーブルのフラット化されたビューを作成します。タスクは、最も頻繁にテーブルをインジェストするスケジュールと同じ頻度で実行されます。メタデータテーブルが同期されると、このタスクはテーブルスキーマの変更もキャプチャし、それに応じて作成済みのビューを更新します(接尾辞 __view__view_with_deleted を持つビューのみで、 __view_with_display_values を持つビューは更新されません)。

即時処理ではないため、ビュー作成プロセスのステータスは ENABLED_TABLES ビューの下に表示されます。ビューの作成に時間がかかりすぎる場合は、 CONNECTOR_ERRORS ビューに関連するエラーがないかチェックすることもできます。

次のセクションでは、このデータにアクセスする権限を付与する方法と、これらのテーブルおよびビューからデータにアクセスする方法について説明します。

Snowflakeでの ServiceNow データにアクセスする権限の付与

Snowflake Connector for ServiceNow® がデータをSnowflakeと同期した後、次の権限を持つすべてのロールが ServiceNow データにアクセスできます。

  • Snowflakeで ServiceNow データを含むデータベースとスキーマに対する USAGE 権限、 および

  • このスキーマ内のテーブルまたはビューに対する SELECT 権限

Snowflakeは、インジェストされた ServiceNow データへのアクセスが必要なユーザーに付与できる、これらの権限を持つ専用のロールを作成することをお勧めします。

たとえば、 ServiceNow データを dest_db データベースと dest_schema スキーマに格納するようにコネクタを構成した場合は、 servicenow_data_reader_role という名前のロールを作成し、データにアクセスする権限をそのロールに付与できます。

次の例は、これらの権限を付与する方法を示しています。

CREATE ROLE servicenow_data_reader_role;
GRANT USAGE ON DATABASE dest_db TO ROLE servicenow_data_reader_role;
GRANT USAGE ON SCHEMA dest_db.dest_schema TO ROLE servicenow_data_reader_role;
GRANT SELECT ON FUTURE TABLES IN SCHEMA dest_db.dest_schema TO ROLE servicenow_data_reader_role;
GRANT SELECT ON FUTURE VIEWS IN SCHEMA dest_db.dest_schema TO ROLE servicenow_data_reader_role;
GRANT SELECT ON ALL TABLES IN SCHEMA dest_db.dest_schema TO ROLE servicenow_data_reader_role;
GRANT SELECT ON ALL VIEWS IN SCHEMA dest_db.dest_schema TO ROLE servicenow_data_reader_role;
Copy

注釈

  • Snowflake内に ServiceNow データが含まれているスキーマで GRANT OWNERSHIP ON FUTURE TABLES IN SCHEMA を実行しないでください。また、コネクタによってすでに作成済みのテーブルの所有権を変更しないでください。所有権を変更すると、コネクタがテーブルにデータをインジェストすることができなくなります。

  • Snowflakeで ServiceNow データを含むスキーマのビューの所有権を変更しないでください。所有権を変更すると、 ServiceNow テーブルスキーマで変更が発生したときにコネクタがビューを更新できなくなります。

生データへのアクセス

同期する ServiceNow テーブルごとに、 Snowflake Connector for ServiceNow® はデータベースに同じ名前の新しいテーブルを作成し、Snowflakeで ServiceNow データのスキーマを作成します。

たとえば、 ServiceNow データを dest_db データベースと dest_schema スキーマに格納するようにコネクタを構成し、 ServiceNow の incident テーブルを同期するようにコネクタを構成した場合、コネクタは dest_db.dest_schema.incident という名前のテーブルを作成します。

このテーブルには、 ServiceNow から取り込まれた生データが含まれています。このテーブルには次の列が含まれます。

データ型

説明

sys_id

VARCHAR

ServiceNow 内にある記録の sys_id の値。

raw

VARIANT

記録の生データ。

is_deleted

BOOLEAN

ServiceNow で記録が削除されたかどうかを示します。

last_update_date

TIMESTAMP_NTZ

Snowflakeで記録が最後に更新された時刻。表示されるタイムスタンプは、オフセットなしで UTC タイムゾーンで提供され、これは ServiceNow インスタンスに表示された日付のタイムゾーンと異なる場合があります。

以下は、 dest_db.dest_schema.incident テーブルのデータを取得する SELECT ステートメントの出力例です。

SELECT * FROM DEST_DB.DEST_SCHEMA.INCIDENT LIMIT 5;

+----------------------------------+-------------------------+-------------+--------------------------+
| SYS_ID                           | RAW:ACTIVE              |  IS_DELETED | LAST_UPDATE_DATE         |
+----------------------------------+-------------------------+-------------+--------------------------+
| caa04d36db8ba0106e9643c81396197b | {"active": "true", ...} |  FALSE      |  2021-08-24 12:59:23.932 |
| cea045be1b03e010eac562c4bd4bcbb2 | {"active": "true", ...} |  FALSE      |  2021-08-24 12:59:23.932 |
| caa0c9bedb8be010f9f19c41ba961934 | {"active": "true", ...} |  FALSE      |  2021-08-24 12:59:23.932 |
| caa0c9bedb8be010f9f19c41ba961969 | {"active": "true", ...} |  FALSE      |  2021-08-24 12:59:23.932 |
| b9a0c53adb436410d6fa2b691396190a | {"active": "true", ...} |  FALSE      |  2021-08-24 12:59:23.932 |
+----------------------------------+-------------------------+-------------+--------------------------+
Copy

フラット化されたデータへのアクセス

データを含むテーブルごとに、コネクタは生データに対して2つのフラット化されたビューを作成します。ビューの名前は、サフィックス __view__view_with_deleted が付いたテーブルの名前です。たとえば、 incident という名前の ServiceNow テーブルの場合、コネクタは次のビューを作成します。

  • dest_db.dest_schema.incident__view

  • dest_db.dest_schema.incident__view_with_deleted

__view サフィックスを持つビューには、 ServiceNow テーブルにある記録が含まれています。 __view_with_deleted サフィックスを持つビューには、これらの同じ記録と、 ServiceNow テーブルから削除された記録が含まれています。

次に注意してください。

  • これらのビューにある列の名前は大文字です。小文字の名前を使用してこれらの列にアクセスすることはできません。

  • 時刻とタイムスタンプを持つ列は、 ServiceNow インスタンスで設定されたタイムゾーンに関係なく、常に UTCタイムゾーンを使用して保存されます。その結果、 ServiceNow インスタンスの構成によっては、表示される値が ServiceNow インスタンスで表示される値と異なる場合があります。違いは表示された値に対してのみ関連しています。ServiceNow とSnowflakeのタイムスタンプは同じ時点を参照しています。

  • 空のテーブルのビューはありません。ServiceNow のテーブルにデータが表示された後、ビューが作成されます。

  • コネクタはスキーマの変更を処理しますが、コネクタはデータをリロードしません。

    その結果、スキーマが変更された場合、古いスキーマの記録は更新されません。

以下は、 dest_db.dest_schema.incident_view ビューからデータを取得する SELECT ステートメントの出力例です。この例では、 ServiceNow の incident テーブルに、 ACTIVEAPPROVALCATEGORY、および ESCALATION という名前の列があります。

SELECT ACTIVE, APPROVAL, CATEGORY, ESCALATION
FROM DEST_DB.DEST_SCHEMA.INCIDENT__VIEW LIMIT 5;

+--------+----------------+------------------+------------+
| ACTIVE | APPROVAL       | CATEGORY         | ESCALATION |
+--------+----------------+------------------+------------+
| TRUE   | not requested  | software         | 0          |
| TRUE   | not requested  | Cloud Management | 0          |
| TRUE   | not requested  | software         | 0          |
| TRUE   | not requested  | network          | 0          |
| TRUE   | not requested  | database         | 0          |
+--------+----------------+------------------+------------+
Copy

テーブルのイベントログの表示

Snowflake Connector for ServiceNow® は、 ServiceNow の記録に加えられた変更を追跡できます。この追跡情報は、イベントログと呼ばれるテーブルに格納されます。

同期が有効になっている ServiceNow テーブルごとに、コネクタは <destination_db>.<destination_schema>.<table_name>__event_log という名前のイベントログテーブルをSnowflake内に作成します。

各イベントログテーブルには、次の列があります。

データ型

説明

sys_id

VARCHAR

ServiceNow 内にある記録の sys_id の値。

sys_updated_on

VARCHAR

記録が ServiceNow で最後に更新された日付。ServiceNow テーブルに sys_updated_on フィールドがない場合、この列にはnull値が含まれます。表示されるタイムスタンプは、オフセットなしで UTC タイムゾーンで提供され、これは ServiceNow インスタンスに表示された日付のタイムゾーンと異なる場合があります。

event_date

TIMESTAMP_NTZ

イベントがイベントログに挿入された日付。表示されるタイムスタンプは、オフセットなしで UTC タイムゾーンで提供され、これは ServiceNow インスタンスに表示された日付のタイムゾーンとは異なる場合があります。

raw

VARIANT

記録イベントの現在のデータ。DELETE イベントの場合、これは削除時の記録のデータです。

event_type

VARCHAR

記録が ServiceNow から挿入、更新、または削除されたかどうかを示します。

イベントログには、対応する ServiceNow テーブルのデータ変更の履歴が反映されます。たとえば、新しい記録が ServiceNow の u_ip_port テーブルに挿入された場合、 INSERT イベント型に設定された event_type を待つ記録が、Snowflakeの dest_db.dest_schema.u_ip_port__event_log テーブルに追加されます。

同様に、 ServiceNow のテーブルで記録が更新または削除されると 、 UPDATE または DELETE に設定された event_type を持つ記録が dest_db.dest_schema.u_ip_port__event_log テーブルに追加されます。

生データ(dest_db.dest_schema.table_name)を含む Snowflakeのテーブルは、対応するイベントログテーブル(dest_db.dest_schema.table_name__event_log)から派生します。例:

  • INSERT イベントの記録が table_name__event_log に追加されると、コネクタは対応する記録を table_name テーブルに追加します。

  • 特定の sys_idUPDATE イベントがイベントログテーブルに追加された場合、コネクタは table_name テーブルの sys_id に対応する記録を新しいデータで更新します。

  • DELETE イベントが発生すると、 table_name 内の対応する記録の is_deleted フラグが true に設定されます。

参照フィールドの表示値の取得

ServiceNow テーブルの一部のフィールドは、他のテーブルの記録への参照を含む 参照フィールド です。

以下の例では、 incident テーブルのフィールド opened_by は、別のテーブル(sys_user)の sys_id <sys_id> を持つ記録への参照を含む参照フィールドです。

{
  "link": "https://testingatt1.service-now.com/api/now/table/sys_user/<sys_id>",
  "value": "<sys_id>"
}
Copy

テーブルの参照フィールドを表示するには、次の引数を指定して SHOW_REFERENCES_OF_TABLE ストアドプロシージャを呼び出します。

CALL SHOW_REFERENCES_OF_TABLE('<table_name>');
Copy

条件:

table_name

参照フィールドを表示するテーブルの名前を指定します。

このストアドプロシージャは、テーブルのスキーマこの保存された検査し、次のプロパティを含むオブジェクトの JSON リストを返します。

プロパティ

説明

columnName

参照フィールドの名前。

referencedColumnName

参照がポイントする先のフィールドの名前。

referencedTableName

参照されるテーブルの名前。

注釈

このプロシージャを使用するには、コネクタは ServiceNow admin ロールを割り当てられた ServiceNow ユーザーを使用する必要があります。このロールがないと、プロシージャは認証エラーを返します。詳細については、 ServiceNow インスタンスの準備 をご参照ください。

参照されるテーブルのデータ同期の有効化

テーブルが他のテーブルへの参照を含む場合は、参照されるテーブルのデータ同期を有効にすることができます。参照されるテーブルのデータを同期するには、 ENABLE_REFERENCED_TABLES ストアドプロシージャを以下の引数で呼び出します。

CALL ENABLE_REFERENCED_TABLES('<table_name>');
Copy

条件:

table_name

データ同期を有効にするテーブル(テーブル参照フィールドあり)の名前を指定します。

注釈

このプロシージャを使用するには、コネクタは ServiceNow admin ロールを割り当てられた ServiceNow ユーザーを使用する必要があります。このロールがないと、プロシージャは認証エラーを返します。詳細については、 ServiceNow インスタンスの準備 をご参照ください。

参照フィールドを含んでいるビューの作成

参照フィールドを含んでいるテーブルと、それらのフィールドによって参照されるテーブルが処理されている場合は、参照を表示値に置き換えるビューを作成できます。

このビューを作成するには、 CREATE_VIEW_WITH_DISPLAY_VALUES ストアドプロシージャを呼び出します。

CALL CREATE_VIEW_WITH_DISPLAY_VALUES('<table_name>');
Copy

条件:

table_name

表示値のあるビューを作成するテーブル参照フィールドを含んでいるテーブルの名前を指定します。

注釈

sys_id参照キー とする 参照フィールド のみがサポートされています。

注釈

このプロシージャを使用するには、コネクタは ServiceNow admin ロールを割り当てられた ServiceNow ユーザーを使用する必要があります。このロールがないと、プロシージャは認証エラーを返します。詳細については、 ServiceNow インスタンスの準備 をご参照ください。

ビューが正常に作成された後、ストアドプロシージャは新しく作成されたビューの名前を返します。ビューの名前は、テーブル名に __view_with_references というサフィックスを加えたものです。たとえば、 incident という名前の ServiceNow テーブルの場合、ストアドプロシージャは incident__view_with_references というビューを作成します。参照フィールドは表示値に置き換えられ、各参照フィールドに新しいメタデータ列が追加されます。

表示値列は置換される参照列と同じ名前を持ち、表示値がnullの場合や参照が解決されない場合はnullになる可能性があります。メタデータの列名は、参照列の名前に __metadata サフィックスを加えたものです。たとえば、 user という名前の参照列の場合、ストアドプロシージャは user__metadata という名前の列を作成します。この列のコンテンツは、 reference_field というフィールドを持つ JSON オブジェクトで、以下のプロパティを持ちます。

プロパティ

説明

key

参照される行の sys_id。参照列または参照列フィールド value がnullの場合は、このプロパティもnullになります。

reference_table

参照されるテーブルの名前。参照が未解決の場合、このプロパティはnullになります。

link

参照される行への ServiceNow リンク。参照列または参照列フィールド link がnullの場合は、このプロパティもnullになります。

display_value

表示値。参照が未解決の場合、このプロパティはnullになります。

resolved

表示値が解決される場合は true。コネクタが参照を解決できない場合は false

reason

参照を解決できない理由。例: Display value is not ingested yet。参照が解決される場合、このプロパティは表示されません。

次の例は、ストアドプロシージャ CREATE_VIEW_WITH_DISPLAY_VALUES によって作成されたビューの表示値とメタデータ列のペアがどのようになるかを示しています。例のテーブル incident には opened_by 列があり、この列は sys_user テーブルを(参照キーとして sys_id によって)参照しています。

ストアドプロシージャによって作成された incident__view_with_references ビューは参照を解決するため、表示された値は単純な SELECT で取得できます。

SELECT OPENED_BY, OPENED_BY__METADATA
  FROM DEST_DB.DEST_SCHEMA.INCIDENT__VIEW_WITH_REFERENCES;
Copy

このコマンドは次の形式で情報を表示します。

+-----------+------------------------------------+
| OPENED_BY | OPENED_BY__METADATA                |
+-----------+------------------------------------+
| "JOHN"    | {                                  |
|           |   "reference_field": {             |
|           |     "display_value": "JOHN",       |
|           |     "key": "b177...",              |
|           |     "link": "https://...",         |
|           |     "reference_table": "sys_user", |
|           |     "resolved": true               |
|           |   }                                |
|           | }                                  |
+-----------+------------------------------------+