SYSTEM$READ_OSI_YAML_FROM_SEMANTIC_VIEW

SYSTEM$READ_OSI_YAML_FROM_SEMANTIC_VIEW

기존 시맨틱 뷰(semantic view)를 읽고 그 정의를 Open Semantic Interchange(OSI) YAML 문서로 반환하는 시스템 함수예요.

OSI는 시맨틱 모델을 표현하기 위한 공개 표준으로, AI 및 BI 도구 전반의 상호운용성을 가능하게 해요. 이 함수는 시맨틱 뷰의 내부 표현을 OSI 형식으로 변환하고 결과 YAML 문자열을 반환해요. OSI에 해당하는 것이 없는 Snowflake 고유 기능은 벤더 사용자 지정 확장(vendor custom extension)에 보존되어 외부 도구를 통한 왕복(round-trip)에도 살아남아요.

출처: Snowflake SQL Reference

본문

⚠️ 더 이상 사용되지 않음 (Deprecated): 이 함수는 더 이상 사용되지 않아요. 대신 SYSTEM$READ_OSSIE_YAML_FROM_SEMANTIC_VIEW를 사용하세요.

참고:

Syntax

SYSTEM$READ_OSI_YAML_FROM_SEMANTIC_VIEW( '<fully_qualified_semantic_view_name>' )

Arguments

'fully_qualified_semantic_view_name':

기존 시맨틱 뷰의 정규화된 이름으로, database_name.schema_name.semantic_view_name 형태예요.

이름의 어떤 부분에 특수 문자(공백, 대소문자 혼용)가 있으면 작은따옴표 인자 문자열 안에서 각 부분을 큰따옴표로 감싸세요. 예: '"my database"."my schema"."My Model"'.

Returns

성공하면 표준 문서 래퍼 형식으로 OSI YAML 문서를 포함하는 VARCHAR를 반환해요:

version: "0.1.1"
semantic_model:
  - name: <model_name>
    ...

시맨틱 뷰가 존재하지 않거나 호출 역할에 권한이 없으면 함수는 설명적인 오류 메시지와 함께 예외를 발생시켜요.

Access control requirements

이 SQL 명령을 실행하는 데 사용되는 역할은 최소한 다음 권한 중 하나를 가져야 해요:

| Privilege | Object | Notes | | SELECT or USAGE | Semantic view | 시맨틱 뷰 정의를 읽는 데 필요해요. |

스키마의 객체를 조작하려면 상위 데이터베이스에 대한 권한이 하나 이상, 상위 스키마에 대한 권한이 하나 이상 필요해요.

지정된 권한 집합으로 사용자 지정 역할을 만드는 방법은 Creating custom roles을 참고하세요.

보안 가능 객체에 대해 SQL 작업을 수행하기 위한 역할 및 권한 부여에 대한 일반 정보는 Overview of Access Control을 참고하세요.

Snowflake-to-OSI mapping reference

| Snowflake semantic view construct | OSI construct | Notes | | tables | datasets | 각 테이블은 데이터셋이 돼요. | | tables[].base_table (table ref) | datasets[].source | db.schema.table 점 표기 이름으로 재구성돼요. | | tables[].base_table (subquery) | datasets[].source | 원시 SQL 정의 문자열로 반환돼요. | | tables[].primary_key.columns | datasets[].primary_key | 열 이름 목록이에요. | | tables[].unique_keys[].columns | datasets[*].unique_keys | 열 이름 목록의 목록이에요. | | dimensions | fields with dimension (is_time: false) | 차원 마커가 추가되고 is_time은 기본값 false예요. | | time_dimensions | fields with dimension.is_time: true | is_time이 true로 설정된 차원 마커가 추가돼요. | | facts | fields without dimension | 필드에 차원 마커가 없어요. | | metrics (model-level) | metrics | 시맨틱 모델의 최상위 수준에 보존돼요. | | relationships (EQUI only) | relationships | equi-join 관계만 내보내져요. | | Extension metadata (version, ai_context, custom_extensions) | Restored to top-level OSI fields | 쓰기 경로의 저장된 확장 속성에서 왕복돼요. |

Field expression handling

모든 필드 및 지표 표현식은 단일 SNOWFLAKE 방언 항목으로 내보내져요:

expression:
  dialects:
    - dialect: SNOWFLAKE
      expression: "<sql_expression>"

뷰가 원래 ANSI_SQL 방언을 포함한 OSI YAML에서 생성된 경우에도 SNOWFLAKE 표현식만 반환돼요 (Snowflake는 내부적으로 단일 해석 표현식을 저장하므로).

Snowflake-specific data in custom_extensions

직접적인 OSI 표현이 없는 Snowflake 기능은 적절한 수준의 SNOWFLAKE 벤더 사용자 지정 확장에 직렬화돼요. 외부 도구는 이러한 확장을 무시하거나 변경 없이 통과시킬 수 있어요.

모델 수준 SNOWFLAKE 확장:

| Field | Included when | | max_staleness | 모델에 갱신 정책(staleness policy)이 있는 경우. | | custom_instructions | 모델에 AI 지시사항이 있는 경우. | | module_custom_instructions | 모델에 모듈 수준 지시사항이 있는 경우. | | variables | 모델에 변수가 정의된 경우. | | verified_queries | 모델에 검증된 쿼리 예제가 있는 경우. | | tags | 모델에 태그가 있는 경우. |

데이터셋 수준 SNOWFLAKE 확장:

| Field | Included when | | synonyms | 데이터셋에 동의어 이름이 있는 경우. | | metrics | 데이터셋에 테이블 수준 지표가 있는 경우 (OSI 전역 지표로 표현 불가). | | filters | 데이터셋에 테이블 수준 필터가 있는 경우. | | tags | 데이터셋에 태그가 있는 경우. | | constraints | 데이터셋에 제약 정의가 있는 경우. |

필드 수준 SNOWFLAKE 확장:

| Field | Applies to | Included when | | synonyms | Dimensions | 필드에 동의어 이름이 있는 경우. | | tags | Dimensions | 필드에 태그가 있는 경우. | | sample_values | Dimensions, TimeDimensions, Facts | 필드에 샘플 값이 있는 경우. | | cortex_search_service | Dimensions | 필드가 Cortex Search 서비스에 의해 지원되는 경우. | | is_enum | Dimensions | 필드가 열거형으로 표시된 경우. | | access_modifier | Facts | 필드에 기본이 아닌 접근 수정자가 있는 경우. |

지표 수준 SNOWFLAKE 확장:

| Field | Included when | | synonyms | 지표에 동의어 이름이 있는 경우. | | access_modifier | 지표에 기본이 아닌 접근 수정자가 있는 경우. | | non_additive_dimensions | 지표가 비가산 차원을 지정하는 경우. | | additive_dimensions | 지표가 가산 차원을 지정하는 경우. | | using_relationships | 지표가 관계 사용을 선언하는 경우. | | tags | 지표에 태그가 있는 경우. |

충실하게 변환되는 것 (What is converted faithfully)

다음은 완전한 왕복(OSI YAML 쓰기 후 다시 읽기)에서 살아남아요:

  • 모델 이름, 설명, 버전
  • 데이터셋 이름, 설명, 소스(정규화된 이름 및 하위 쿼리)
  • 기본 키 및 고유 키
  • 모든 필드 이름, 설명, 표현식
  • 필드 분류(차원 vs 시간 차원 vs 팩트)
  • Equi-join 관계(이름, from/to 테이블, 열 매핑)
  • 모델 수준 지표(이름, 설명, 표현식)
  • 모델, 데이터셋, 필드 수준의 ai_context
  • 모든 벤더(DBT, SALESFORCE, DATABRICKS, COMMON, SNOWFLAKE)의 custom_extensions

손실되거나 변환되지 않는 것 (What is lost or not converted)

| OSI concept / Snowflake feature | Behavior | Reason | | Non-EQUI relationships (ASOF, RANGE) | 출력에서 조용히 제거돼요. | OSI 사양은 equi-join 의미론만 정의해요. | | Field labels | 왕복 시 손실돼요. | 쓰기 경로가 label 속성을 유지하지 않아요. | | Data types | 출력에 포함되지 않아요. | 설계상 OSI 필드는 저장 유형이 아니라 표현식을 담아요. | | Multi-dialect expressions | SNOWFLAKE 방언만 반환돼요. | Snowflake는 단일 해석 표현식을 저장해요. | | Table-level metrics | 데이터셋 custom_extensions로 이동해요. | OSI는 모델 수준 지표만 지원해요. | | Table-level filters | 데이터셋 custom_extensions로 이동해요. | OSI에 해당하는 것이 없어요. 왕복을 위해 확장으로 보존돼요. |

Usage notes

  • 출력은 뷰가 평면(flat) 또는 래퍼 형식 중 무엇으로 생성되었는지와 무관하게 항상 문서 래퍼 형식(최상위 version + 항목 하나의 semantic_model 배열)을 사용해요.
  • 어떤 방법(네이티브 YAML, DDL, OSI YAML)으로 생성된 시맨틱 뷰든 이 함수로 내보낼 수 있어요. Snowflake 고유 기능은 SNOWFLAKE 벤더 확장에 나타나요.
  • null 필드는 출력 YAML에서 생략돼요 (문서를 어지럽히는 빈 키 없음).
  • 출력 version 필드는 다음과 같이 결정돼요:
    • 시맨틱 뷰가 원래 OSI YAML에서 생성된 경우 확장 메타데이터에 저장된 버전이 사용돼요.
    • 시맨틱 뷰가 네이티브 YAML 또는 SQL로 생성된 경우(저장된 OSI 버전이 없음) 기본 버전 "0.1.1"이 사용돼요.

Examples

시맨틱 뷰를 OSI YAML로 읽기

SELECT SYSTEM$READ_OSI_YAML_FROM_SEMANTIC_VIEW(
  'my_db.my_schema.sales_model'
);

반환:

version: "0.1.1"
semantic_model:
  - name: sales_model
    description: "Core sales semantic model"
    datasets:
      - name: orders
        source: my_db.public.orders
        primary_key:
          - order_id
        fields:
          - name: order_id
            expression:
              dialects:
                - dialect: SNOWFLAKE
                  expression: order_id
            dimension:
              is_time: false
          - name: order_date
            expression:
              dialects:
                - dialect: SNOWFLAKE
                  expression: order_date
            dimension:
              is_time: true
          - name: total_amount
            expression:
              dialects:
                - dialect: SNOWFLAKE
                  expression: total_amount
    metrics:
      - name: total_revenue
        description: "Sum of all order amounts"
        expression:
          dialects:
            - dialect: SNOWFLAKE
              expression: "SUM(total_amount)"

Snowflake 고유 기능이 있는 뷰 읽기

SELECT SYSTEM$READ_OSI_YAML_FROM_SEMANTIC_VIEW(
  'analytics_db.public.customer_model'
);

반환 (Snowflake 고유 기능은 custom_extensions에 나타나요):

version: "0.1.1"
semantic_model:
  - name: customer_model
    custom_extensions:
      - vendor: SNOWFLAKE
        content: '{"custom_instructions":"Answer in metric units"}'
    datasets:
      - name: customers
        source: analytics_db.public.customers
        fields:
          - name: region
            expression:
              dialects:
                - dialect: SNOWFLAKE
                  expression: region
            dimension:
              is_time: false
            custom_extensions:
              - vendor: SNOWFLAKE
                content: '{"synonyms":["area","territory"],"is_enum":true}'

왕복 예제: 쓰고 다시 읽기

-- Write an OSI model
CALL SYSTEM$CREATE_SEMANTIC_VIEW_FROM_OSI_YAML(
  'my_db.my_schema',
  $$
  version: "0.1.1"
  name: round_trip_model
  datasets:
    - name: sales
      source: my_db.public.sales
      primary_key:
        - sale_id
      fields:
        - name: sale_id
          expression:
            dialects:
              - dialect: SNOWFLAKE
                expression: sale_id
          dimension:
            is_time: false
        - name: sale_date
          expression:
            dialects:
              - dialect: SNOWFLAKE
                expression: sale_date
          dimension:
            is_time: true
        - name: amount
          expression:
            dialects:
              - dialect: SNOWFLAKE
                expression: amount
  $$
);

-- Read it back as OSI YAML
SELECT SYSTEM$READ_OSI_YAML_FROM_SEMANTIC_VIEW(
  'my_db.my_schema.round_trip_model'
);

더 알아보기 (Learn more)