커넥터 문제 해결하기¶
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();
커넥터 설치 중 문제 해결¶
커넥터 설치 중 가장 흔한 문제는 sys_db_object
, sys_dictionary
, sys_glide_object
등 메타데이터 테이블의 ACL 세트와 관련이 있습니다. 또한 커넥터는 올바른 수집 전략을 결정하기 위해 sys_table_rotation
테이블에 액세스해야 하며, 선택적으로 데이터 삭제를 전파하기 위해 저널 테이블(보통 sys_audit_delete
)에 액세스해야 합니다.
인증 단계 오류¶
설치 마법사에서 ServiceNow에 연결 하거나 SET_CONNECTION_CONFIGURATION 프로시저를 수동으로 실행할 때 문제가 발생할 수 있습니다. 이 단계에서 오류가 발생하면 커넥터를 설치하는 데 사용한 사용자에게 sys_db_object
테이블에 대한 액세스 권한이 있는지 확인하십시오.
SET_CONNECTION_CONFIGURATION
프로시저에서 반환된 JSON 오브젝트의 ACL 문제와 관련이 있을 수 있는 오류 상태 코드는 다음과 같습니다.
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 프로시저를 수동으로 실행할 때 문제가 발생할 수 있습니다. 이 단계에서 오류가 발생한 경우 커넥터를 설치하는 데 사용한 사용자에게 메타데이터 테이블에 액세스하는 데 필요한 권한이 있는지 확인하십시오.
FINALIZE_CONNECTOR_CONFIGURATION
프로시저에서 반환된 JSON 오브젝트의 ACL 문제와 관련이 있을 수 있는 오류 상태 코드는 다음과 같습니다.
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
로 필터가 적용되지 않음을 의미합니다. 이 매개 변수는 ServiceNow®에서 최근에 생성되었지만, 아직 Snowflake로 수집되지 않은 레코드는 고려하지 않고 이미 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
테이블의 행을 Table 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
테이블의 재로드를 트리거합니다.