SYSTEM$READ_OSSIE_YAML_FROM_SEMANTIC_VIEW
SYSTEM$READ_OSSIE_YAML_FROM_SEMANTIC_VIEW
기존 시맨틱 뷰(semantic view)를 읽고 그 정의를 Apache Ossie(incubating) YAML 문서로 반환하는 시스템 함수예요.
Apache Ossie(incubating)는 시맨틱 모델을 표현하기 위한 공개 표준으로, AI 및 BI 도구 전반의 상호운용성을 가능하게 해요. 이 함수는 시맨틱 뷰의 내부 표현을 Ossie 형식으로 변환하고 결과 YAML 문자열을 반환해요. Ossie에 해당하는 것이 없는 Snowflake 고유 기능은 벤더 사용자 지정 확장(vendor custom extension)에 보존되어 외부 도구를 통한 왕복(round-trip)에도 살아남아요.
본문
참고:
Syntax
SYSTEM$READ_OSSIE_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
성공하면 표준 문서 래퍼 형식으로 Ossie 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-Ossie mapping reference
| Snowflake semantic view construct | Ossie 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 Ossie fields | 쓰기 경로의 저장된 확장 속성에서 왕복돼요. |
Field expression handling
모든 필드 및 지표 표현식은 단일 SNOWFLAKE 방언 항목으로 내보내져요:
expression:
dialects:
- dialect: SNOWFLAKE
expression: "<sql_expression>"
뷰가 원래 ANSI_SQL 방언을 포함한 Ossie YAML에서 생성된 경우에도 SNOWFLAKE 표현식만 반환돼요 (Snowflake는 내부적으로 단일 해석 표현식을 저장하므로).
Snowflake-specific data in custom_extensions
직접적인 Ossie 표현이 없는 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 | 데이터셋에 테이블 수준 지표가 있는 경우 (Ossie 전역 지표로 표현 불가). | | 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)
다음은 완전한 왕복(Ossie YAML 쓰기 후 다시 읽기)에서 살아남아요:
- 모델 이름, 설명, 버전
- 데이터셋 이름, 설명, 소스(정규화된 이름 및 하위 쿼리)
- 기본 키 및 고유 키
- 모든 필드 이름, 설명, 표현식
- 필드 분류(차원 vs 시간 차원 vs 팩트)
- Equi-join 관계(이름, from/to 테이블, 열 매핑)
- 모델 수준 지표(이름, 설명, 표현식)
- 모델, 데이터셋, 필드 수준의 ai_context
- 모든 벤더(DBT, SALESFORCE, DATABRICKS, COMMON, SNOWFLAKE)의 custom_extensions
손실되거나 변환되지 않는 것 (What is lost or not converted)
| Ossie concept / Snowflake feature | Behavior | Reason | | Non-EQUI relationships (ASOF, RANGE) | 출력에서 조용히 제거돼요. | Ossie 사양은 equi-join 의미론만 정의해요. | | Field labels | 왕복 시 손실돼요. | 쓰기 경로가 label 속성을 유지하지 않아요. | | Data types | 출력에 포함되지 않아요. | 설계상 Ossie 필드는 저장 유형이 아니라 표현식을 담아요. | | Multi-dialect expressions | SNOWFLAKE 방언만 반환돼요. | Snowflake는 단일 해석 표현식을 저장해요. | | Table-level metrics | 데이터셋 custom_extensions로 이동해요. | Ossie는 모델 수준 지표만 지원해요. | | Table-level filters | 데이터셋 custom_extensions로 이동해요. | Ossie에 해당하는 것이 없어요. 왕복을 위해 확장으로 보존돼요. |
Usage notes
- 출력은 뷰가 평면(flat) 또는 래퍼 형식 중 무엇으로 생성되었는지와 무관하게 항상 문서 래퍼 형식(최상위 version + 항목 하나의 semantic_model 배열)을 사용해요.
- 어떤 방법(네이티브 YAML, DDL, Ossie YAML)으로 생성된 시맨틱 뷰든 이 함수로 내보낼 수 있어요. Snowflake 고유 기능은 SNOWFLAKE 벤더 확장에 나타나요.
- null 필드는 출력 YAML에서 생략돼요 (문서를 어지럽히는 빈 키 없음).
- 출력 version 필드는 다음과 같이 결정돼요:
- 시맨틱 뷰가 원래 Ossie YAML에서 생성된 경우 확장 메타데이터에 저장된 버전이 사용돼요.
- 시맨틱 뷰가 네이티브 YAML 또는 SQL로 생성된 경우(저장된 Ossie 버전이 없음) 기본 버전
"0.1.1"이 사용돼요.
데이터베이스, 스키마 또는 뷰의 이름이 큰따옴표로 묶인 식별자(예: 이름에 공백이 있는 경우)라면 이름 주위에 큰따옴표를 포함해야 해요. 예:
SELECT SYSTEM$READ_OSSIE_YAML_FROM_SEMANTIC_VIEW(
'"my database"."my schema"."My Model"'
);
Examples
시맨틱 뷰를 Ossie YAML로 읽기
SELECT SYSTEM$READ_OSSIE_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_OSSIE_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 Ossie model
CALL SYSTEM$CREATE_SEMANTIC_VIEW_FROM_OSSIE_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 Ossie YAML
SELECT SYSTEM$READ_OSSIE_YAML_FROM_SEMANTIC_VIEW(
'my_db.my_schema.round_trip_model'
);