连接器故障排除¶
Snowflake Connector for ServiceNow® V2 受 Snowflake Connector 条款 的约束。
本主题提供了排查 Snowflake Connector for ServiceNow®V2 问题的指南。
本主题内容:
备注
以下部分介绍了存储过程,这些过程是在 连接器应用程序 的 PUBLIC 架构中定义的。在调用这些存储过程之前,选择该应用程序作为会话使用的数据库。
例如,如果该应用程序名为 my_connector_servicenow
,请运行以下命令来调用 TEST_CONNECTION
连接器过程:
USE APPLICATION my_connector_servicenow;
CALL TEST_CONNECTION();
解决连接器安装过程中的问题¶
连接器安装过程中最常见的问题与元数据表上的 ACLs 设置有关,例如 sys_db_object
、sys_dictionary
和 sys_glide_object
。此外,连接器需要访问 sys_table_rotation
表来确定正确的引入策略,并可选择访问日志表(通常为 sys_audit_delete
)以传播数据删除。
身份验证步骤错误¶
在安装向导中 连接到 ServiceNow 或手动运行 SET_CONNECTION_CONFIGURATION 过程时,可能会出现问题。如果在此步骤中遇到错误,请确保用于安装连接器的用户有权访问 sys_db_object
表。
与 ACL 问题相关的错误状态码,可能出现在 SET_CONNECTION_CONFIGURATION
过程返回的 JSON 对象中,具体如下:
REQUEST_FAILED
您可以执行以下类似于连接器的查询来验证访问权限。在请求未返回预期结果之前,将无法安装连接器。例如,如果您使用 curl 发送 HTTP 请求:
# checking access to the sys_db_object table
curl -u '<username>:<password>' "https://<servicenow_instance>.service-now.com/api/now/table/sys_db_object?sysparm_limit=1"
- 其中:
servicenow_instance
指定 ServiceNow® 实例的名称。
username
和password
为 ServiceNow® 实例指定凭据。
响应示例:
至少返回了一些字段 - 用户具有访问表所需的权限。
响应为空 - 用户有权访问表,但不能访问已处理的记录。它可能会在以后导致问题。
响应包含错误 - 用户没有访问表所需的权限。
验证源步骤错误¶
在安装向导中 验证源 或手动运行 FINALIZE_CONNECTOR_CONFIGURATION 过程时,可能会出现问题。如果在此步骤中遇到错误,请确保用于安装连接器的用户具有访问元数据表所需的权限。
与 ACL 问题相关的错误状态码,可能出现在 FINALIZE_CONNECTOR_CONFIGURATION
过程返回的 JSON 对象中,具体如下:
METADATA_TABLE_ACCESS_VALIDATION_ERROR
JOURNAL_TABLE_ACCESS_VALIDATION_ERROR
您可以执行以下类似于连接器的查询来验证访问权限。在请求未返回预期结果之前,将无法安装连接器。例如,如果您使用 curl 发送 HTTP 请求:
# checking access to the sys_db_object table
# expected fields in the result object: sys_id, super_class, name
curl -u '<username>:<password>' "https://<servicenow_instance>.service-now.com/api/now/table/sys_db_object?sysparm_fields=sys_id,super_class,name&sysparm_limit=1&sysparm_query=name=sys_db_object"
# checking access to the sys_dictionary table
# expected fields in the result object: sys_id, name, element, internal_type
curl -u '<username>:<password>' "https://<servicenow_instance>.service-now.com/api/now/table/sys_dictionary?sysparm_fields=sys_id,name,element,internal_type&sysparm_limit=1&sysparm_query=name=sys_dictionary"
# checking access to the sys_glide_object table
# expected fields in the result object: sys_id, name, scalar_type
curl -u '<username>:<password>' "https://<servicenow_instance>.service-now.com/api/now/table/sys_glide_object?sysparm_fields=sys_id,name,scalar_type&sysparm_limit=1&sysparm_query=name=datetime"
# checking access to the sys_table_rotation table
# expected fields in the result object: sys_id, name
curl -u '<username>:<password>' "https://<servicenow_instance>.service-now.com/api/now/table/sys_table_rotation?sysparm_fields=sys_id,name&sysparm_limit=1&sysparm_query=name=syslog"
# (optional) - check only if deletions auditing is going to be used
# checking access to the journal table
# if known, "&sysparm_query=tablename=<table_name>" or "&sysparm_query=documentkey=<sys_id>" can be appended to the request
# expected fields in the result object: sys_id, sys_created_on, documentkey, tablename
curl -u '<username>:<password>' "https://<servicenow_instance>.service-now.com/api/now/table/<journal_table>?sysparm_fields=sys_id,sys_created_on,documentkey,tablename&sysparm_limit=1"
- 其中:
servicenow_instance
指定 ServiceNow® 实例的名称。
username
和password
为 ServiceNow® 实例指定凭据。
journal_table
指定 ServiceNow® 用于删除审计的表的名称。通常其值为
sys_audit_delete
。
响应示例:
响应中存在所有预期字段 - 用户具有必要的权限。
缺少某些预期字段 - 用户没有对所有列的必要权限。
响应为空 - 用户没有对所有行的必要权限。
响应包含错误 - 用户没有对表的必要权限。
验证与 ServiceNow® 实例的连接¶
要验证 Snowflake Connector for ServiceNow®V2 能否访问 ServiceNow® 实例,请调用 TEST_CONNECTION
存储过程:
CALL TEST_CONNECTION();
如果连接器设置正确,存储过程将返回以下响应:
{
"responseCode": "OK",
"message": "Test request to ServiceNow succeeded."
}
验证与 ServiceNow® 实例中特定表的访问权限¶
要验证 Snowflake Connector for ServiceNow®V2 能否访问 ServiceNow® 实例中特定表中的数据,请调用 TEST_TABLE_ACCESS
存储过程:
CALL TEST_TABLE_ACCESS('<table_name>');
其中:
table_name
指定 ServiceNow 实例中的表的名称。
如果连接器设置正确,并且数据可供连接器使用的用户使用,则存储过程将返回以下响应:
{
"responseCode": "OK",
"message": "Test request to ServiceNow® succeeded."
}
备注
如果表为空,或者由于 ACLs,所有行都对连接器隐藏,则消息将显示为:Test request to ServiceNow® succeeded but it didn't return any record.
在这种情况下,请确保表确实为空。如果从 UI 中可以看到任何行,则意味着连接器无法引入它们。
比较 ServiceNow® 和 Snowflake 中的表行数¶
要比较 ServiceNow® 和 Snowflake 中某个表的当前行数,请调用 CHECK_ROW_COUNT
过程:
CALL CHECK_ROW_COUNT('<table_name>');
或
CALL CHECK_ROW_COUNT('<table_name>', <max_sys_created_on>);
其中:
table_name
指定 ServiceNow 实例中的表的名称。
max_sys_created_on
对
sys_created_on
列的最大值指定其他可选的筛选器。只有与此筛选器匹配的行才会被计算在内。此参数的默认值为NULL
,意味着此时不会应用筛选器。此参数有助于仅比较已引入到 Snowflake 中的记录计数,而不考虑最近创建于 ServiceNow® 中但尚未引入到 Snowflake 的账户记录。
以下示例展示了如何使用 max_sys_created_on
参数调用 CHECK_ROW_COUNT
存储过程:
CALL CHECK_ROW_COUNT('sys_db_object', '2021-09-10 12:34:56');
如果过程超时,则过程无法使用 stats
API 确定 ServiceNow® 中表的行数。这可能意味着,该表中的行数太多而无法通过此 API 统计。
备注
返回的行数可能会有所不同。ServiceNow® 表包含的行可能比同等的 Snowflake 表更多。这可能是由为 ServiceNow® 中的指定表设置的访问控制列表规则 (ACLs) 导致的。
连接器使用不同的端点来检索有关 ServiceNow® 表中的行数的信息。连接器使用 stats
获取有关表的信息,包括行数。它用 table
将数据引入 Snowflake。
检查行的引入状态¶
要在 ServiceNow® 和 Snowflake 中的所有可能位置查看行的引入状态,请调用 CHECK_RECORD_HISTORY
过程:
CALL CHECK_RECORD_HISTORY('<table_name>', '<sys_id>');
其中:
table_name
指定 ServiceNow 实例中的表的名称。
sys_id
指定要检查的行的
sys_id
。
该过程会返回一个包含以下属性的 JSON 对象:
属性 |
描述 |
---|---|
|
表的名称。 |
|
ServiceNow® 中行的唯一标识符。 |
|
行的引入状态。 |
|
如果该行存在于 ServiceNow® 中的表中,则为 |
|
如果该行在 ServiceNow® 的审计表中被跟踪,则为 |
|
如果行已引入且在 Snowflake 中的 |
|
代表 事件日志中的条目 (具有此 每个对象均包含以下属性,这些属性对应于事件日志表中指定数据更改时间戳和事件类型的列:
|
确定表是否经过了删除审计¶
Snowflake Connector for ServiceNow®V2 依靠审计将记录删除操作传播到 Snowflake。
要验证 ServiceNow® 中的给定表是否配置为审计记录删除操作,请调用 CHECK_IF_AUDIT_ENABLED
存储过程:
CALL CHECK_IF_AUDIT_ENABLED('<table_name>');
其中:
table_name
指定 ServiceNow 实例中的表的名称。
该过程会返回一个包含以下属性的 JSON 对象:
属性 |
描述 |
---|---|
|
如果过程成功,则为 |
|
已检查表的 |
|
已检查表的 |
|
根据字段
|
获取故障排除数据¶
要获取故障排除数据,请调用 GET_TROUBLESHOOTING_DATA
存储过程:
CALL GET_TROUBLESHOOTING_DATA(<from_timestamp>, <to_timestamp>);
其中:
from_timestamp
指定应提取数据的日期范围起始点(UTC 时区)。
to_timestamp
指定应提取数据的日期范围结束点(UTC 时区)。
此存储过程会以表格格式返回以下数据:
配置信息
连接器遇到的错误
引入历史记录
以下示例展示了如何调用此存储过程:
CALL GET_TROUBLESHOOTING_DATA('2024-02-05 10:00:00', '2024-02-10 22:30:00');
您可以将返回的数据以 CSV 格式保存,并发送给 Snowflake 支持部门。
恢复无法访问的对象¶
连接器需要连接器应用程序外部的多个数据库对象。如果这些对象不可用,连接器将出现故障或停止正常运行。对象可能不可用的情况包括:
删除对象。
重新创建对象而不保留或恢复所需的授权。
撤销连接器使用这些对象所需的授权。
在大多数情况下,您可以通过重新创建这些对象并授予必要的权限来手动恢复这些对象。以下部分介绍了如何恢复不同的对象。
恢复连接器仓库¶
如果连接器失去对其仓库的访问权限,请通过调用 UPDATE_WAREHOUSE 存储过程来配置新仓库。
恢复 ServiceNow® 数据的数据库和架构¶
如果 ServiceNow® 数据的数据库或架构 被删除,则唯一的恢复方法是运行 UNDROP 命令。如果此命令不可用,则您必须重新安装连接器并再次引入 ServiceNow® 数据。
如果 包含 ServiceNow® 数据的视图 被删除,它应该会在下次负责创建它们的后台任务运行时自动重新创建。
如果包含 ServiceNow® 数据的其中一个表(事件日志 或 原始数据 表)被删除,您无法使用 UNDROP TABLE 命令来恢复它,请执行以下操作来开始再次引入 ServiceNow 表:
确保为此 ServiceNow® 表删除事件日志和原始数据表。
使用 DELETE_TABLE 过程。
恢复连接器的通知集成¶
如果连接器失去通知集成对象的访问权限,请再次执行 配置警报 过程,并根据需要重新创建通知集成对象。
如果电子邮件通知是通过 Snowsight 配置的,那么您只需禁用并重新启用它们,即可恢复必要的外部对象。
确定扁平化视图中缺少列的原因¶
连接器根据 ServiceNow® 元数据在目标架构中创建扁平化视图。Snowflake 端缺少列的原因有多种。
检查 Snowflake 中是否存在列元数据¶
要检查列元数据是否存在于 Snowflake 的 sys_dictionary
表上,请执行以下查询:
SELECT * FROM <dest_db>.<dest_schema>.sys_dictionary__view WHERE name = '<table_name>' AND element = '<column_name>';
如果您正在调查的表有父表(继承自 ServiceNow®),并且您正在查找的列已添加到父表中,则应改用父表名称。
要列出您感兴趣的表从中继承的所有表,请执行以下查询:
SELECT
sys_id,
name,
PARSE_JSON(super_class):value::string AS super_class_sys_id
FROM <dest_db>.<dest_schema>.sys_db_object__view
START WITH name = '<table_name>'
CONNECT BY sys_id = PRIOR super_class_sys_id;
如果返回行,则表示该列的元数据已正确引入到 Snowflake 中,但视图尚未刷新。检查状态以及是否:
视图最近刷新,但列仍不存在,请联系支持人员。
视图尚未刷新,请等待下一个引入计划。
如果返回空结果,则表示连接器尚未引入此列的元数据。您需要在 ServiceNow® 端验证记录是否对连接器可见,以及时间戳是否正确。
查看刷新状态¶
要验证给定表的视图上次刷新时间以及操作是否成功,请执行以下查询:
SELECT flattened_views_status, flattened_views_last_updated FROM tables_state WHERE table_name = '<table_name>';
如果上次刷新失败,您可能需要查询事件表并查找连接器报告的错误。
查看 ServiceNow® 列元数据可用性¶
扁平化视图中缺少列的原因可能是连接器无法引入列元数据。这可能是因为 ACLs 阻止 sys_dictionary
表中的行被表 API 返回。另一个可能的原因是 sys_updated_on
列中的时间戳值过期。也可能是列/表定义是从不同的 ServiceNow® 实例导入的。要确定连接器是否可以访问列元数据,请执行 GET 请求到以下端点:
https://<servicenow_instance>.service-now.com/api/now/table/sys_dictionary?sysparm_query=name=<table_name>^element=<column_name>
如果返回空结果,则连接器无法访问该列。该列可能受 ACL 保护或不存在。
如果返回了列定义,请检查 sys_updated_on
字段的值。确认日期与列添加到表中的预期时间匹配。如果它是从另一个实例导入的,则可能会显示列创建时的时间点。连接器中的 CDC (增量更新)机制可能不会注意到添加了日期为过去的记录。在这种情况下,触发 sys_dictionary
表的重新加载。