Snowflake에서 ServiceNow® 데이터에 액세스하기

ServiceNow®용 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_dictionarysys_glide_object 테이블의 데이터에 따라 달라집니다. 커넥터는 동기화를 위해 비즈니스 테이블을 활성화한 후 이러한 테이블에서 메타데이터를 로드합니다. 메타데이터 테이블이 수집되면 백그라운드 작업이 활성화된 테이블의 평면화된 뷰를 생성합니다. 작업은 가장 빈번한 테이블 수집 일정만큼 자주 실행됩니다. 또한 메타데이터 테이블이 동기화되면 작업이 테이블 스키마 변경 사항을 캡처하고 그에 따라 이미 생성된 뷰를 업데이트합니다(접미사 __view__view_with_deleted 가 있는 뷰만 해당, 접미사 __view_with_display_values 가 있는 뷰는 제외).

이는 즉각적인 프로세스가 아니므로 뷰 생성 프로세스의 상태는 ENABLED_TABLES 뷰에서 확인할 수 있습니다. 뷰 생성에 너무 오랜 시간이 걸리면 CONNECTOR_ERRORS 뷰에서 관련 오류가 있는지 확인할 수도 있습니다.

다음 섹션에서는 이 데이터에 액세스할 권한을 부여하는 방법과 이러한 테이블과 뷰에서 데이터에 액세스하는 방법을 설명합니다.

Snowflake에서 ServiceNow 데이터에 액세스하는 권한 부여하기

Snowflake Connector for ServiceNow® 가 Snowflake와 데이터를 동기화하면 다음 권한을 가진 모든 역할이 ServiceNow 데이터에 액세스할 수 있습니다.

  • Snowflake의 ServiceNow 데이터를 포함하는 데이터베이스와 스키마에 대한 USAGE 권한

  • 이 스키마 내의 테이블 또는 뷰에 대한 SELECT 권한

수집된 ServiceNow 데이터에 액세스해야 하는 사용자에게 부여할 수 있는 이러한 권한을 가진 전담 역할을 생성하는 것이 좋습니다.

예를 들어, dest_db 데이터베이스와 dest_schema 스키마에 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 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® 는 Snowflake의 ServiceNow 데이터에 대해 데이터베이스와 스키마에 이름이 같은 새 테이블을 생성합니다.

예를 들어 dest_db 데이터베이스와 dest_schema 스키마에 ServiceNow 데이터를 저장하도록 커넥터를 구성하고 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 테이블에서 삭제된 레코드도 포함됩니다.

다음 사항을 참고하십시오.

  • 이러한 뷰의 열 이름은 대문자로 표시됩니다. 소문자 이름을 사용하여 이러한 열에 액세스할 수 없습니다.

  • 시간 및 타임스탬프가 있는 열은 ServiceNow 인스턴스에 설정된 타임존에 관계없이 항상 UTC 타임존을 사용하여 저장됩니다. 결과적으로 ServiceNow 인스턴스 구성에 따라 표시되는 값이 ServiceNow 인스턴스에 표시되는 값과 다를 수 있습니다. 차이점은 표시된 값에만 관련되며, ServiceNow와 Snowflake의 타임스탬프는 모두 동일한 시점을 나타냅니다.

  • 빈 테이블에 대한 뷰는 없습니다. ServiceNow의 테이블에 데이터가 나타난 후 뷰가 생성됩니다.

  • 커넥터는 스키마에 대한 변경 사항을 처리하더라도 데이터를 다시 로드하지는 않습니다.

    결과적으로, 스키마가 변경되는 경우 이전 스키마의 레코드가 업데이트되지 않습니다.

다음은 dest_db.dest_schema.incident_view 뷰의 데이터를 검색하는 SELECT 문의 출력 예입니다. 이 예에서 ServiceNow의 incident 테이블에는 ACTIVE, APPROVAL, CATEGORYESCALATION 이라는 열이 있습니다.

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® 는 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_typeINSERT 이벤트 유형으로 설정된 레코드가 Snowflake의 dest_db.dest_schema.u_ip_port__event_log 테이블에 추가됩니다.

마찬가지로, ServiceNow의 테이블에서 레코드가 업데이트되거나 삭제되면 event_typeUPDATE 또는 DELETE 로 설정된 레코드가 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>"
}
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참조 키 로 사용하는 참조 필드 만 지원됩니다.

참고

이 프로시저를 사용하려면 커넥터가 ServiceNow admin 역할이 할당된 ServiceNow 사용자를 사용해야 합니다. 이 역할이 없으면 프로시저는 인증 오류를 반환합니다. 자세한 내용은 ServiceNow 인스턴스 준비하기 를 참조하십시오.

뷰가 성공적으로 생성되면 저장 프로시저가 새로 생성된 뷰의 이름을 반환합니다. 뷰 이름은 __view_with_references 접미사가 추가된 테이블 이름입니다. 예를 들어, incident 라는 ServiceNow 테이블의 경우 저장 프로시저는 incident__view_with_references 뷰를 생성합니다. 참조 필드는 표시 값으로 바뀌고 각 참조 필드에 대해 새 메타데이터 열이 추가됩니다.

표시 값 열은 바뀌는 참조 열과 동일한 이름을 가지며 표시 값이 null이거나 참조가 확인되지 않는 경우 null이 될 수 있습니다. 메타데이터 열 이름은 접미사가 __metadata 인 참조 열의 이름입니다. 예를 들어, user 라는 참조 열의 경우 프로시저는 user__metadata 라는 열을 생성합니다. 이 열의 콘텐츠는 다음 속성을 가진 reference_field 라는 필드가 있는 JSON 오브젝트입니다.

속성

설명

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 에는 sys_user 테이블을 참조하는(참조 키로 sys_id 사용) opened_by 열이 있습니다.

저장 프로시저에 의해 생성된 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               |
|           |   }                                |
|           | }                                  |
+-----------+------------------------------------+