Snowflakeでの ServiceNow®データへのアクセス¶
Snowflake Connector for ServiceNow® V2は、 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_object
、 sys_dictionary
、および sys_glide_object
テーブルにあるデータに依存しています。コネクタは、ビジネステーブルの同期を有効にすると、これらのテーブルからメタデータをロードします。メタデータテーブルがインジェストされると、バックグラウンドタスクが有効化されたテーブルのフラット化されたビューを作成します。タスクは、最も頻繁にテーブルをインジェストするスケジュールと同じ頻度で実行されます。メタデータテーブルが同期されると、このタスクはテーブルスキーマの変更もキャプチャし、それに応じて作成済みのビューを更新します(接尾辞 __view
と __view_with_deleted
を持つビューのみで、 __view_with_display_values
を持つビューは更新されません)。
即時処理ではないため、ビュー作成プロセスのステータスは CONFIGURED_TABLES
ビューの下に表示されます。ビューの作成に時間がかかりすぎる場合は、 CONNECTOR_ERRORS
ビューに関連するエラーがないかチェックすることもできます。
警告
コネクタによって作成されたテーブルとビューに ROW ACCESS POLICIES を設定する予定の場合は、コネクタアプリケーションと同じ名前のロールへのアクセスをブロックしないようにしてください。たとえば、コネクタアプリケーションのインスタンスが MY_CONNECTOR_SERVICENOW
という名前の場合、ポリシーは MY_CONNECTOR_SERVICENOW
という名前のロールをブロックできません。それ以外の場合は、ポリシーはデータインジェスチョンプロセスを妨害します。
次のセクションでは、このデータにアクセスする権限を付与する方法と、これらのテーブルおよびビューからデータにアクセスする方法について説明します。
Snowflakeでの ServiceNow®データにアクセスする権限の付与¶
Snowflake Connector for ServiceNow®V2 がSnowflakeとデータを同期した後、ロールが ServiceNow® データにアクセスするには次が必要です。
Snowflakeで ServiceNow® データを含むデータベースとスキーマに対する USAGE 権限、 および
Snowflakeは、インジェストされた ServiceNow® データへのアクセスが必要なユーザーに付与できる、これらの権限を持つ専用のロールを作成することをお勧めします。コネクタが Snowsightと一緒にインストール されている場合、 構成 ステップ中に提供されたロールには必要な権限が既にあります。
たとえば、 ServiceNow® データを dest_db
データベースと dest_schema
スキーマに格納するように my_connector_servicenow
と呼ばれるコネクタアプリケーションを構成した場合は、 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 APPLICATION ROLE my_connector_servicenow.DATA_READER to role servicenow_data_reader_role;
注釈
Snowflake内に ServiceNow® データが含まれているスキーマで
GRANT OWNERSHIP ON FUTURE TABLES IN SCHEMA
を実行しないでください。また、コネクタによってすでに作成済みのテーブルの所有権を変更しないでください。所有権を変更すると、コネクタがテーブルにデータをインジェストすることができなくなります。Snowflakeで ServiceNow® データを含むスキーマのビューの所有権を変更しないでください。所有権を変更すると、 ServiceNow® テーブルスキーマで変更が発生したときにコネクタがビューを更新できなくなります。
生データへのアクセス¶
同期する ServiceNow® テーブルごとに、 Snowflake Connector for ServiceNow®V2 はデータベースに同じ名前の新しいテーブルを作成し、Snowflakeで ServiceNow® データのスキーマを作成します。
たとえば、 ServiceNow® データを dest_db
データベースと dest_schema
スキーマに格納するようにコネクタを構成し、 ServiceNow® の incident
テーブルを同期するようにコネクタを構成した場合、コネクタは dest_db.dest_schema.incident
という名前のテーブルを作成します。
このテーブルには、 ServiceNow® から取り込まれた生データが含まれています。このテーブルには次の列が含まれます。
列 |
データ型 |
説明 |
---|---|---|
|
VARCHAR |
ServiceNow® 内にある記録の |
|
VARIANT |
記録の生データ。 |
|
BOOLEAN |
ServiceNow® で記録が削除されたかどうかを示します。 |
|
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 | +----------------------------------+-------------------------+-------------+--------------------------+
フラット化されたデータへのアクセス¶
データを含むテーブルごとに、コネクタは生データに対して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
テーブルに、 ACTIVE
、 APPROVAL
、 CATEGORY
、および 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 | +--------+----------------+------------------+------------+
テーブルのイベントログの表示¶
Snowflake Connector for ServiceNow®V2 は、 ServiceNow® の記録に加えられた変更を追跡できます。この追跡情報は、イベントログと呼ばれるテーブルに格納されます。
同期が有効になっている ServiceNow® テーブルごとに、コネクタは <destination_db>.<destination_schema>.<table_name>__event_log
という名前のイベントログテーブルをSnowflake内に作成します。
各イベントログテーブルには、次の列があります。
列 |
データ型 |
説明 |
---|---|---|
|
VARCHAR |
ServiceNow® 内にある記録の |
|
VARCHAR |
記録が ServiceNow® で最後に更新された日付。 ServiceNow® テーブルに |
|
TIMESTAMP_NTZ |
イベントがイベントログに挿入された日付。表示されるタイムスタンプは、オフセットなしで UTC タイムゾーンで提供され、これは ServiceNow インスタンスに表示された日付のタイムゾーンとは異なる場合があります。 |
|
VARIANT |
記録イベントの現在のデータ。DELETE イベントの場合、これは削除時の記録のデータです。 |
|
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_id
のUPDATE
イベントがイベントログテーブルに追加された場合、コネクタは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>" }
テーブルの参照フィールドを表示するには、次の引数を指定して SHOW_REFERENCES_OF_TABLE
ストアドプロシージャを呼び出します。
CALL SHOW_REFERENCES_OF_TABLE('<table_name>');
条件:
table_name
参照フィールドを表示するテーブルの名前を指定します。
このストアドプロシージャは、テーブルのスキーマこの保存された検査し、次のプロパティを含むオブジェクトの JSON リストを返します。
プロパティ |
説明 |
---|---|
|
参照フィールドの名前。 |
|
参照がポイントする先のフィールドの名前。 |
|
参照されるテーブルの名前。 |
参照されるテーブルのデータ同期の有効化¶
テーブルが他のテーブルへの参照を含む場合は、参照されるテーブルのデータ同期を有効にすることができます。参照されるテーブルのデータを同期するには、 ENABLE_REFERENCED_TABLES
ストアドプロシージャを以下の引数で呼び出します。
CALL ENABLE_REFERENCED_TABLES('<table_name>');
条件:
table_name
データ同期を有効にするテーブル(テーブル参照フィールドあり)の名前を指定します。
参照フィールドを含んでいるビューの作成¶
参照フィールドを含んでいるテーブルと、それらのフィールドによって参照されるテーブルが処理されている場合は、参照を表示値に置き換えるビューを作成できます。
このビューを作成するには、 CREATE_VIEW_WITH_DISPLAY_VALUES
ストアドプロシージャを呼び出します。
CALL CREATE_VIEW_WITH_DISPLAY_VALUES('<table_name>');
条件:
table_name
表示値のあるビューを作成するテーブル参照フィールドを含んでいるテーブルの名前を指定します。
重要
このプロシージャは手動でのみ実行されるため、テーブルスキーマが変更されるたびに、スキーマの変更を反映するためにビューを手動で再作成する必要があります。
ビューが正常に作成された後、ストアドプロシージャは新しく作成されたビューの名前を返します。ビューの名前は、テーブル名に __view_with_references
というサフィックスを加えたものです。たとえば、 incident
という名前の ServiceNow® テーブルの場合、ストアドプロシージャは incident__view_with_references
というビューを作成します。参照フィールドは表示値に置き換えられ、各参照フィールドに新しいメタデータ列が追加されます。
表示値列は置換される参照列と同じ名前を持ち、表示値がnullの場合や参照が解決されない場合はnullになる可能性があります。メタデータの列名は、参照列の名前に __metadata
サフィックスを加えたものです。たとえば、 user
という名前の参照列の場合、ストアドプロシージャは user__metadata
という名前の列を作成します。この列のコンテンツは、 reference_field
というフィールドを持つ JSON オブジェクトで、以下のプロパティを持ちます。
プロパティ |
説明 |
---|---|
|
参照される行の |
|
参照されるテーブルの名前。参照が未解決の場合、このプロパティはnullになります。 |
|
参照される行への ServiceNow® リンク。参照列または参照列フィールド |
|
表示値。参照が未解決の場合、このプロパティはnullになります。 |
|
表示値が解決される場合は |
|
参照を解決できない理由。例: |
次の例は、ストアドプロシージャ 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;
このコマンドは次の形式で情報を表示します。
+-----------+------------------------------------+
| OPENED_BY | OPENED_BY__METADATA |
+-----------+------------------------------------+
| "JOHN" | { |
| | "reference_field": { |
| | "display_value": "JOHN", |
| | "key": "b177...", |
| | "link": "https://...", |
| | "reference_table": "sys_user", |
| | "resolved": true |
| | } |
| | } |
+-----------+------------------------------------+