访问 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_object
、sys_dictionary
和 sys_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;
备注
不要在 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 | +----------------------------------+-------------------------+-------------+--------------------------+
访问扁平化数据¶
对于每个包含数据的表,连接器都会根据原始数据创建两个扁平化视图。视图的名称是带有后缀 __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
表具有名为 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® 表,连接器会在 Snowflake 中创建一个名为 <destination_db>.<destination_schema>.<table_name>__event_log
的事件日志表。
每个事件日志表都有以下列:
列 |
数据类型 |
描述 |
---|---|---|
|
VARCHAR |
ServiceNow® 中记录的 |
|
VARCHAR |
ServiceNow® 中上次更新记录的日期。如果 ServiceNow® 表中没有 |
|
TIMESTAMP_NTZ |
在事件日志中插入事件的日期。请注意,显示的时间戳为 UTC 时区且没有偏移,这可能与 ServiceNow 实例中显示的日期所在的时区不同。 |
|
VARIANT |
记录事件的当前数据。对于 DELETE 事件,这是删除时记录的数据。 |
|
VARCHAR |
指定记录是否已从 ServiceNow® 插入、更新或删除。 |
事件日志反映了相应 ServiceNow® 表中数据更改的历史记录。例如,如果一条新记录插入到 ServiceNow® 中的 u_ip_port
表中,则 event_type
设置为 INSERT
事件类型的记录将添加到 Snowflake 中的 dest_db.dest_schema.u_ip_port__event_log
表中。
同样,如果在 ServiceNow® 中的表中更新或删除记录,则 event_type
设置为 UPDATE
或 DELETE
的记录将添加到 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_id
的UPDATE
事件添加到事件日志表中,连接器将使用新数据更新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>" }
要显示表中的引用字段,请使用以下实参调用 SHOW_REFERENCES_OF_TABLE
存储过程:
CALL SHOW_REFERENCES_OF_TABLE('<table_name>');
其中:
table_name
指定要显示其引用字段的表的名称。
此存储过程检查表的架构并返回包含以下属性的对象的 JSON 列表:
属性 |
描述 |
---|---|
|
引用字段的名称。 |
|
引用指向的字段的名称。 |
|
引用表的名称。 |
备注
要使用此过程,连接器必须使用被分配了 ServiceNow admin
角色的 ServiceNow 用户。如果没有此角色,过程将返回授权错误。有关更多信息,请参阅 准备 ServiceNow 实例。
启用引用表的数据同步¶
如果某个表包含对其他表的引用,您可以启用引用表的数据同步。要同步引用表的数据,请使用以下实参调用 ENABLE_REFERENCED_TABLES
存储过程:
CALL ENABLE_REFERENCED_TABLES('<table_name>');
其中:
table_name
指定要启用数据同步的表的名称(带有表引用字段)。
备注
要使用此过程,连接器必须使用被分配了 ServiceNow admin
角色的 ServiceNow 用户。如果没有此角色,过程将返回授权错误。有关更多信息,请参阅 准备 ServiceNow 实例。
创建包含引用字段的视图¶
如果包含引用字段的表以及这些字段引用的表已处理,您可以创建一个用显示值替换引用的视图。
要创建此视图,请调用 CREATE_VIEW_WITH_DISPLAY_VALUES
存储过程。
CALL CREATE_VIEW_WITH_DISPLAY_VALUES('<table_name>');
其中:
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
的字段,该字段具有以下属性:
属性 |
描述 |
---|---|
|
引用行的 |
|
引用表的名称。如果引用未解析,则此属性为 null。 |
|
指向引用行的 ServiceNow® 链接。如果引用列或引用列字段 |
|
显示值。如果引用未解析,则此属性为 null。 |
|
如果显示值已解析,则为 |
|
未能解析引用的原因。例如 |
以下示例显示由存储过程 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;
此命令以以下格式显示信息:
+-----------+------------------------------------+
| OPENED_BY | OPENED_BY__METADATA |
+-----------+------------------------------------+
| "JOHN" | { |
| | "reference_field": { |
| | "display_value": "JOHN", |
| | "key": "b177...", |
| | "link": "https://...", |
| | "reference_table": "sys_user", |
| | "resolved": true |
| | } |
| | } |
+-----------+------------------------------------+