다중 값 태그(Multi-value tags)
다중 값 태그(Multi-value tags)
이 주제는 하나의 태그에 여러 값을 연결할 수 있는 다중 값 태그를 설명해요.
출처: Multi-value tags
본문
개요
표준 태그는 객체의 태그당 단일 값만 지원해요. 다중 값 태그는 같은 객체나 열의 같은 태그에 여러 값을 연결하는 기능을 지원해 이 능력을 확장해요. 이는 객체를 상호 배타적이지 않은 여러 범주로 분류해야 할 때 유용해요.
예를 들어 테이블에 여러 데이터 소스(DATA_SOURCE = 'CRM'와 DATA_SOURCE = 'ERP') 또는 여러 규정 준수 요구 사항(COMPLIANCE = 'GDPR'와 COMPLIANCE = 'PCI')으로 태그를 지정해야 할 수 있어요.
다중 값 태그의 주요 특징:
- 태그는 여러 값을 지원하려면 MULTI_VALUE = TRUE 속성으로 명시적으로 구성해야 해요.
- 태그가 다중 값으로 설정된 후에는 단일 값 태그로 되돌릴 수 없어요.
- 객체에서 여러 값을 관리하려면
ADD VALUE와DROP VALUE작업을 사용해요. - 기본 제한은 객체당 다중 값 태그당 값 10개예요.
- 다중 값 태그는 태그 전파와 함께 작동해요.
ON_CONFLICT = MERGE전략은MULTI_VALUE = TRUE일 때만 사용할 수 있어요.
다중 값 태그 vs 단일 값 태그
| 항목 | 단일 값 태그 | 다중 값 태그 |
|---|---|---|
| 카디널리티 | 객체 또는 열당 태그당 값 하나. | 기본적으로 객체당 태그당 최대 10개 값. |
| 태그 정의 | 기본 동작으로 생성(MULTI_VALUE가 false이거나 생략). |
MULTI_VALUE = TRUE로 태그 생성 또는 변경. MULTI_VALUE를 다시 false로 설정할 수 없음. |
| 값 할당 | 객체나 열에 SET TAG / UNSET TAG 사용. |
ALTER TABLE에서 ADD VALUE와 DROP VALUE를 사용해 값 추가/제거. ADD VALUE로 첫 번째 값을 직접 추가할 수 있음. SET TAG는 설정한 값으로 전체 값 집합을 대체하고 추가하지 않음. UNSET TAG는 태그를 제거함(ALTER TABLE ADD VALUE 및 DROP VALUE(다중 값 태그) 참조). |
| 전파 충돌 | 전파는 단일 승자 값을 위해 태그의 ON_CONFLICT 동작을 사용(병합 의미론을 별도로 채택하지 않는 한). |
ON_CONFLICT = MERGE는 태그에 MULTI_VALUE = TRUE가 있을 때만 허용됨. 여러 소스 값이 대상(예: 뷰)에 누적되도록 사용. |
SYSTEM$GET_TAG 및 정책 헬퍼 |
단일 값이 있으면 태그 값 하나를 반환. | 값이 두 개 이상이면 오류 반환. 확인에는 SYSTEM$TAG_VALUE_CONTAINS를 사용하거나 정책 로직을 단일 값 태그에만 유지(다중 값 태그와 마스킹 정책 참조). |
다중 값 태그 만들기
여러 값을 지원하는 태그를 만들려면 CREATE TAG 문에서 MULTI_VALUE = TRUE 속성을 사용하세요:
CREATE TAG classification_tag MULTI_VALUE = TRUE;
전파를 활성화한 다중 값 태그도 만들 수 있어요:
CREATE TAG data_source_tag
MULTI_VALUE = TRUE
PROPAGATE = ON_DEPENDENCY_AND_DATA_MOVEMENT
ON_CONFLICT = MERGE;
기존 태그를 다중 값 태그로 변환하려면 ALTER TAG를 사용하세요:
ALTER TAG sensitivity_tag SET MULTI_VALUE = TRUE;
태그가 태그 생성 시 또는 ALTER TAG 호출로 다중 값으로 설정된 후에는 단일 값 태그로 되돌릴 수 없어요.
객체에 여러 값 할당
다중 값 태그를 만든 후 ALTER TABLE에서 ADD VALUE와 DROP VALUE를 사용해 값을 추가하거나 제거해요. SET TAG는 태그를 정확히 하나의 문자열로 설정하고 이미 있는 값을 대체해요. 집합에 추가하지 않아요.
다음은 예시예요.
테이블 태그에 여러 값 할당
테이블에 태그 값을 할당하려면:
-- 값 추가(ADD VALUE는 첫 번째 값에도 동작).
ALTER TABLE customers ADD VALUE 'PII' FOR TAG classification_tag;
ALTER TABLE customers ADD VALUE 'FINANCIAL' FOR TAG classification_tag;
ALTER TABLE customers ADD VALUE 'GDPR' FOR TAG classification_tag;
특정 값을 제거하려면:
ALTER TABLE customers DROP VALUE 'FINANCIAL' FOR TAG classification_tag;
열 태그에 여러 값 할당
열에 태그 값을 할당하려면:
-- 열에 값 추가.
ALTER TABLE orders MODIFY COLUMN customer_email ADD VALUE 'email_pii' FOR TAG classification_tag;
ALTER TABLE orders MODIFY COLUMN customer_email ADD VALUE 'contact_info' FOR TAG classification_tag;
-- 열에서 값 제거.
ALTER TABLE orders MODIFY COLUMN customer_email DROP VALUE 'contact_info' FOR TAG classification_tag;
단일 문에서 여러 열을 수정할 수도 있어요:
ALTER TABLE orders MODIFY
COLUMN order_id ADD VALUE 'id_field' FOR TAG classification_tag,
COLUMN amount ADD VALUE 'financial_data' FOR TAG classification_tag;
ALTER TABLE ADD VALUE 및 DROP VALUE (다중 값 태그)
테이블이나 열의 다중 값 태그에서 값을 추가하거나 제거해요. 이 주제는 다중 값 태그의 ADD VALUE와 DROP VALUE 구문을 설명해요. 전체 ALTER TABLE 참조는 ALTER TABLE을 참조하세요.
구문
테이블 수준 작업
ALTER TABLE [ IF EXISTS ] <table_name> ADD VALUE '<tag_value>' FOR TAG <tag_name>
ALTER TABLE [ IF EXISTS ] <table_name> DROP VALUE '<tag_value>' FOR TAG <tag_name>
열 수준 작업
ALTER TABLE [ IF EXISTS ] <table_name>
{ ALTER | MODIFY } [ COLUMN ] <col_name> ADD VALUE '<tag_value>' FOR TAG <tag_name>
ALTER TABLE [ IF EXISTS ] <table_name>
{ ALTER | MODIFY } [ COLUMN ] <col_name> DROP VALUE '<tag_value>' FOR TAG <tag_name>
다중 열 작업
단일 문에서 여러 열을 수정할 수 있어요:
ALTER TABLE [ IF EXISTS ] <table_name> MODIFY
COLUMN <col1_name> ADD VALUE '<tag_value>' FOR TAG <tag_name>,
COLUMN <col2_name> ADD VALUE '<tag_value>' FOR TAG <tag_name>
매개변수
table_name— 수정할 테이블의 이름.col_name— (열 수준 작업의 경우) 수정할 열의 이름.'tag_value'— 태그에 추가하거나 제거할 문자열 값. 태그의ALLOWED_VALUES제약 조건을 따르는 유효한 문자열이어야 함.tag_name— 태그의 식별자. 태그는MULTI_VALUE = TRUE로 설정돼야 함.
ALTER TABLE 다중 값 작업의 사용 메모
ADD VALUE또는DROP VALUE작업을 사용하려면 태그가MULTI_VALUE = TRUE로 만들어져야(또는ALTER TAG ... SET MULTI_VALUE = TRUE로 변환) 해요. 단일 값 태그에 이 작업을 시도하면 오류가 반환돼요.- 표준
SET TAG구문을 사용할 수 있지만, 태그의 전체 값 집합을 단일 문자열로 대체하고 추가하지 않아요. - 중복 값 추가는 no-op이에요. 존재하지 않는 값을 제거하는 것도 no-op이에요.
- 객체의 다중 값 태그에서 모든 값이 제거되면 해당 객체에서 태그 연관이 제거돼요.
- 다중 값 태그는
CREATE TABLE ... CLONE또는CREATE TABLE ... LIKE문의COPY TAGS옵션과 함께 사용할 수 없어요.
소스 테이블에 ON_CONFLICT = MERGE가 있는 다중 값 태그가 있을 때 뷰는 태그 전파를 통해 다중 값 태그를 받아요. 직접 ALTER VIEW ADD VALUE 구문은 지원되지 않아요.
다중 값 태그 쿼리
SYSTEM$GET_TAG 함수는 여러 값이 있는 태그를 지원하지 않아요. 태그에 여러 값이 있는 객체에서 SYSTEM$GET_TAG를 호출하면 함수가 오류를 반환해요.
태그에 값이 하나만 있으면(태그가 다중 값으로 구성됐더라도) SYSTEM$GET_TAG는 오류 없이 그 값을 반환해요.
-- 동작: 하나의 값만 할당.
ALTER TABLE my_table ADD VALUE 'single_value' FOR TAG my_mv_tag;
SELECT SYSTEM$GET_TAG('my_mv_tag', 'my_table', 'TABLE'); -- 'single_value' 반환
-- 다른 값 추가.
ALTER TABLE my_table ADD VALUE 'second_value' FOR TAG my_mv_tag;
-- 실패: 여러 값 존재.
SELECT SYSTEM$GET_TAG('my_mv_tag', 'my_table', 'TABLE'); -- 오류
-- 대신 SYSTEM$TAG_VALUE_CONTAINS 사용.
SELECT SYSTEM$TAG_VALUE_CONTAINS('my_mv_tag', 'my_table', 'TABLE', 'single_value'); -- True
전체 참조는 SYSTEM$TAG_VALUE_CONTAINS를 참조하세요.
SYSTEM$TAG_VALUE_CONTAINS
SYSTEM$TAG_VALUE_CONTAINS는 지정된 객체 또는 열의 지정된 다중 값 태그가 지정된 값을 포함하면 TRUE를 반환해요. 값이 없거나 태그가 객체에 할당되지 않았으면 FALSE를 반환해요. SYSTEM$GET_TAG는 여러 값이 존재할 때 오류를 발생시키므로, 값이 두 개 이상일 가능성이 있을 때는 이 함수를 사용하세요.
예제
SELECT SYSTEM$TAG_VALUE_CONTAINS('classification_tag', 'customers', 'TABLE', 'PII'); -- True
SELECT SYSTEM$TAG_VALUE_CONTAINS('classification_tag', 'customers', 'TABLE', 'FINANCIAL'); -- True
SELECT SYSTEM$TAG_VALUE_CONTAINS('classification_tag', 'customers', 'TABLE', 'HIPAA'); -- False
TAG_REFERENCES 및 TAG_REFERENCES_ALL_COLUMNS 테이블 함수를 사용해 모든 태그 값을 볼 수도 있어요:
SELECT *
FROM TABLE(INFORMATION_SCHEMA.TAG_REFERENCES('customers', 'TABLE'));
SELECT *
FROM TABLE(INFORMATION_SCHEMA.TAG_REFERENCES_ALL_COLUMNS('orders', 'TABLE'));
지정된 태그로 결과를 필터링할 수 있어요:
-- CUSTOMERS 테이블에서 태그 classification_tag의 모든 값을 표시.
SELECT tag_name, tag_value
FROM TABLE(INFORMATION_SCHEMA.TAG_REFERENCES('CUSTOMERS', 'TABLE'))
WHERE tag_name = 'classification_tag';
다중 값 태그가 있는 태그 전파
다중 값 태그는 태그 전파와 함께 작동해요. 태그에 ON_CONFLICT = MERGE를 설정할 수 있는 것은 MULTI_VALUE = TRUE일 때뿐이에요. 단일 값 태그에는 유효하지 않아요. 병합 전략을 사용하면 여러 소스 객체의 충돌하는 태그 값이 대상 객체의 여러 값으로 결합돼요.
모든 소스 테이블에 ON_CONFLICT = MERGE가 있는 다중 값 태그가 있을 때 뷰는 전파를 통해 다중 값 태그를 받아요.
예를 들어 두 소스 테이블이 같은 전파 태그에 대해 다른 값을 가지면, 두 테이블로 만든 뷰는 두 값을 모두 가져요:
CREATE TAG data_source_tag
MULTI_VALUE = TRUE
PROPAGATE = ON_DEPENDENCY_AND_DATA_MOVEMENT
ON_CONFLICT = MERGE;
ALTER TABLE sales_data SET TAG data_source_tag = 'sales_system';
ALTER TABLE support_data SET TAG data_source_tag = 'support_system';
-- 조인 뷰는 전파를 통해 두 값을 모두 받음.
CREATE VIEW v_combined AS
SELECT * FROM sales_data JOIN support_data ON sales_data.id = support_data.id;
SELECT SYSTEM$TAG_VALUE_CONTAINS('data_source_tag', 'v_combined', 'TABLE', 'sales_system'); -- True
SELECT SYSTEM$TAG_VALUE_CONTAINS('data_source_tag', 'v_combined', 'TABLE', 'support_system'); -- True
소스 테이블 태그의 변경(값 추가 또는 제거)은 종속 객체에 자동으로 전파돼요.
다중 값 태그와 마스킹 정책
마스킹 정책 및 행 접근 정책 조건에 사용되는 SYSTEM$GET_TAG_ON_CURRENT_TABLE 및 SYSTEM$GET_TAG_ON_CURRENT_COLUMN 함수는 여러 값이 있는 태그를 지원하지 않아요.
마스킹 정책과 함께 태그를 사용해야 한다면 정책 로직에는 단일 값 태그를 사용하세요. 다른 분류 목적으로 같은 객체에 다중 값 태그를 사용할 수 있지만, 정책 조건에서는 다중 값 태그를 참조하지 마세요.
다중 값 태그를 확인해야 하는 애플리케이션 수준 로직에는 쿼리에서 SYSTEM$TAG_VALUE_CONTAINS를 사용하세요:
SELECT
SYSTEM$TAG_VALUE_CONTAINS('env_tag', 'my_table', 'TABLE', 'prod') AS is_prod,
SYSTEM$TAG_VALUE_CONTAINS('env_tag', 'my_table', 'TABLE', 'pci') AS is_pci;
제한 사항
- MULTI_VALUE 속성은 FALSE로 설정할 수 없어요. 태그가 다중 값으로 구성된 후에는 되돌릴 수 없어요.
- 기본 제한은 객체당 다중 값 태그당 값 10개예요.
SYSTEM$GET_TAG,SYSTEM$GET_TAG_ON_CURRENT_TABLE,SYSTEM$GET_TAG_ON_CURRENT_COLUMN은 여러 값이 할당된 태그에서 호출되면 오류를 반환해요. 대신SYSTEM$TAG_VALUE_CONTAINS를 사용하세요.- 중복 값 추가는 no-op이에요(오류가 발생하지 않고 값 개수도 늘지 않아요).
- ADD VALUE 및 DROP VALUE 작업은 태그에
MULTI_VALUE = TRUE가 필요해요. 단일 값 태그에서 이 작업을 실행하면 오류가 반환돼요.
지원되는 객체
태그를 할당할 수 있는 객체는 지원되는 객체를 참조하세요.