访问 Snowflake 中的 ServiceNow® 数据

本主题介绍如何从 Snowflake 账户访问 ServiceNow® 数据。

本主题内容:

对于 ServiceNow® 中配置为同步的每个表,连接器都会创建以下表和视图:

  • 包含原始形式数据的同名表,其中每条记录都包含在单个 VARIANT 列中。

  • 一个名为 table_name__event_log 的表,其中包含对 ServiceNow® 记录所做的更改历史记录。

  • 一个名为 table_name__view 的视图,包含扁平形式的数据,其中该视图包含原始表中每一列的一列以及原始表中存在的每条记录的一行。

  • 一个名为 table_name__view_with_deleted 的视图,包含与 table_name__view 相同的数据以及已在 ServiceNow® 中删除的记录的行。

备注

启动连接器后,可能需要一些时间才能创建视图。

视图创建取决于 ServiceNow® sys_db_objectsys_dictionarysys_glide_object 表中的数据。在启用业务表进行同步后,连接器会从这些表加载表元数据。当引入元数据表时,后台任务将为已启用的表创建扁平化视图。该任务的运行频率与最频繁的表引入计划相同。同步表元数据表后,该任务还会获取任何表架构更改,并相应地更新已创建的视图(仅更新后缀为 __view__view_with_deleted 的视图,但不更新后缀为 __view_with_display_values 的视图)。

由于这不是一个即时过程,因此可在 CONFIGURED_TABLES 视图下查看视图创建过程的状态。如果创建视图的时间过长,还可以检查 CONNECTOR_ERRORS 视图是否存在任何相关错误。

以下部分说明如何授予访问此数据的权限以及如何访问这些表和视图中的数据。

授予访问 Snowflake 中 ServiceNow® 数据的权限

Snowflake Connector for ServiceNow®V2 与 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®V2 会在数据库和架构中创建一个具有相同名称的新表,以用于在 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

访问扁平化数据

对于每个包含数据的表,连接器都会根据原始数据创建两个扁平化视图。视图的名称是带有后缀 __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® 表中删除的记录。

请注意以下事项:

  • 这些视图中的列名称为大写。您不能使用小写名称来访问这些列。

  • 带有时间和时间戳的列始终使用 UTC 时区保存,与 ServiceNow 实例中设置的时区无关。因此,根据 ServiceNow 实例配置的不同,其显示的值可能与 ServiceNow 实例中显示的值不同。两者的区别仅在于显示值不同,ServiceNow 和 Snowflake 中的时间戳均指向同一时间点。

  • 没有空表的视图。数据出现在 ServiceNow® 表中后,视图便已创建。

  • 尽管连接器处理架构更改,但连接器不会重新加载数据。

    因此,在架构发生更改的情况下,来自旧架构中的记录不会更新。

以下是从 dest_db.dest_schema.incident_view 视图检索数据的 SELECT 语句的输出示例。在此示例中,ServiceNow® 中的 incident 表具有名为 ACTIVEAPPROVALCATEGORYESCALATION 的列。

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®V2 可以跟踪对 ServiceNow® 中的记录所做的更改。此跟踪信息存储在称为事件日志的表中。

对于启用同步的每个 ServiceNow® 表,连接器会在 Snowflake 中创建一个名为 <destination_db>.<destination_schema>.<table_name>__event_log 的事件日志表。

每个事件日志表都有以下列:

数据类型

描述

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 表中,则 event_type 设置为 INSERT 事件类型的记录将添加到 Snowflake 中的 dest_db.dest_schema.u_ip_port__event_log 表中。

同样,如果在 ServiceNow® 中的表中更新或删除记录,则 event_type 设置为 UPDATEDELETE 的记录将添加到 dest_db.dest_schema.u_ip_port__event_log 表中。

Snowflake 中包含原始数据(dest_db.dest_schema.table_name) 的表源自相应的事件日志表 (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® 表中,某些字段是 引用字段 (https://docs.servicenow.com/bundle/washingtondc-platform-administration/page/administer/field-administration/concept/c_ReferenceField.html),其中包含对其他表中记录的引用。

在下面的示例中, 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 作为 引用键 (https://docs.servicenow.com/bundle/washingtondc-platform-administration/page/administer/field-administration/concept/c_ReferenceField.html) 的 引用字段 (https://docs.servicenow.com/bundle/washingtondc-platform-administration/page/administer/field-administration/task/t_DefineTheReferenceKey.html)。

备注

要使用此过程,连接器必须使用被分配了 ServiceNow admin 角色的 ServiceNow 用户。如果没有此角色,过程将返回授权错误。有关更多信息,请参阅 准备 ServiceNow 实例

视图创建成功后,存储过程返回新建视图的名称。视图名称是表名称加上 __view_with_references 后缀。例如,对于名为 incident 的 ServiceNow® 表,存储过程将创建视图 incident__view_with_references。引用字段替换为显示值,并为每个引用字段添加新的元数据列。

显示值列与被替换的引用列具有相同的名称,并且当显示值为 null 或引用未解析时,显示值列可能为 null。数据列名称是带有 __metadata 后缀的引用列的名称。例如,对于名为 user 的引用列,该过程将创建一个名为 user__metadata 的列。此列的内容是一个 JSON 对象,其中包含一个名为 reference_field 的字段,该字段具有以下属性:

属性

描述

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_id 作为引用键) sys_user 表。

存储过程创建的 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               |
|           |   }                                |
|           | }                                  |
+-----------+------------------------------------+
语言: 中文