ALTER TABLE

기존 테이블의 속성, 열 또는 제약 조건을 수정합니다.

참고 항목:

ALTER TABLE … ALTER COLUMN , CREATE TABLE , DROP TABLE , SHOW TABLES , DESCRIBE TABLE

구문

ALTER TABLE [ IF EXISTS ] <name> RENAME TO <new_table_name>

ALTER TABLE [ IF EXISTS ] <name> SWAP WITH <target_table_name>

ALTER TABLE [ IF EXISTS ] <name> { clusteringAction | tableColumnAction | constraintAction  }

ALTER TABLE [ IF EXISTS ] <name> dataMetricFunctionAction

ALTER TABLE [ IF EXISTS ] <name> dataGovnPolicyTagAction

ALTER TABLE [ IF EXISTS ] <name> extTableColumnAction

ALTER TABLE [ IF EXISTS ] <name> searchOptimizationAction

ALTER TABLE [ IF EXISTS ] <name> SET
  [ DATA_RETENTION_TIME_IN_DAYS = <integer> ]
  [ MAX_DATA_EXTENSION_TIME_IN_DAYS = <integer> ]
  [ CHANGE_TRACKING = { TRUE | FALSE  } ]
  [ DEFAULT_DDL_COLLATION = '<collation_specification>' ]
  [ ENABLE_SCHEMA_EVOLUTION = { TRUE | FALSE } ]
  [ COMMENT = '<string_literal>' ]

ALTER TABLE [ IF EXISTS ] <name> UNSET {
                                       DATA_RETENTION_TIME_IN_DAYS         |
                                       MAX_DATA_EXTENSION_TIME_IN_DAYS     |
                                       CHANGE_TRACKING                     |
                                       DEFAULT_DDL_COLLATION               |
                                       ENABLE_SCHEMA_EVOLUTION             |
                                       COMMENT                             |
                                       }
                                       [ , ... ]
Copy

여기서

clusteringAction ::=
  {
     CLUSTER BY ( <expr> [ , <expr> , ... ] )
     /* RECLUSTER is deprecated */
   | RECLUSTER [ MAX_SIZE = <budget_in_bytes> ] [ WHERE <condition> ]
     /* { SUSPEND | RESUME } RECLUSTER is valid action */
   | { SUSPEND | RESUME } RECLUSTER
   | DROP CLUSTERING KEY
  }
Copy
tableColumnAction ::=
  {
     ADD [ COLUMN ] [ IF NOT EXISTS ] <col_name> <col_type>
        [
           {
              DEFAULT <default_value>
              | { AUTOINCREMENT | IDENTITY }
                 /* AUTOINCREMENT (or IDENTITY) is supported only for           */
                 /* columns with numeric data types (NUMBER, INT, FLOAT, etc.). */
                 /* Also, if the table is not empty (i.e. if the table contains */
                 /* any rows), only DEFAULT can be altered.                     */
                 [
                    {
                       ( <start_num> , <step_num> )
                       | START <num> INCREMENT <num>
                    }
                 ]
                 [  { ORDER | NOORDER } ]
           }
        ]
        [ inlineConstraint ]
        [ COLLATE '<collation_specification>' ]

   | RENAME COLUMN <col_name> TO <new_col_name>

   | ALTER | MODIFY [ ( ]
                            [ COLUMN ] <col1_name> DROP DEFAULT
                          , [ COLUMN ] <col1_name> SET DEFAULT <seq_name>.NEXTVAL
                          , [ COLUMN ] <col1_name> { [ SET ] NOT NULL | DROP NOT NULL }
                          , [ COLUMN ] <col1_name> [ [ SET DATA ] TYPE ] <type>
                          , [ COLUMN ] <col1_name> COMMENT '<string>'
                          , [ COLUMN ] <col1_name> UNSET COMMENT
                        [ , [ COLUMN ] <col2_name> ... ]
                        [ , ... ]
                    [ ) ]

   | DROP [ COLUMN ] [ IF EXISTS ] <col1_name> [, <col2_name> ... ]
  }

  inlineConstraint ::=
    [ NOT NULL ]
    [ CONSTRAINT <constraint_name> ]
    { UNIQUE | PRIMARY KEY | { [ FOREIGN KEY ] REFERENCES <ref_table_name> [ ( <ref_col_name> ) ] } }
    [ <constraint_properties> ]
Copy

열 변경을 위한 자세한 구문과 예는 ALTER TABLE … ALTER COLUMN 을 참조하십시오. .

인라인 제약 조건 생성/변경을 위한 자세한 구문과 예는 CREATE | ALTER TABLE … CONSTRAINT 를 참조하십시오.

dataMetricFunctionAction ::=

    SET DATA_METRIC_SCHEDULE = {
        '<num> MINUTE'
      | 'USING CRON <expr> <time_zone>'
      | 'TRIGGER_ON_CHANGES'
    }

  | UNSET DATA_METRIC_SCHEDULE

  | { ADD | DROP } DATA METRIC FUNCTION <metric_name>
      ON ( <col_name> [ , ... ] )
      [ , <metric_name_2> ON ( <col_name> [ , ... ] ) ]
  | MODIFY DATA METRIC FUNCTION <metric_name>
      ON ( <col_name> [ , ... ] ) { SUSPEND | RESUME }
      [ , <metric_name_2> ON ( <col_name> [ , ... ] ) { SUSPEND | RESUME } ]
Copy
dataGovnPolicyTagAction ::=
  {
      SET TAG <tag_name> = '<tag_value>' [ , <tag_name> = '<tag_value>' ... ]
    | UNSET TAG <tag_name> [ , <tag_name> ... ]
  }
  |
  {
      ADD ROW ACCESS POLICY <policy_name> ON ( <col_name> [ , ... ] )
    | DROP ROW ACCESS POLICY <policy_name>
    | DROP ROW ACCESS POLICY <policy_name> ,
        ADD ROW ACCESS POLICY <policy_name> ON ( <col_name> [ , ... ] )
    | DROP ALL ROW ACCESS POLICIES
  }
  |
  {
      SET AGGREGATION POLICY <policy_name>
        [ ENTITY KEY ( <col_name> [, ... ] ) ]
        [ FORCE ]
    | UNSET AGGREGATION POLICY
  }
  |
  ADD [ COLUMN ] [ IF NOT EXISTS ] <col_name> <col_type>
    [ [ WITH ] MASKING POLICY <policy_name>
          [ USING ( <col1_name> , <cond_col_1> , ... ) ] ]
    [ [ WITH ] PROJECTION POLICY <policy_name> ]
    [ [ WITH ] TAG ( <tag_name> = '<tag_value>'
          [ , <tag_name> = '<tag_value>' , ... ] ) ]
  |
  {
    { ALTER | MODIFY } [ COLUMN ] <col1_name>
        SET MASKING POLICY <policy_name>
          [ USING ( <col1_name> , <cond_col_1> , ... ) ] [ FORCE ]
      | UNSET MASKING POLICY
  }
  |
  {
    { ALTER | MODIFY } [ COLUMN ] <col1_name>
        SET PROJECTION POLICY <policy_name>
          [ FORCE ]
      | UNSET PROJECTION POLICY
  }
  |
  { ALTER | MODIFY } [ COLUMN ] <col1_name> SET TAG
      <tag_name> = '<tag_value>' [ , <tag_name> = '<tag_value>' ... ]
      , [ COLUMN ] <col2_name> SET TAG
          <tag_name> = '<tag_value>' [ , <tag_name> = '<tag_value>' ... ]
  |
  { ALTER | MODIFY } [ COLUMN ] <col1_name> UNSET TAG <tag_name> [ , <tag_name> ... ]
                   , [ COLUMN ] <col2_name> UNSET TAG <tag_name> [ , <tag_name> ... ]
Copy
extTableColumnAction ::=
  {
     ADD [ COLUMN ] [ IF NOT EXISTS ] <col_name> <col_type> AS ( <expr> )

   | RENAME COLUMN <col_name> TO <new_col_name>

   | DROP [ COLUMN ] [ IF EXISTS ] <col1_name> [, <col2_name> ... ]
  }
Copy
constraintAction ::=
  {
     ADD outoflineConstraint
   | RENAME CONSTRAINT <constraint_name> TO <new_constraint_name>
   | { ALTER | MODIFY } { CONSTRAINT <constraint_name> | PRIMARY KEY | UNIQUE | FOREIGN KEY } ( <col_name> [ , ... ] )
                         [ [ NOT ] ENFORCED ] [ VALIDATE | NOVALIDATE ] [ RELY | NORELY ]
   | DROP { CONSTRAINT <constraint_name> | PRIMARY KEY | UNIQUE | FOREIGN KEY } ( <col_name> [ , ... ] )
                         [ CASCADE | RESTRICT ]
  }

  outoflineConstraint ::=
    [ CONSTRAINT <constraint_name> ]
    {
       UNIQUE [ ( <col_name> [ , <col_name> , ... ] ) ]
     | PRIMARY KEY [ ( <col_name> [ , <col_name> , ... ] ) ]
     | [ FOREIGN KEY ] [ ( <col_name> [ , <col_name> , ... ] ) ]
                          REFERENCES <ref_table_name> [ ( <ref_col_name> [ , <ref_col_name> , ... ] ) ]
    }
    [ <constraint_properties> ]
Copy

아웃오브 라인 제약 조건 생성/변경을 위한 자세한 구문과 예는 CREATE | ALTER TABLE … CONSTRAINT 를 참조하십시오.

searchOptimizationAction ::=
  {
     ADD SEARCH OPTIMIZATION [
       ON <search_method_with_target> [ , <search_method_with_target> ... ]
     ]

   | DROP SEARCH OPTIMIZATION [
       ON { <search_method_with_target> | <column_name> | <expression_id> }
          [ , ... ]
     ]
  }
Copy

자세한 내용은 검색 최적화 작업(searchOptimizationAction) 섹션을 참조하십시오.

매개 변수

name

변경할 테이블의 식별자입니다. 식별자에 공백이나 특수 문자가 포함된 경우 전체 문자열을 큰따옴표로 묶어야 합니다. 큰따옴표로 묶인 식별자도 대/소문자를 구분합니다.

RENAME TO new_table_name

스키마의 다른 어떤 테이블에서도 현재 사용하지 않는 새 식별자로 지정된 테이블의 이름을 바꿉니다.

테이블 식별자에 대한 자세한 내용은 식별자 요구 사항 섹션을 참조하십시오.

선택적으로 오브젝트의 이름을 바꾸는 동안 오브젝트를 다른 데이터베이스 및/또는 스키마로 이동할 수 있습니다. 그러려면 각각 db_name.schema_name.object_name 또는 schema_name.object_name 형식으로 새 데이터베이스 및/또는 스키마 이름을 포함하는 정규화된 new_name 값을 지정하십시오.

참고

  • 대상 데이터베이스 및/또는 스키마가 이미 있어야 합니다. 또한, 새 위치에 이름이 같은 오브젝트가 있으면 안 됩니다. 그렇지 않으면 문이 오류를 반환합니다.

  • 오브젝트 소유자(즉, 오브젝트에 대한 OWNERSHIP 권한이 있는 역할) 역시 대상 스키마를 소유하지 않는 한 오브젝트를 관리되는 액세스 스키마로 이동하는 것은 금지됩니다.

오브젝트(테이블, 열 등)의 이름이 바뀌면 그 오브젝트를 참조하는 다른 오브젝트도 새 이름으로 업데이트해야 합니다.

SWAP WITH target_table_name

Swap은 단일 트랜잭션에서 두 테이블의 이름을 바꿉니다.

영구 또는 일시적 테이블을 이 테이블을 만든 사용자 세션의 기간 동안만 지속되는 임시 테이블로 교환할 수 없습니다. 이 제한 사항 덕분에 임시 테이블을 영구 테이블이나 일시적 테이블과 교환하고 기존 영구 테이블 또는 일시적 테이블의 이름이 임시 테이블 이름과 같을 때 발생할 수 있는 명명 충돌이 방지됩니다. 영구 테이블이나 일시적 테이블을 임시 테이블과 교환하려면 다음 세 가지 ALTER TABLE ... RENAME TO 문, 즉 테이블 ac 로, ba 로, 그런 다음 cb 로 이름 바꾸기를 사용하십시오.

참고

테이블 이름을 바꾸거나 두 테이블을 교환하려면 작업을 수행하는 데 사용되는 역할이 테이블에 대해 OWNERSHIP 권한을 가져야 합니다. 또한, 테이블 이름을 바꾸려면 테이블의 스키마에 대한 CREATE TABLE 권한이 필요합니다.

SET ...

테이블에 대해 설정할 하나 이상의 속성/매개 변수를 지정합니다(공백, 쉼표 또는 새 줄로 구분).

DATA_RETENTION_TIME_IN_DAYS = integer

Time Travel용 테이블의 보존 기간을 수정하는 오브젝트 수준 매개 변수입니다. 자세한 내용은 Time Travel 이해 및 사용하기임시 및 일시적 테이블 관련 작업하기 섹션을 참조하십시오.

이 매개 변수에 대한 자세한 설명과 아울러 오브젝트 매개 변수에 대한 자세한 내용은 매개 변수 를 참조하십시오.

값:

  • Standard Edition: 0 또는 1

  • Enterprise Edition:

    • 영구 테이블의 경우 0 ~ 90

    • 임시 테이블과 일시적 테이블의 경우 0 또는 1

참고

0 의 값은 테이블의 Time Travel을 효과적으로 비활성화합니다.

MAX_DATA_EXTENSION_TIME_IN_DAYS = integer

Snowflake가 테이블의 스트림이 부실해지는 것을 방지하기 위해 테이블의 데이터 보존 기간을 연장할 수 있는 최대 일수를 지정하는 오브젝트 매개 변수입니다.

이 매개 변수에 대한 자세한 설명은 MAX_DATA_EXTENSION_TIME_IN_DAYS 섹션을 참조하십시오.

CHANGE_TRACKING = TRUE | FALSE

테이블에서 변경 내용 추적을 활성화 또는 비활성화하도록 지정합니다.

  • TRUE 로 지정하면 테이블에서 변경 내용 추적이 활성화됩니다. 이 옵션을 선택하면 소스 테이블에 숨겨진 열이 여러 개 추가되고 열에 변경 내용 추적 메타데이터가 저장되기 시작합니다. 이러한 열은 소량의 저장소를 사용합니다.

    SELECT 문에 CHANGES 절을 사용하거나 테이블에서 하나 이상의 스트림을 만들고 쿼리하여 변경 내용 추적 메타데이터를 쿼리할 수 있습니다.

  • FALSE 로 지정하면 테이블에서 변경 내용 추적이 비활성화됩니다. 연관된 숨겨진 열이 테이블에서 삭제됩니다.

DEFAULT_DDL_COLLATION = 'collation_specification'

테이블에 추가된 모든 새 열에 대한 기본 데이터 정렬 사양 을 지정합니다.

이 매개 변수를 설정해도 기존 열의 데이터 정렬 사양은 변경되지 않습니다.

매개 변수에 대한 자세한 내용은 DEFAULT_DDL_COLLATION 섹션을 참조하십시오.

ENABLE_SCHEMA_EVOLUTION = { TRUE | FALSE }

다음을 포함하여 원본 파일에서 테이블로 로드된 데이터에서 테이블 스키마에 대한 자동 변경을 활성화하거나 비활성화합니다.

  • 열을 추가했습니다.

    기본적으로 스키마 진화는 로드 작업당 최대 10개의 추가된 열로 제한됩니다. 로드 작업당 추가되는 열을 10개보다 많이 요청하려면 Snowflake 지원팀 에 문의하십시오.

  • 새 데이터 파일에서 누락된 열 수에 상관없이 NOT NULL 제약 조건을 삭제할 수 있습니다.

TRUE 로 설정하면 자동 테이블 스키마 진화가 활성화됩니다. 기본 옵션인 FALSE 를 그대로 사용하면 자동 테이블 스키마 진화가 비활성화됩니다.

참고

파일에서 데이터를 로드하면 다음이 모두 true일 때 테이블 열이 진화합니다.

  • COPY INTO <테이블> 문은 MATCH_BY_COLUMN_NAME 옵션을 포함합니다.

  • 데이터를 로드하는 데 사용되는 역할에는 테이블에 대한 EVOLVE SCHEMA 또는 OWNERSHIP 권한이 있습니다.

또한 CSV를 사용한 스키마 진화의 경우 MATCH_BY_COLUMN_NAMEPARSE_HEADER 와 함께 사용할 때 ERROR_ON_COLUMN_COUNT_MISMATCH 를 false로 설정해야 합니다.

COMMENT = 'string_literal'

테이블에 대한 설명을 추가하거나 기존 설명을 덮어씁니다.

참고

CREATE STAGE, ALTER STAGE, CREATE TABLE 또는 ALTER TABLE 명령을 사용하여 복사 옵션을 지정하지 마십시오. COPY INTO <테이블> 명령을 사용하여 복사 옵션을 지정하는 것이 좋습니다.

UNSET ...

테이블에 대해 설정 해제할 속성/매개 변수를 하나 이상 지정하여 다시 기본값으로 재설정합니다.

  • DATA_RETENTION_TIME_IN_DAYS

  • MAX_DATA_EXTENSION_TIME_IN_DAYS

  • CHANGE_TRACKING

  • DEFAULT_DDL_COLLATION

  • ENABLE_SCHEMA_EVOLUTION

  • COMMENT

클러스터링 작업(clusteringAction)

CLUSTER BY ( expr [ , expr , ... ] )

하나 이상의 테이블 열 또는 열 식을 테이블의 클러스터링 키로 지정(또는 수정)합니다. 자동 클러스터링으로 클러스터링을 유지 관리하는 열/식입니다.

중요

클러스터링 키는 모든 테이블에 대해 의도되거나 권장되지 않으며, 일반적으로 매우 큰(즉, 멀티 테라바이트 크기의) 테이블에 이점이 있습니다.

테이블에 대한 클러스터링 키를 지정하기 전에 Snowflake 테이블 구조 이해하기 를 참조하십시오.

RECLUSTER ...

사용되지 않음

클러스터링 키가 정의된 테이블의 수동 증분 재클러스터링을 수행합니다.

MAX_SIZE = budget_in_bytes

사용되지 않음 — 더 효과적인 수동 재클러스터링을 달성하기 위해 더 큰 웨어하우스 사용

재클러스터할 테이블의 데이터양(바이트)에 대한 상한을 지정합니다.

WHERE condition

테이블의 데이터를 재클러스터할 조건 또는 범위를 지정합니다.

참고

테이블에 대한 OWNERSHIP 또는 INSERT 권한을 가진 역할만 테이블을 재클러스터할 수 있습니다.

SUSPEND | RESUME RECLUSTER

테이블에 대해 자동 클러스터링 을 활성화하거나 비활성화합니다.

DROP CLUSTERING KEY

테이블에 대한 클러스터링 키를 삭제합니다.

클러스터링 키와 재클러스터링에 대한 자세한 내용은 Snowflake 테이블 구조 이해하기 를 참조하십시오.

테이블 열 작업(tableColumnAction)

ADD [ COLUMN ] [ IF NOT EXISTS ] col_name col_data_type . [ DEFAULT default_value | AUTOINCREMENT ... ] . [ inlineConstraint ] [ COLLATE 'collation_specification' ] . [ [ WITH ] MASKING POLICY policy_name ] . [ [ WITH ] PROJECTION POLICY policy_name ] . [ [ WITH ] TAG ( tag_name = 'tag_value' [ , tag_name = 'tag_value' , ... ] ) ] [ , ...]

새 열을 추가합니다. 기본값, 인라인 제약 조건, 데이터 정렬, 마스킹 정책 및/또는 하나 이상의 태그를 지정할 수 있습니다.

추가하는 열의 기본값은 리터럴 값이어야 하며, 식이나 함수에서 반환된 값일 수 없습니다. 예를 들어 다음 명령을 실행하면 예상된 오류가 반환됩니다.

ALTER TABLE t1 ADD COLUMN c5 VARCHAR DEFAULT 12345::VARCHAR;
Copy
002263 (22000): SQL compilation error:
Invalid column default expression [CAST(12345 AS VARCHAR(16777216))]

테이블을 처음 생성할 때 식을 기본값으로 사용할 수 있지만 열을 추가할 때는 사용할 수 없습니다.

열의 기본값은 열의 데이터 타입과 일치해야 합니다. 일치하지 않는 데이터 타입으로 기본값을 설정하려고 하면 오류가 발생하면서 실패합니다. 예:

ALTER TABLE t1 ADD COLUMN c6 DATE DEFAULT '20230101';
Copy
002023 (22000): SQL compilation error:
Expression type does not match column data type, expecting DATE but got VARCHAR(8) for column C6

테이블 열 작업에 대한 자세한 내용은 다음을 참조하십시오.

ADD COLUMN 작업은 똑같은 명령의 여러 열에서 수행할 수 있습니다.

열이 이미 존재하는지 확실하지 않은 경우 열을 추가할 때 IF NOT EXISTS를 지정할 수 있습니다. 열이 이미 존재하는 경우 ADD COLUMN은 기존 열에 아무런 영향도 주지 않으며 오류를 발생시키지 않습니다.

참고

새 열에 대해 다음 중 하나를 지정하는 경우에도 IF NOT EXISTS를 지정할 수 없습니다.

  • DEFAULT, AUTOINCREMENT 또는 IDENTITY

  • UNIQUE, PRIMARY KEY 또는 FOREIGN KEY

RENAME COLUMN col_name to new_col_name

지정된 열의 이름을 현재 테이블의 다른 열에 사용되지 않는 새 이름으로 바꿉니다.

클러스터링 키의 일부인 열의 이름은 바꿀 수 없습니다.

오브젝트(테이블, 열 등)의 이름이 바뀌면 그 오브젝트를 참조하는 다른 오브젝트도 새 이름으로 업데이트해야 합니다.

DROP COLUMN [ IF EXISTS ] col_name [ CASCADE | RESTRICT ]

테이블에서 지정된 열을 제거합니다.

열이 이미 존재하는지 확실하지 않은 경우 열을 삭제할 때 IF EXISTS를 지정할 수 있습니다. 열이 존재하지 않는 경우 DROP COLUMN은 아무런 영향도 주지 않으며 오류를 발생시키지 않습니다.

열 삭제는 메타데이터 전용 작업입니다. 이 작업에서 마이크로 파티션을 즉시 다시 쓰지는 않으므로, 열이 사용하는 공간을 즉시 확보하지는 못합니다. 일반적으로, 개별 마이크로 파티션 내의 공간은 다음에 마이크로 파티션을 다시 쓸 때 확보할 수 있는데, 이는 일반적으로 DML(INSERT, UPDATE, DELETE) 또는 재클러스터링으로 인해 쓰기가 완료될 때입니다.

데이터 메트릭 함수 작업(dataMetricFunctionAction)

DATA_METRIC_SCHEDULE ...

데이터 메트릭 함수를 주기적으로 실행할 일정을 지정합니다.

'num MINUTE'

데이터 메트릭 함수의 실행 사이에 삽입되는 대기 시간의 간격(분)을 지정합니다. 양의 정수만 허용합니다.

또한 num M 구문을 지원합니다.

데이터 메트릭 함수의 경우 5, 15, 30, 60, 720 또는 1440 값 중 하나를 사용합니다.

'USING CRON expr time_zone'

데이터 메트릭 함수를 주기적으로 실행하기 cron 식과 타임존을 지정합니다. 표준 cron 유틸리티 구문의 서브세트를 지원합니다.

타임존 목록은 tz 데이터베이스 타임존 목록 을 참조하십시오.

Cron 식은 다음 필드로 구성되며, 주기 간격은 최소 5분이어야 합니다.

# __________ minute (0-59)
# | ________ hour (0-23)
# | | ______ day of month (1-31, or L)
# | | | ____ month (1-12, JAN-DEC)
# | | | | _ day of week (0-6, SUN-SAT, or L)
# | | | | |
# | | | | |
  * * * * *
Copy

다음 특수 문자가 지원됩니다.

*

와일드카드. 필드의 모든 발생을 지정합니다.

L

“last(마지막)”를 의미합니다. day-of-month(요일) 필드에 사용하면 해당 월의 “마지막 금요일”(“5L”)과 같은 구문을 지정할 수 있습니다. day-of-month 필드에서는 해당 월의 마지막 요일을 지정합니다.

/{n}

주어진 시간 단위의 n번째 인스턴스를 나타냅니다. 시간의 각 양은 독립적으로 계산됩니다. 예를 들어, 월 필드에 4/3 이 지정된 경우 데이터 메트릭 함수는 4월, 7월, 10월(즉, 해당 연도의 4번째 달부터 3개월마다)에 대해 예약됩니다. 다음 해에도 동일한 일정이 유지됩니다. 즉, 데이터 메트릭 함수는 1월(10월 실행 후 3개월)에 실행되도록 예약되지 않습니다.

참고

  • cron 식은 현재 지정된 타임존에 대해서만 계산됩니다. 계정에 대한 TIMEZONE 매개 변수 값을 변경하는 것(또는 사용자 또는 세션 수준에서 값을 설정)은 데이터 메트릭 함수의 타임존을 변경하지는 않습니다.

  • cron 식은 데이터 메트릭 함수에 대한 모든 유효한 실행 시간을 정의합니다. Snowflake는 이 일정을 기준으로 데이터 메트릭 함수를 실행하려 하지만, 그다음의 유효한 실행 시간이 시작되기 전에 이전 실행이 완료되지 않은 경우에는 유효한 실행 시간을 건너뜁니다.

  • 특정 일자와 요일이 cron 식에 포함된 경우, 일자 또는 요일 중 하나를 만족하는 날짜에 데이터 메트릭 함수가 예약됩니다. 예를 들어, DATA_METRIC_SCHEDULE = 'USING CRON 0 0 10-20 * TUE,THU UTC' 는 해당 월의 10일에서 20일 사이에서 0AM에 데이터 메트릭 함수를 예약하고 해당 날짜 이외의 모든 화요일이나 목요일에도 작업을 예약합니다.

  • cron에서 가장 짧은 시간 단위는 분입니다.

    데이터 메트릭 함수가 cron 식에 정의된 분 동안 재개될 경우 데이터 메트릭 함수의 첫 번째 예약 실행은 다음 발생하는 cron 식 인스턴스입니다. 예를 들어, 매일 자정에 실행하도록 예약된 데이터 메트릭 함수(USING CRON 0 0 * * *)가 자정에 5초를 더한 시간(00:00:05)에 재개되는 경우 첫 번째 데이터 메트릭 함수 실행은 다음 자정으로 예약됩니다.

'TRIGGER_ON_CHANGES'

새 행을 삽입하거나 행을 삭제하는 등 DML 작업 으로 테이블을 수정할 때 DMF가 실행되도록 지정합니다.

다음 오브젝트에 대해 'TRIGGER_ON_CHANGES' 를 지정할 수 있습니다.

  • 동적 테이블

  • 외부 테이블

  • Apache Iceberg™ 테이블

  • 일반 테이블

  • 임시 테이블

  • 일시적 테이블

재클러스터링 으로 인해 테이블이 변경되어도 DMF의 실행이 트리거되지 않습니다.

{ ADD | DROP } DATA METRIC FUNCTION metric_name

테이블이나 뷰에 추가하거나 테이블이나 뷰에서 삭제할 데이터 메트릭 함수의 식별자입니다.

ON ( col_name [ , ... ] )

데이터 메트릭 함수를 연결할 테이블 또는 뷰 열입니다. 열의 데이터 타입은 데이터 메트릭 함수 정의에 지정된 열의 데이터 타입과 일치해야 합니다.

[ , metric_name_2 ON ( col_name [ , ... ] ) [ , ... ] ]

테이블이나 뷰에 추가할 추가 데이터 메트릭 함수입니다. 쉼표를 사용하여 각 데이터 메트릭 함수와 지정된 열을 구분합니다.

MODIFY DATA METRIC FUNCTION metric_name

수정할 데이터 메트릭 함수의 식별자입니다.

ON ( col_name [ , ... ] ) { SUSPEND | RESUME }

지정된 열에서 데이터 메트릭 함수를 일시 중단하거나 재개합니다. 테이블이나 뷰에 데이터 메트릭 함수가 설정되면 해당 데이터 메트릭 함수가 일정에 자동으로 포함됩니다.

  • SUSPEND 는 일정에서 데이터 메트릭 함수를 제거합니다.

  • RESUME 은 일시 중단된 날짜 메트릭 함수를 일정으로 다시 가져옵니다.

[ , metric_name_2 ON ( col_name [ , ... ] ) [ , ... ] { SUSPEND | RESUME } ]

추가로 일시 중단 또는 재개할 데이터 메트릭 함수입니다. 쉼표를 사용하여 각 데이터 메트릭 함수와 지정된 열을 구분합니다.

이러한 작업에 대한 액세스 제어 요구 사항에 대한 자세한 내용은 DMF 권한 섹션을 참조하십시오.

외부 테이블 열 작업(extTableColumnAction)

다른 모든 외부 테이블 수정 사항은 ALTER EXTERNAL TABLE 을 참조하십시오.

ADD [ COLUMN ] [ IF NOT EXISTS ] <col_name> <col_type> AS ( <expr> ) [, ...]

외부 테이블에 새 열을 추가합니다.

열이 이미 존재하는지 확실하지 않은 경우 열을 추가할 때 IF NOT EXISTS를 지정할 수 있습니다. 열이 이미 존재하는 경우 ADD COLUMN은 기존 열에 아무런 영향도 주지 않으며 오류를 발생시키지 않습니다.

이 작업은 똑같은 명령의 여러 열에서 수행할 수 있습니다.

col_name

열 식별자(예: 이름)를 지정하는 문자열입니다. 테이블 식별자에 대한 모든 요구 사항은 열 식별자에도 적용됩니다.

자세한 내용은 식별자 요구 사항 섹션을 참조하십시오.

col_type

열의 데이터 타입을 지정하는 문자열(상수)입니다. 데이터 타입은 열에 대한 expr 의 결과와 일치해야 합니다.

테이블 열에 지정할 수 있는 데이터 타입에 대한 자세한 내용은 SQL 데이터 타입 참조 을 참조하십시오.

expr

열에 대한 식을 지정하는 문자열입니다. 쿼리할 때 이 열은 이 식에서 파생된 결과를 반환합니다.

외부 테이블 열은 명시적 식을 사용하여 정의되는 가상 열입니다. VALUE 열 및/또는 METADATA$FILENAME 의사 열을 사용하여 가상 열을 식으로 추가합니다.

VALUE:

외부 파일의 단일 행을 나타내는 VARIANT 타입의 열입니다.

CSV:

VALUE 열은 각 행을 열 위치(즉, {c1: <column_1_value>, c2: <column_2_value>, c3: <column_1_value> ...} )를 기준으로 식별된 요소를 가진 오브젝트로 구조화합니다.

예를 들어 스테이징 상태 CSV 파일의 첫 번째 열을 참조하는 mycol 로 명명된 VARCHAR 열을 추가합니다.

mycol varchar as (value:c1::varchar)
Copy
반정형 데이터:

요소 이름과 값을 큰따옴표로 묶습니다. 점 표기법을 사용하여 VALUE 열에서 경로를 트래버스합니다.

예를 들어 다음 행이 스테이징 상태 파일에서 반정형 데이터의 단일 행을 나타낸다고 가정해보십시오.

{ "a":"1", "b": { "c":"2", "d":"3" } }
Copy

스테이징 상태 파일에서 중첩된 반복 c 요소를 참조하는 mycol 로 명명된 VARCHAR 열을 추가합니다.

mycol varchar as (value:"b"."c"::varchar)
Copy
METADATA$FILENAME:

스테이지의 경로를 포함하여, 외부 테이블에 포함된 각 스테이징된 데이터 파일의 이름을 식별하는 의사 열입니다.

RENAME COLUMN col_name to new_col_name

지정된 열의 이름을 현재 외부 테이블의 다른 열에 사용되지 않는 새 이름으로 바꿉니다.

DROP COLUMN [ IF EXISTS ] col_name

외부 테이블에서 지정된 열을 제거합니다.

열이 이미 존재하는지 확실하지 않은 경우 열을 삭제할 때 IF EXISTS를 지정할 수 있습니다. 열이 존재하지 않는 경우 DROP COLUMN은 아무런 영향도 주지 않으며 오류를 발생시키지 않습니다.

제약 조건 작업(constraintAction)

ADD CONSTRAINT

테이블에 있는 하나 이상의 열에 아웃오브 라인 무결성 제약 조건을 추가합니다. (열에 대한) 인라인 제약 조건을 추가하려면 이 항목에 있는 열 작업 섹션을 참조하십시오.

RENAME CONSTRAINT constraint_name TO new_constraint_name

지정된 제약 조건의 이름을 바꿉니다.

ALTER | MODIFY CONSTRAINT ...

지정된 제약 조건의 속성을 변경합니다.

DROP CONSTRAINT constraint_name | PRIMARY KEY | UNIQUE | FOREIGN KEY ( col_name [ , ... ] ) [ CASCADE | RESTRICT ]

지정된 열 또는 열 세트에 대해 지정된 제약 조건을 삭제합니다.

제약 조건 추가 또는 변경을 위한 자세한 구문과 예는 CREATE | ALTER TABLE … CONSTRAINT 를 참조하십시오.

데이터 거버넌스 정책 및 태그 작업(dataGovnPolicyTagAction)

TAG tag_name = 'tag_value' [ , tag_name = 'tag_value' , ... ]

태그 이름과 태그 문자열 값을 지정합니다.

태그 값은 항상 문자열이며, 태그 값의 최대 문자 수는 256자입니다.

문에서 태그를 지정하는 방법에 대한 자세한 내용은 오브젝트 및 열에 대한 태그 할당량 섹션을 참조하십시오.

policy_name

정책의 식별자로, 스키마에 고유한 식별자여야 합니다.

다음 절은 테이블, 뷰, 이벤트 테이블 등 행 액세스 정책을 지원하는 모든 테이블 종류에 적용됩니다. 단순화하기 위해 해당 절에서는 “테이블”만 참조합니다.

ADD ROW ACCESS POLICY policy_name ON (col_name [ , ... ])

테이블에 행 액세스 정책을 추가합니다.

하나 이상의 열 이름을 지정해야 합니다. 각 열 이름을 구분하는 쉼표로 추가 열을 지정할 수 있습니다. 이 식을 사용하여 이벤트 테이블과 외부 테이블에 모두 행 액세스 정책을 추가합니다.

DROP ROW ACCESS POLICY policy_name

테이블에서 행 액세스 정책을 삭제합니다.

이 절을 사용하여 테이블에서 정책을 삭제합니다.

DROP ROW ACCESS POLICY policy_name, ADD ROW ACCESS POLICY policy_name ON ( col_name [ , ... ] )

테이블에 설정된 행 액세스 정책을 삭제하고 단일 SQL 문으로 동일한 테이블에 행 액세스 정책을 추가합니다.

DROP ALL ROW ACCESS POLICIES

테이블에서 모든 행 액세스 정책 연결을 삭제합니다.

이 식은 스키마에서 행 액세스 정책을 삭제한 후에 이벤트 테이블에서 정책을 삭제할 때 유용합니다. 테이블에서 행 액세스 정책 연결을 삭제하려면 이 식을 사용하십시오.

SET AGGREGATION POLICY policy_name
[ ENTITY KEY (col_name [ , ... ]) ] [ FORCE ]

테이블에 집계 정책 을 할당합니다.

선택적 ENTITY KEY 매개 변수를 사용하여 테이블 내에서 엔터티의 ID를 고유하게 지정하는 열을 정의할 수 있습니다. 자세한 내용은 집계 정책을 사용하여 엔터티 수준 개인정보 보호 구현하기 섹션을 참조하십시오.

기존 집계 정책을 새 집계 정책으로 원자적으로 바꾸려면 선택적 FORCE 매개 변수를 사용하십시오.

UNSET AGGREGATION POLICY

테이블에서 집계 정책을 분리합니다.

{ ALTER | MODIFY } [ COLUMN ] ...
USING ( col_name , cond_col_1 ... )

조건부 마스킹 정책 SQL 식에 전달할 인자를 지정합니다.

목록의 첫 번째 열은 데이터를 마스킹하거나 토큰화할 정책 조건에 대한 열을 지정하며, 마스킹 정책이 설정된 열과 반드시 일치해야 합니다.

추가 열은 첫 번째 열에 대해 쿼리가 수행될 때 쿼리 결과의 각 행에 있는 데이터를 마스킹할지 또는 토큰화할지 결정하기 위해 평가할 열을 지정합니다.

USING 절을 생략하면 Snowflake는 조건부 마스킹 정책을 일반 마스킹 정책 으로 취급합니다.

FORCE

열에 현재 설정된 마스킹 또는 프로젝션 정책을 단일 문에서 다른 정책으로 바꿉니다.

마스킹 정책과 함께 FORCE 키워드를 사용하려면 열에 현재 설정된 마스킹 정책의 데이터 타입(즉, STRING)과 일치하도록 ALTER TABLE 문(즉, STRING)에 있는 정책의 데이터 타입 이 필요합니다.

마스킹 정책이 열에 현재 설정되어 있지 않으면 이 키워드를 지정해도 아무 효과가 없습니다.

자세한 내용은 열의 마스킹 정책 바꾸기 또는 프로젝션 정책 바꾸기 섹션을 참조하십시오.

검색 최적화 작업(searchOptimizationAction)

ADD SEARCH OPTIMIZATION

전체 테이블에 대해, 또는 특정 열에 대해 선택적인 ON 절을 지정하는 경우 검색 최적화 를 추가합니다.

참고:

  • 특히 테이블의 데이터가 자주 변경되는 경우 검색 최적화를 유지 관리하는 비용이 많이 들 수 있습니다. 자세한 내용은 검색 최적화 비용 추정 및 관리 섹션을 참조하십시오.

  • 구체화된 뷰에 검색 최적화를 추가하려고 하면 Snowflake가 오류 메시지를 반환합니다.

ON search_method_with_target [, search_method_with_target ... ]

(전체 테이블이 아니라) 특정 열 또는 VARIANT 필드에 대한 검색 최적화를 구성하도록 지정합니다.

search_method_with_target 의 경우 다음 구문을 가진 식을 사용합니다.

<search_method>( <target> [ , <target> , ... ] [ , ANALYZER => '<analyzer_name>' ] )
Copy

여기서

  • search_method 는 특정 유형의 조건자에 대한 쿼리를 최적화하는 다음 방법 중 하나를 지정합니다.

    검색 방법

    설명

    FULL_TEXT

    VARCHAR(텍스트), VARIANT, ARRAY 및 OBJECT 유형을 사용하는 조건자입니다.

    EQUALITY

    같음 조건자와 IN 조건자.

    SUBSTRING

    하위 문자열 및 정규식과 일치하는 조건자(예: [ NOT ] LIKE, [ NOT ] ILIKE, [ NOT ] RLIKE, REGEXP_LIKE 등)

    GEO

    GEOGRAPHY 유형을 사용하는 조건자.

  • target 은 열, VARIANT 필드 또는 별표(*)를 지정합니다.

    search_method 의 값에 따라 다음 유형 중 하나의 열 또는 VARIANT 필드를 지정할 수 있습니다.

    검색 방법

    지원 대상

    FULL_TEXT

    VARIANTs의 필드에 대한 경로를 포함한 VARCHAR(텍스트), VARIANT, ARRAY 및 OBJECT 데이터 타입의 열.

    EQUALITY

    VARIANTs의 필드에 대한 경로를 포함한 숫자, 문자열, 이진 및 VARIANT 데이터 타입의 열입니다.

    SUBSTRING

    VARIANTs 의 필드 경로를 포함한 문자열 또는 VARIANT 데이터 타입의 열입니다. 위의 EQUALITY 항목에서 설명한 대로 필드 경로를 지정합니다. 중첩된 필드에 대한 검색도 같은 방식으로 개선되었습니다.

    GEO

    GEOGRAPHY 데이터 타입의 열입니다.

    VARIANT 필드를 지정하려면 점 또는 대괄호 표기법 (예: my_column:my_field_name.my_nested_field_name 또는 my_column['my_field_name']['my_nested_field_name'])을 사용하십시오. 콜론으로 구분된 필드 경로(예: my_column:my_field_name:my_nested_field_name)를 사용할 수도 있습니다.

    VARIANT 필드를 지정하면 해당 필드 아래의 모든 중첩 필드에 구성이 적용됩니다. 예를 들어 ON EQUALITY(src:a.b) 를 지정할 경우 다음과 같습니다.

    • 이 구성으로 모든 중첩 필드(예: src:a.b.c, src:a.b.c.d 등)에서 쿼리 on src:a.b 를 개선할 수 있습니다.

    • 이 구성은 src:a.b 접두사(예: src:a, src:z 등)를 사용하지 않는 쿼리에는 영향을 미치지 않습니다.

    테이블에서 적용 가능한 모든 열을 대상으로 지정하려면 별표(*)를 사용하십시오.

    주어진 검색 방법에 대해 별표와 특정 열 이름을 모두 지정할 수는 없습니다. 하지만 다양한 검색 방법에서 별표를 지정할 수 있습니다.

    예를 들어 다음 식을 지정할 수 있습니다.

    -- Allowed
    ON SUBSTRING(*)
    ON EQUALITY(*), SUBSTRING(*), GEO(*)
    
    Copy

    다음 식은 지정할 수 없습니다.

    -- Not allowed
    ON EQUALITY(*, c1)
    ON EQUALITY(c1, *)
    ON EQUALITY(v1:path, *)
    ON EQUALITY(c1), EQUALITY(*)
    
    Copy
  • search_methodFULL_TEXT 인 경우, ANALYZER => 'analyzer_name' 은 텍스트 분석기의 이름을 지정합니다.

    FULL_TEXT 검색 방법을 사용하고 SEARCH 또는 SEARCH_IP 함수로 쿼리를 실행하는 경우 분석기는 검색어와 검색 중인 열의 텍스트를 토큰으로 분리합니다. 검색 문자열에서 추출된 토큰 중 하나가 검색 중인 열이나 필드에서 추출된 토큰과 일치하면 행이 일치하는 것입니다. FULL_TEXT 검색 방법을 사용하지 않거나 SEARCH 또는 SEARCH_IP 함수를 사용하지 않는 쿼리에는 분석기가 적합하지 않습니다.

    분석기는 특정 구분 기호를 발견한 문자열을 끊어 토큰화합니다. 이러한 구분 기호는 결과 토큰에 포함되지 않으며, 빈 토큰은 추출되지 않습니다.

    이 매개 변수는 다음 값 중 하나를 허용합니다.

    • DEFAULT_ANALYZER: 다음 구분 기호를 기준으로 텍스트를 토큰으로 분리합니다.

      문자

      유니코드 코드

      설명

      U+0020

      공백

      [

      U+005B

      왼쪽 대괄호

      ]

      U+005D

      오른쪽 대괄호

      ;

      U+003B

      세미콜론

      <

      U+003C

      보다 작음 기호

      >

      U+003E

      보다 큼 기호

      (

      U+0028

      왼쪽 괄호

      )

      U+0029

      오른쪽 괄호

      {

      U+007B

      왼쪽 중괄호

      }

      U+007D

      오른쪽 중괄호

      |

      U+007C

      세로선

      !

      U+0021

      느낌표

      ,

      U+002C

      쉼표

      '

      U+0027

      아포스트로피

      "

      U+0022

      따옴표

      *

      U+002A

      별표

      &

      U+0026

      앰퍼샌드

      ?

      U+003F

      물음표

      +

      U+002B

      더하기 기호

      /

      U+002F

      슬래시

      :

      U+003A

      콜론

      =

      U+003D

      등호

      @

      U+0040

      @ 기호

      .

      U+002E

      마침표

      -

      U+002D

      하이픈

      $

      U+0024

      달러 기호

      %

      U+0025

      퍼센트 기호

      \

      U+005C

      백슬래시

      _

      U+005F

      밑줄

      \n

      U+000A

      줄 바꿈

      \r

      U+000D

      캐리지 리턴

      \t

      U+0009

      가로 탭

    • UNICODE_ANALYZER: 공백과 특정 구두점 문자를 구분 기호로 처리하는 유니코드 분할 규칙에 따라 토큰화합니다. 이러한 내부 규칙은 (다양한 언어로) 자연어 검색을 할 수 있도록 설계되었습니다. 예를 들어, 기본 분석기는 IP 주소의 마침표와 축약형의 아포스트로피를 구분 기호로 처리하지만 유니코드 분석기는 그렇지 않습니다. 분석기를 사용하여 검색 동작 조정하기 섹션을 참조하십시오.

      유니코드 텍스트 분할 알고리즘에 대한 자세한 내용은 https://unicode.org/reports/tr29/를 참조하십시오.

    • NO_OP_ANALYZER: 데이터나 쿼리 문자열을 토큰화하지 않습니다. 검색어는 대/소문자 일치를 포함하여 열이나 필드의 전체 텍스트와 정확하게 일치해야 하며, 그렇지 않을 경우 SEARCH 함수는 FALSE를 반환합니다. 쿼리 문자열에 여러 가지 토큰(예: 'sky blue')이 포함된 것처럼 보이더라도 열이나 필드가 전체 쿼리 문자열과 정확히 같아야 합니다. 이 경우에는 'sky blue' 만 일치하고 'sky''blue' 는 일치하지 않습니다.

    • ENTITY_ANALYZER: IP 주소 검색을 위해 데이터를 토큰화합니다.

      이 분석기는 SEARCH_IP 함수로 실행되는 쿼리에만 사용됩니다.

한 대상에 둘 이상의 검색 방법을 지정하려면 쉼표를 사용하여 각 후속 방법과 대상을 구분하십시오.

ALTER TABLE t1 ADD SEARCH OPTIMIZATION ON EQUALITY(c1), EQUALITY(c2, c3);
Copy

같은 테이블에서 ALTER TABLE … ADD SEARCH OPTIMIZATION ON … 명령을 여러 번 실행하는 경우 각 후속 명령이 테이블의 기존 구성에 추가됩니다. 예를 들어 다음 명령을 실행한다고 가정하겠습니다.

ALTER TABLE t1 ADD SEARCH OPTIMIZATION ON EQUALITY(c1, c2);
ALTER TABLE t1 ADD SEARCH OPTIMIZATION ON EQUALITY(c3, c4);
Copy

그러면 열 c1, c2, c3, c4에 대한 같음 조건자가 테이블 구성에 추가됩니다. 이는 다음 명령을 실행하는 것과 같습니다.

ALTER TABLE t1 ADD SEARCH OPTIMIZATION ON EQUALITY(c1, c2, c3, c4);
Copy

예는 특정 열의 검색 최적화 활성화하기 을 참조하십시오.

DROP SEARCH OPTIMIZATION

전체 테이블에 대해, 또는 특정 열에서 선택적인 ON 절을 지정하는 경우 검색 최적화 를 제거합니다.

참고:

  • 테이블에 검색 최적화 속성이 있는 경우 테이블을 삭제했다가 삭제를 취소하면 검색 최적화 속성이 유지됩니다.

  • 테이블에서 검색 최적화 속성을 제거한 다음 다시 추가하면 처음 추가할 때와 똑같은 비용이 발생합니다.

ON search_method_with_target | column_name | expression_id [ , ... ]

(전체 테이블에 대해 검색 최적화를 삭제하는 것이 아니라) 특정 열 또는 VARIANT 필드에 대한 검색 최적화 구성을 삭제하도록 지정합니다.

삭제할 열 구성을 식별하려면 다음 중 하나를 지정하십시오.

  • search_method_with_target 의 경우 열 또는 VARIANT 필드가 될 수 있는 하나 이상의 특정 대상에 대한 쿼리를 최적화하는 방법을 지정합니다. 앞서 설명한 구문 을 사용합니다.

  • column_name 의 경우 검색 최적화를 위해 구성된 열의 이름을 지정합니다. 열 이름을 지정하면 열에서 VARIANT 필드를 사용하는 식을 포함하여 해당 열에 대한 모든 식이 삭제됩니다.

  • expression_id 의 경우 DESCRIBE SEARCH OPTIMIZATION 명령의 출력에 나열된 식의 ID를 지정합니다.

이들 중 둘 이상을 지정하려면 항목 사이에 쉼표를 사용하십시오.

대상, 열 이름, 식 ID를 사용하여 검색 방법의 조합을 지정할 수 있습니다.

예는 특정 열의 검색 최적화 삭제하기 을 참조하십시오.

사용법 노트: 일반

  • 테이블에 대한 변경 사항은 해당 테이블에 생성된 뷰에 자동으로 전파되지 않습니다. 예를 들어, 테이블의 열을 삭제하고 해당 열을 포함하도록 뷰가 정의된 경우 뷰가 유효하지 않게 되고 열을 제거하도록 뷰가 조정되지 않습니다.

  • 열을 삭제한다고 해서 열의 저장 공간이 바로 확보되는 것은 아닙니다.

    • 각 마이크로 파티션의 공간은 해당 마이크로 파티션이 다시 작성되어야 회수됩니다. 해당 마이크로 파티션에서 한 개 이상의 행에 대한 쓰기 작업(삽입, 업데이트, 삭제 등)을 통해 마이크로 파티션이 다시 작성됩니다. 공간을 강제로 확보하려면 다음 단계를 따르면 됩니다.

      1. 유지하려는 이전 테이블의 열만 포함하는 새 테이블을 만들려면 CREATE TABLE AS SELECT(CTAS) 문을 사용하십시오.

      2. 이전 테이블에 대해 DATA_RETENTION_TIME_IN_DAYS 매개 변수를 0 으로 설정합니다(선택 사항).

      3. 이전 테이블을 삭제합니다.

    • Time Travel 기능으로 테이블을 보호하는 경우 Time Travel 보존 기간이 만료될 때까지 Time Travel 저장소에서 사용하는 공간이 회수되지 않습니다.

  • 기본값이 있는 새 열이 기존 행이 있는 테이블에 추가되면 기존 행이 전부 기본값으로 채워집니다.

  • 함수가 포함된 기본값을 가진 새 열을 추가하는 기능은 현재 지원되지 않습니다. 다음 오류가 반환됩니다.

    Invalid column default expression (expr)

  • 테이블을 변경하려면 테이블에 대한 소유권 권한을 가진 역할을 사용해야 합니다.

  • 테이블에 클러스터링을 추가하려면 테이블을 포함한 스키마와 데이터베이스에 대한 USAGE 또는 OWNERSHIP 권한도 있어야 합니다.

  • 마스킹 정책의 경우:

    • USING 절과 FORCE 키워드는 모두 선택 사항으로, 둘 중 어떤 것도 열에 대한 마스킹 정책을 설정할 필요가 없습니다. USING 절과 FORCE 키워드는 따로 사용하거나 함께 사용할 수 있습니다. 자세한 내용은 다음을 참조하십시오.

    • 조건부 열을 사용하는 단일 마스킹 정책은 테이블의 열 구조가 정책에 지정된 열과 일치하는 경우 여러 테이블에 적용할 수 있습니다.

    • 마스킹 정책으로 하나 이상의 테이블 열을 수정하거나 행 액세스 정책으로 테이블 자체를 수정할 때, POLICY_CONTEXT 함수를 사용하여, 마스킹 정책으로 보호되는 열과 행 액세스 정책으로 보호되는 테이블에 대한 쿼리를 시뮬레이션합니다.

  • 행 액세스 정책의 경우:

    • Snowflake는 단일 SQL 문에서 행 액세스 정책 추가 및 삭제를 지원합니다.

      예를 들어 테이블에 이미 설정된 행 액세스 정책을 다른 정책으로 바꾸려면 먼저 행 액세스 정책을 삭제한 다음 새 행 액세스 정책을 추가하십시오.

    • 주어진 리소스(즉, 테이블 또는 뷰)의 경우, 행 액세스 정책을 ADD 또는 DROP 하려면 스키마에 대한 APPLY ROW ACCESS POLICY 권한 또는 리소스에 대한 OWNERSHIP 권한과 행 액세스 정책 리소스에 대한 APPLY 권한이 있어야 합니다.

    • 테이블 또는 뷰는 한 번에 하나의 행 액세스 정책으로만 보호할 수 있습니다. 정책 본문이 행 액세스 정책으로 보호되는 테이블 또는 뷰 열이나 마스킹 정책으로 보호되는 열을 참조하는 경우 정책을 추가하는 데 실패합니다.

      마찬가지로, 마스킹 정책 본문이 행 액세스 정책이나 다른 마스킹 정책으로 보호되는 테이블을 참조하는 경우 테이블 열에 마스킹 정책을 추가하는 데 실패합니다.

    • 행 액세스 정책을 시스템 뷰 또는 테이블 함수에 적용할 수 없습니다.

    • 다른 DROP <오브젝트> 작업과 마찬가지로, 행 액세스 정책이 추가되지 않은 리소스에서 행 액세스 정책을 삭제하려고 하면 Snowflake가 오류를 반환합니다.

    • 오브젝트에 행 액세스 정책과 하나 이상의 마스킹 정책이 모두 있는 경우 행 액세스 정책이 먼저 평가됩니다.

  • 외래 키를 생성하는 경우 REFERENCES 절의 열은 기본 키에 대해 나열된 열과 동일한 순서로 나열되어야 합니다. 예:

    CREATE TABLE parent ... CONSTRAINT primary_key_1 PRIMARY KEY (c_1, c_2) ...
    CREATE TABLE child  ... CONSTRAINT foreign_key_1 FOREIGN KEY (...) REFERENCES parent (c_1, c_2) ...
    
    Copy

    두 경우 모두 열의 순서는 c_1, c_2 입니다. 외래 키의 열 순서가 달랐다면(예: c_2, c_1) 외래 키 생성 시도가 실패했을 것입니다.

  • 메타데이터 관련:

    주의

    고객은 Snowflake 서비스를 사용할 때 개인 데이터(사용자 오브젝트 제외), 민감한 데이터, 수출 통제 대상 데이터 또는 기타 규제 데이터가 메타데이터로 입력되지 않도록 해야 합니다. 자세한 내용은 Snowflake의 메타데이터 필드 섹션을 참조하십시오.

  • ALTER TABLE … CHANGE_TRACKING = TRUE

    • 변경 내용 추적을 사용하도록 테이블을 변경하면 작업 기간 동안 테이블이 잠깁니다. 잠금으로 인해 연결된 몇몇 DDL/DML 작업에서 지연이 발생할 수 있습니다. 자세한 내용은 리소스 잠금 섹션을 참조하십시오.

  • 하이브리드 테이블의 인덱스:

    • ALTER TABLE 명령을 사용하여 하이브리드 테이블에 고유 키 또는 외래 키 제약 조건을 추가하거나 삭제하면 해당 인덱스도 생성되거나 삭제됩니다. 하이브리드 테이블의 인덱스에 대한 자세한 내용은 CREATE INDEX 섹션을 참조하십시오.

    • 외래 키 제약 조건은 동일한 데이터베이스에 저장된 하이브리드 테이블에서만 지원됩니다. 한 데이터베이스에서 다른 데이터베이스로 하이브리드 테이블을 이동하는 기능은 지원되지 않습니다. 하이브리드 테이블에 정의된 기본 키, 고유 키 및 외래 키 제약 조건에는 TRUE 로 표시된 RELY 필드가 있습니다.

    • 해당 인덱스가 삭제되기 전에는 인덱스에서 사용하는 열을 삭제할 수 없습니다.

사용법 노트: 데이터 메트릭 함수

테이블에 DMF를 추가합니다.

테이블에 데이터 메트릭 함수를 추가하기 전에 다음을 수행해야 합니다.

  • 데이터 메트릭 함수의 실행 일정을 설정합니다. 자세한 내용은 DATA_METRIC_SCHEDULE 섹션을 참조하십시오.

  • 데이터 메트릭 함수를 호출한 결과를 저장하도록 이벤트 테이블을 구성합니다. 자세한 내용은 DMF 결과 보기 섹션을 참조하십시오.

  • 데이터 메트릭 함수는 공유 테이블이나 뷰에 설정할 수 없으므로 테이블 또는 뷰가 공유에 부여되지 않았는지 확인합니다.

추가로 다음 사항이 적용됩니다.

  • 테이블, 외부 테이블, 뷰 또는 구체화된 뷰에 데이터 메트릭 함수를 추가할 수 있습니다. 동적 테이블 등 다른 종류의 테이블에는 데이터 메트릭 함수를 설정할 수 없습니다.

  • 열을 지정하면 Snowflake는 순서 위치를 사용합니다. 테이블이나 뷰에 데이터 메트릭 함수를 추가한 후 열 이름을 바꾸는 경우 해당 열에 대한 데이터 메트릭 함수의 연결은 유효하게 유지됩니다.

  • 해당 종류의 데이터 메트릭 함수는 열에 하나만 추가할 수 있습니다. 예를 들어, NULL_COUNT 데이터 메트릭 함수를 단일 열에 두 번 추가할 수 없습니다.

  • 열을 참조하는 데이터 메트릭 함수를 추가한 후 열을 삭제하면 Snowflake가 해당 데이터 메트릭 함수를 평가할 수 없습니다.

  • 가상 열 참조는 지원되지 않습니다.

테이블에서 DMF를 삭제합니다.
  • 테이블에서 데이터 메트릭 함수를 삭제한 다음 DROP FUNCTION 명령을 사용하여 시스템에서 데이터 메트릭 함수를 제거합니다.

  • DATA_METRIC_FUNCTION_REFERENCES 함수를 사용하여 테이블을 식별하고 데이터 메트릭 함수가 설정된 오브젝트를 볼 수 있습니다.

DMF 예약하기

일정을 설정한 후 일정이 적용되기까지 10분이 걸립니다.

마찬가지로, DMF를 설정 취소하면 예약 변경이 적용되기까지 10분이 걸립니다. 자세한 내용은 실행할 DMFs 예약 섹션을 참조하십시오.

다음 섹션에서는 ALTER COLUMN 명령을 사용하는 예를 제시합니다.

테이블 이름 바꾸기

다음을 통해 t1 이라는 테이블을 생성합니다.

CREATE OR REPLACE TABLE t1(a1 number);
Copy
SHOW TABLES LIKE 't1';
Copy
+-------------------------------+------+---------------+-------------+-------+---------+------------+------+-------+--------+----------------+-----------------+-------------+-------------------------+-----------------+----------+--------+
| created_on                    | name | database_name | schema_name | kind  | comment | cluster_by | rows | bytes | owner  | retention_time | change_tracking | is_external | enable_schema_evolution | owner_role_type | is_event | budget |
|-------------------------------+------+---------------+-------------+-------+---------+------------+------+-------+--------+----------------+-----------------+-------------+-------------------------+-----------------+----------+--------|
| 2023-10-19 10:37:04.858 -0700 | T1   | TESTDB        | MY_SCHEMA   | TABLE |         |            |    0 |     0 | PUBLIC | 1              | OFF             | N           | N                       | ROLE            | N        | NULL   |
+-------------------------------+------+---------------+-------------+-------+---------+------------+------+-------+--------+----------------+-----------------+-------------+-------------------------+-----------------+----------+--------+

다음 문은 테이블 이름을 tt1 로 변경합니다.

ALTER TABLE t1 RENAME TO tt1;
Copy
SHOW TABLES LIKE 'tt1';
Copy
+-------------------------------+------+---------------+-------------+-------+---------+------------+------+-------+--------+----------------+-----------------+-------------+-------------------------+-----------------+----------+--------+
| created_on                    | name | database_name | schema_name | kind  | comment | cluster_by | rows | bytes | owner  | retention_time | change_tracking | is_external | enable_schema_evolution | owner_role_type | is_event | budget |
|-------------------------------+------+---------------+-------------+-------+---------+------------+------+-------+--------+----------------+-----------------+-------------+-------------------------+-----------------+----------+--------|
| 2023-10-19 10:37:04.858 -0700 | TT1  | TESTDB        | MY_SCHEMA   | TABLE |         |            |    0 |     0 | PUBLIC | 1              | OFF             | N           | N                       | ROLE            | N        | NULL   |
+-------------------------------+------+---------------+-------------+-------+---------+------------+------+-------+--------+----------------+-----------------+-------------+-------------------------+-----------------+----------+--------+

테이블 바꾸기

다음 문은 t1t2 라는 테이블을 생성합니다.

CREATE OR REPLACE TABLE t1(a1 NUMBER, a2 VARCHAR, a3 DATE);
CREATE OR REPLACE TABLE t2(b1 VARCHAR);
Copy
DESC TABLE t1;
Copy
+------+-------------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+
| name | type              | kind   | null? | default | primary key | unique key | check | expression | comment | policy name |
|------+-------------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------|
| A1   | NUMBER(38,0)      | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        |
| A2   | VARCHAR(16777216) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        |
| A3   | DATE              | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        |
+------+-------------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+
DESC TABLE t2;
Copy
+------+-------------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+
| name | type              | kind   | null? | default | primary key | unique key | check | expression | comment | policy name |
|------+-------------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------|
| B1   | VARCHAR(16777216) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        |
+------+-------------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+

다음 문은 테이블 t1 을 테이블 t2 로 바꿉니다.

ALTER TABLE t1 SWAP WITH t2;
Copy
DESC TABLE t1;
Copy
+------+-------------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+
| name | type              | kind   | null? | default | primary key | unique key | check | expression | comment | policy name |
|------+-------------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------|
| B1   | VARCHAR(16777216) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        |
+------+-------------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+
DESC TABLE t2;
Copy
+------+-------------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+
| name | type              | kind   | null? | default | primary key | unique key | check | expression | comment | policy name |
|------+-------------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------|
| A1   | NUMBER(38,0)      | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        |
| A2   | VARCHAR(16777216) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        |
| A3   | DATE              | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        |
+------+-------------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+

열 추가하기

다음을 통해 t1 이라는 테이블을 생성합니다.

CREATE OR REPLACE TABLE t1(a1 NUMBER);
Copy
DESC TABLE t1;
Copy
+------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+
| name | type         | kind   | null? | default | primary key | unique key | check | expression | comment | policy name |
|------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------|
| A1   | NUMBER(38,0) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        |
+------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+

다음 문은 이 테이블에 a2 라는 열을 추가합니다.

ALTER TABLE t1 ADD COLUMN a2 NUMBER;
Copy

다음 문은 NOT NULL 제약 조건이 있는 a3 이라는 열을 추가합니다.

ALTER TABLE t1 ADD COLUMN a3 NUMBER NOT NULL;
Copy

다음 문은 기본값과 NOT NULL 제약 조건이 있는 a4 이라는 열을 추가합니다.

ALTER TABLE t1 ADD COLUMN a4 NUMBER DEFAULT 0 NOT NULL;
Copy

다음 문은 언어별 데이터 정렬 사양 이 있는 a5 라는 VARCHAR 열을 추가합니다.

ALTER TABLE t1 ADD COLUMN a5 VARCHAR COLLATE 'en_US';
Copy
DESC TABLE t1;
Copy
+------+-----------------------------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+
| name | type                              | kind   | null? | default | primary key | unique key | check | expression | comment | policy name |
|------+-----------------------------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------|
| A1   | NUMBER(38,0)                      | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        |
| A2   | NUMBER(38,0)                      | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        |
| A3   | NUMBER(38,0)                      | COLUMN | N     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        |
| A4   | NUMBER(38,0)                      | COLUMN | N     | 0       | N           | N          | NULL  | NULL       | NULL    | NULL        |
| A5   | VARCHAR(16777216) COLLATE 'en_us' | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        |
+------+-----------------------------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+

다음 문은 열이 존재하지 않는 경우에만 IF NOT EXISTS 절을 사용하여 a2 라는 열을 추가합니다. a2 라는 기존 열이 있습니다. IF NOT EXISTS 절을 지정하면 이 문이 오류로 인해 실패하는 것을 방지할 수 있습니다.

ALTER TABLE t1 ADD COLUMN IF NOT EXISTS a2 NUMBER;
Copy

DESCRIBE TABLE 명령의 출력에 표시된 것처럼, 위 문은 a2 라는 기존 열에 영향을 주지 않습니다.

DESC TABLE t1;
Copy
+------+-----------------------------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+
| name | type                              | kind   | null? | default | primary key | unique key | check | expression | comment | policy name |
|------+-----------------------------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------|
| A1   | NUMBER(38,0)                      | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        |
| A2   | NUMBER(38,0)                      | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        |
| A3   | NUMBER(38,0)                      | COLUMN | N     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        |
| A4   | NUMBER(38,0)                      | COLUMN | N     | 0       | N           | N          | NULL  | NULL       | NULL    | NULL        |
| A5   | VARCHAR(16777216) COLLATE 'en_us' | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        |
+------+-----------------------------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+

열 이름 바꾸기

다음 문은 열 a1 의 이름을 b1 로 변경합니다.

ALTER TABLE t1 RENAME COLUMN a1 TO b1;
Copy
DESC TABLE t1;
Copy
+------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+
| name | type         | kind   | null? | default | primary key | unique key | check | expression | comment | policy name |
|------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------|
| B1   | NUMBER(38,0) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        |
| A2   | NUMBER(38,0) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        |
| A3   | NUMBER(38,0) | COLUMN | N     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        |
| A4   | NUMBER(38,0) | COLUMN | N     | 0       | N           | N          | NULL  | NULL       | NULL    | NULL        |
+------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+

열 삭제하기

다음 문은 a2 열을 삭제합니다.

ALTER TABLE t1 DROP COLUMN a2;
Copy
DESC TABLE t1;
Copy
+------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+
| name | type         | kind   | null? | default | primary key | unique key | check | expression | comment | policy name |
|------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------|
| B1   | NUMBER(38,0) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        |
| A3   | NUMBER(38,0) | COLUMN | N     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        |
| A4   | NUMBER(38,0) | COLUMN | N     | 0       | N           | N          | NULL  | NULL       | NULL    | NULL        |
+------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+

다음 문은 열이 존재하는 경우에만 IF EXISTS 절을 사용하여 a2 라는 열을 삭제합니다. a2 라는 기존 열이 없습니다. IF EXISTS 절을 지정하면 이 문이 오류로 인해 실패하는 것을 방지할 수 있습니다.

ALTER TABLE t1 DROP COLUMN IF EXISTS a2;
Copy

DESCRIBE TABLE 명령의 출력에 표시된 것처럼, 위 문은 기존 테이블에 영향을 주지 않습니다.

+------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+
| name | type         | kind   | null? | default | primary key | unique key | check | expression | comment | policy name |
|------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------|
| B1   | NUMBER(38,0) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        |
| A3   | NUMBER(38,0) | COLUMN | N     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        |
| A4   | NUMBER(38,0) | COLUMN | N     | 0       | N           | N          | NULL  | NULL       | NULL    | NULL        |
+------+--------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+
Copy

외부 테이블에 열 추가하기, 이름 바꾸기 및 삭제하기

다음 문은 exttable1 이라는 외부 테이블을 생성합니다.

CREATE EXTERNAL TABLE exttable1
  LOCATION=@mystage/logs/
  AUTO_REFRESH = true
  FILE_FORMAT = (TYPE = PARQUET)
  ;
Copy
DESC EXTERNAL TABLE exttable1;
Copy
+-----------+-------------------+-----------+-------+---------+-------------+------------+-------+----------------------------------------------------------+-----------------------+
| name      | type              | kind      | null? | default | primary key | unique key | check | expression                                               | comment               |
|-----------+-------------------+-----------+-------+---------+-------------+------------+-------+----------------------------------------------------------+-----------------------|
| VALUE     | VARIANT           | COLUMN    | Y     | NULL    | N           | N          | NULL  | NULL                                                     | The value of this row |
+-----------+-------------------+-----------+-------+---------+-------------+------------+-------+----------------------------------------------------------+-----------------------+

다음 문은 외부 테이블에 a1 이라는 새 열을 추가합니다.

ALTER TABLE exttable1 ADD COLUMN a1 VARCHAR AS (value:a1::VARCHAR);
Copy
DESC EXTERNAL TABLE exttable1;
Copy
+-----------+-------------------+-----------+-------+---------+-------------+------------+-------+----------------------------------------------------------+-----------------------+
| name      | type              | kind      | null? | default | primary key | unique key | check | expression                                               | comment               |
|-----------+-------------------+-----------+-------+---------+-------------+------------+-------+----------------------------------------------------------+-----------------------|
| VALUE     | VARIANT           | COLUMN    | Y     | NULL    | N           | N          | NULL  | NULL                                                     | The value of this row |
| A1        | VARCHAR(16777216) | VIRTUAL   | Y     | NULL    | N           | N          | NULL  | TO_CHAR(GET(VALUE, 'a1'))                                | NULL                  |
+-----------+-------------------+-----------+-------+---------+-------------+------------+-------+----------------------------------------------------------+-----------------------+

다음 문은 a1 열의 이름을 b1 로 변경합니다.

ALTER TABLE exttable1 RENAME COLUMN a1 TO b1;
Copy
DESC EXTERNAL TABLE exttable1;
Copy
+-----------+-------------------+-----------+-------+---------+-------------+------------+-------+----------------------------------------------------------+-----------------------+
| name      | type              | kind      | null? | default | primary key | unique key | check | expression                                               | comment               |
|-----------+-------------------+-----------+-------+---------+-------------+------------+-------+----------------------------------------------------------+-----------------------|
| VALUE     | VARIANT           | COLUMN    | Y     | NULL    | N           | N          | NULL  | NULL                                                     | The value of this row |
| B1        | VARCHAR(16777216) | VIRTUAL   | Y     | NULL    | N           | N          | NULL  | TO_CHAR(GET(VALUE, 'a1'))                                | NULL                  |
+-----------+-------------------+-----------+-------+---------+-------------+------------+-------+----------------------------------------------------------+-----------------------+

다음 문은 b1 이라는 열을 삭제합니다.

ALTER TABLE exttable1 DROP COLUMN b1;
Copy
DESC EXTERNAL TABLE exttable1;
Copy
+-----------+-------------------+-----------+-------+---------+-------------+------------+-------+----------------------------------------------------------+-----------------------+
| name      | type              | kind      | null? | default | primary key | unique key | check | expression                                               | comment               |
|-----------+-------------------+-----------+-------+---------+-------------+------------+-------+----------------------------------------------------------+-----------------------|
| VALUE     | VARIANT           | COLUMN    | Y     | NULL    | N           | N          | NULL  | NULL                                                     | The value of this row |
+-----------+-------------------+-----------+-------+---------+-------------+------------+-------+----------------------------------------------------------+-----------------------+

클러스터링 키 순서 변경하기

다음 문은 iddate 열로 클러스터링되는 t1 이라는 테이블을 생성합니다.

CREATE OR REPLACE TABLE T1 (id NUMBER, date TIMESTAMP_NTZ, name STRING) CLUSTER BY (id, date);
Copy
SHOW TABLES LIKE 'T1';
Copy
---------------------------------+------+---------------+-------------+-------+---------+------------+------+-------+--------------+----------------+
           created_on            | name | database_name | schema_name | kind  | comment | cluster_by | rows | bytes |    owner     | retention_time |
---------------------------------+------+---------------+-------------+-------+---------+------------+------+-------+--------------+----------------+
 Tue, 21 Jun 2016 15:42:12 -0700 | T1   | TESTDB        | TESTSCHEMA  | TABLE |         | (ID,DATE)  | 0    | 0     | ACCOUNTADMIN | 1              |
---------------------------------+------+---------------+-------------+-------+---------+------------+------+-------+--------------+----------------+

다음 문은 클러스터링 키의 순서를 변경합니다.

ALTER TABLE t1 CLUSTER BY (date, id);
Copy
SHOW TABLES LIKE 'T1';
Copy
---------------------------------+------+---------------+-------------+-------+---------+------------+------+-------+--------------+----------------+
           created_on            | name | database_name | schema_name | kind  | comment | cluster_by | rows | bytes |    owner     | retention_time |
---------------------------------+------+---------------+-------------+-------+---------+------------+------+-------+--------------+----------------+
 Tue, 21 Jun 2016 15:42:12 -0700 | T1   | TESTDB        | TESTSCHEMA  | TABLE |         | (DATE,ID)  | 0    | 0     | ACCOUNTADMIN | 1              |
---------------------------------+------+---------------+-------------+-------+---------+------------+------+-------+--------------+----------------+

행 액세스 정책 추가 및 삭제하기

다음은 단일 열을 지정하는 동안 테이블에 행 액세스 정책을 추가하는 예입니다. 정책을 설정한 후, 정보 스키마 를 검사하여 확인할 수 있습니다.

alter table t1 add row access policy rap_t1 on (empl_id);
Copy

다음은 단일 테이블에 두 개의 열을 지정하는 동안 행 액세스 정책을 추가하는 예입니다.

alter table t1
  add row access policy rap_test2 on (cost, item);
Copy

다음은 테이블에서 행 액세스 정책을 삭제하는 예입니다. 정보 스키마 를 쿼리하여 정책이 삭제되었음을 확인합니다.

alter table t1 drop row access policy rap_v1;
Copy

다음은 테이블에 대한 단일 SQL 문에서 행 액세스 정책 추가 및 삭제를 결합하는 방법을 보여주는 예입니다. 정보 스키마 를 검사하여 결과를 확인합니다.

alter table t1
  drop row access policy rap_t1_version_1,
  add row access policy rap_t1_version_2 on (empl_id);
Copy

데이터 메트릭 함수 실행 예약

데이터 메트릭 함수 일정을 5분마다 실행되도록 설정합니다.

ALTER TABLE hr.tables.empl_info SET
  DATA_METRIC_SCHEDULE = '5 MINUTE';
Copy

데이터 메트릭 함수 일정을 매일 AM 8:00에 실행되도록 설정합니다.

ALTER TABLE hr.tables.empl_info SET
  DATA_METRIC_SCHEDULE = 'USING CRON 0 8 * * * UTC';
Copy

데이터 메트릭 함수 일정을 평일 AM 8:00에만 실행되도록 설정합니다.

ALTER TABLE hr.tables.empl_info SET
  DATA_METRIC_SCHEDULE = 'USING CRON 0 8 * * MON,TUE,WED,THU,FRI UTC';
Copy

데이터 메트릭 함수 일정을 매일 UTC 0600, 1200, 1800에 3회 실행되도록 설정합니다.

ALTER TABLE hr.tables.empl_info SET
  DATA_METRIC_SCHEDULE = 'USING CRON 0 6,12,18 * * * UTC';
Copy

새 행 삽입과 같은 일반 DML 작업으로 테이블이 수정될 때 데이터 메트릭 함수가 실행되도록 설정합니다.

ALTER TABLE hr.tables.empl_info SET
  DATA_METRIC_SCHEDULE = 'TRIGGER_ON_CHANGES';
Copy