Salesforce Bulk API용 Openflow 커넥터: Salesforce 공식 필드
Salesforce Bulk API용 Openflow 커넥터: Salesforce 공식 필드
이 문서에서는 Salesforce Bulk API용 Openflow 커넥터가 Salesforce 공식 필드를 Snowflake SQL 뷰로 변환하는 방법을 설명하며, 지원되는 함수와 제한 사항을 포함합니다.
출처: Snowflake 문서
본문
공식 뷰 동작 방식
Enable Views Creation이 true로 설정되면 커넥터는 공식 필드가 있는 각 객체에 대해 다음을 수행합니다.
- Describe API를 통해 Salesforce 객체 메타데이터에서 공식 표현식을 검색합니다.
- 각 공식 표현식을 파싱해 동등한 Snowflake SQL로 변환합니다.
- 기본 테이블의 비-공식 열과 변환된 공식 표현식을 계산 열로 결합하는 CREATE OR REPLACE VIEW 문을 생성합니다.
- Snowflake에 대해 DDL을 실행해 뷰를 만들거나 업데이트합니다.
결과 뷰는 <Object Type>_FORMULA_VW로 이름이 지정됩니다. 예를 들어 Account 객체는 ACCOUNT_FORMULA_VW라는 뷰를 만듭니다. 이 뷰를 쿼리해 복제된 데이터와 함께 공식 필드 값을 얻을 수 있습니다.
커넥터가 소스 객체의 스키마 변경을 감지하면 뷰가 자동으로 업데이트되어 공식 정의가 Salesforce와 동기화 상태를 유지합니다.
객체 간 공식 필드
Salesforce 공식은 관계 탐색을 사용해 관련 객체의 필드를 참조할 수 있습니다(예: Account.Owner.Name). 커넥터는 뷰 정의에서 LEFT JOIN 절을 생성해 이러한 객체 간 참조를 지원합니다. 각 관계 탐색은 Snowflake의 해당 관련 테이블에 대한 조인을 생성합니다.
객체 간 공식이 올바르게 작동하려면 관련 객체도 커넥터가 복제해야 합니다. 관련 객체가 동기화되지 않으면 이를 참조하는 공식 열은 뷰에서 형식화된 NULL로 대체됩니다. 나머지 공식 열은 정상적으로 계산을 계속합니다. 영향을 받은 열에는 LOOKUP_NOT_SYNCED 주석이 붙습니다. 참조된 객체가 복제에 추가되고 동기화되면 다음 커넥터 실행에서 뷰가 자동으로 재구축됩니다.
체인 공식 필드
다른 공식 필드를 참조하는 공식 필드(체인 공식)는 지원됩니다. 커넥터는 SQL 생성 전에 의존성 그래프를 해결하고 각 참조된 공식 필드의 표현식을 참조 공식의 AST로 확장합니다. 다중 홉 체인은 완전히 확장됩니다. 의존성이 변환될 수 없으면 종속 필드도 NULL을 반환하며 열 주석은 FORMULA_CHAIN_NOT_SUPPORTED를 나타냅니다.
공식 뷰 열 주석
생성된 뷰의 각 공식 열에는 SQL COMMENT 주석이 포함됩니다.
- 성공적으로 변환된 공식의 경우 주석에 원래 Salesforce 공식 표현식이 포함됩니다.
- 변환할 수 없는 공식의 경우 주석에 실패 이유 코드와 쌍점(:)으로 구분된 원래 Salesforce 공식 표현식이 포함됩니다(예: FUNCTION_NOT_SUPPORTED: IMAGE(url, 'alt')).
이 주석은 Snowflake에서 DESCRIBE VIEW <view_name>을 실행해 검사할 수 있습니다.
지원되는 공식 함수
다음 Salesforce 공식 함수는 동등한 Snowflake SQL로 변환됩니다.
| 범주 | Salesforce 함수 | Snowflake 대응 |
|---|---|---|
| 논리 | IF | CASE WHEN ... THEN ... ELSE ... END |
| 논리 | CASE | CASE ... WHEN ... THEN ... ELSE ... END |
| 논리 | AND / OR / NOT | AND / OR / NOT |
| null 처리 | ISBLANK | (expr IS NULL OR TO_VARCHAR(expr) = ''); boolean 필드에 대해 FALSE 반환 |
| null 처리 | ISNULL | expr IS NULL |
| null 처리 | NULLVALUE | COALESCE |
| null 처리 | BLANKVALUE | CASE WHEN expr IS NULL OR TO_VARCHAR(expr) = '' THEN default ELSE expr END |
| 텍스트 | LEFT | LEFT |
| 텍스트 | RIGHT | RIGHT |
| 텍스트 | MID | SUBSTR |
| 텍스트 | LEN | LENGTH |
| 텍스트 | SUBSTITUTE | REPLACE |
| 텍스트 | TRIM | TRIM |
| 텍스트 | UPPER | UPPER |
| 텍스트 | LOWER | LOWER |
| 텍스트 | CONTAINS | CONTAINS |
| 텍스트 | BEGINS | STARTSWITH |
| 텍스트 | FIND | CHARINDEX |
| 텍스트 | LPAD | LPAD |
| 텍스트 | RPAD | RPAD |
| 텍스트 | BR | 개행 문자 리터럴 |
| 변환 | TEXT | CAST(... AS STRING) |
| 변환 | VALUE | TRY_CAST(... AS NUMBER) |
| 수학 | ABS | ABS |
| 수학 | ROUND | ROUND |
| 수학 | CEILING | CEIL |
| 수학 | FLOOR | FLOOR |
| 수학 | MOD | MOD |
| 수학 | SQRT | SQRT |
| 수학 | MAX | GREATEST |
| 수학 | MIN | LEAST |
| 수학 | LOG | LOG(10, ...) |
| 수학 | EXP | EXP |
| 수학 | LN | LN |
| 날짜·시간 | NOW | CURRENT_TIMESTAMP() |
| 날짜·시간 | TODAY | CURRENT_DATE() |
| 날짜·시간 | YEAR | YEAR |
| 날짜·시간 | MONTH | MONTH |
| 날짜·시간 | DAY | DAY |
| 날짜·시간 | DATEVALUE | TO_DATE |
| 날짜·시간 | DATETIMEVALUE | TO_TIMESTAMP |
| 날짜·시간 | ADDMONTHS | DATEADD(MONTH, ...) |
| 선택 목록 | ISPICKVAL | COALESCE(field, '') = COALESCE(value, '') |
함수 외에 다음 연산자가 지원됩니다.
- 산술: +, -, *, /, ^(지수, POWER로 변환)
- 비교: =, ==, !=, <>, <, <=, >, >=
- 논리: AND, OR, &&, ||
- 문자열 연결: & (COALESCE null 처리를 사용한 ||로 변환)
- 단항: -(부정), NOT
지원되지 않는 공식 구조
다음 공식 구조는 아직 지원되지 않습니다. 추가 함수·구조 지원은 향후 릴리스에 추가될 예정입니다. 공식이 이 중 하나를 사용하면 뷰의 해당 열이 NULL을 반환하고 열 주석이 실패 이유를 나타냅니다.
| 실패 이유 | 설명 |
|---|---|
| FUNCTION_NOT_SUPPORTED | 공식이 Snowflake에 상응하는 것이 없거나 Salesforce UI에 특정한 함수를 사용함. 여기에는 IMAGE, HYPERLINK, URLFOR, HTMLENCODE, JSENCODE, LINKTO, GEOLOCATION, DISTANCE, VLOOKUP, REGEX, PREDICT, GETSESSIONID, GETRECORDIDS, REQUIRESCRIPT, ISCHANGED, ISNEW, ISCLONE, PRIORVALUE가 포함됨 |
| GLOBAL_VARIABLE_NOT_SUPPORTED | 공식이 $User.Name, $Organization.Name, $Profile.Name 같은 Salesforce 전역 변수를 참조함. 이러한 변수는 Snowflake에 상응하는 것이 없음 |
| FORMULA_CHAIN_NOT_SUPPORTED | 체인의 공식 필드를 변환할 수 없음. 공식 필드가 다른 공식 필드를 참조할 때(체인 공식) 커넥터는 변환 전에 의존성을 확장함. 의존성 자체가 변환에 실패하면 참조 공식도 이 이유 코드로 실패함. 이것은 Salesforce가 허용하지 않는 순환 공식 참조에서도 발생할 수 있음 |
| ROLLUP_NOT_SUPPORTED | 필드가 공식 필드가 아니라 롤업 요약(rollup summary) 필드임. 롤업 요약은 하위 레코드의 데이터를 집계하며 단순 SQL 뷰로 표현할 수 없음 |
| LOOKUP_NOT_SYNCED | 공식이 Salesforce 객체 메타데이터에서 해석할 수 없는 관계를 참조함. 이는 보통 공식의 관계 이름이 객체의 알려진 관계와 일치하지 않을 때 발생함 |
| ID_FORMAT_MISMATCH | 공식에 하드코딩된 15자 Salesforce ID가 포함됨. Salesforce는 내부적으로 15자 ID를 사용하지만 Bulk API는 18자 ID를 반환함. 하드코딩된 15자 ID가 있는 공식은 안정적으로 변환할 수 없음 |
| COMPOUND_FIELD_REFERENCE | 공식이 MailingAddress 같은 복합 필드를 참조함. 이는 Snowflake에서 단일 열로 저장되지 않음 |
| PARSE_ERROR | 공식 표현식을 파싱할 수 없음. 커넥터가 아직 인식하지 못하는 구문일 수 있음 |
| UNSUPPORTED_SYNTAX | 공식이 인식되지만 변환할 수 없는 구문 구조를 사용함(예: 인수가 3개 미만인 IF 함수) |