ALTER TABLE … ALTER COLUMN

이 항목에서는 ALTER TABLE 문에서 ALTER COLUMN 절을 사용하여 테이블에 대한 하나 이상의 열 속성을 수정하는 방법을 설명합니다.

다음 표에 열 속성 수정을 위해 지원되거나 지원되지 않는 동작을 설명되어 있습니다.

동작

지원됨

지원 안 됨

참고

기본값

열의 기본값을 삭제합니다(즉, DROP DEFAULT).

열과 기본값이 ALTER TABLE 명령으로 정의된 경우 허용되지 않습니다. 자세한 내용은 아래의 사용법 노트 를 참조하십시오.

열의 기본 시퀀스(즉, SET DEFAULT seq_name.NEXTVAL)를 변경합니다.

이미 시퀀스가 있는 열에만 사용합니다.

기본값이 시퀀스가 아닌 경우 열의 기본값을 변경합니다.

열의 기본값을 추가합니다.

Null 허용 여부

열의 Null 허용 여부를 변경합니다(즉 SET NOT NULL 또는 DROP NOT NULL).

데이터 타입

데이터 타입 을 밀접하게 같은 형식으로 변경합니다(예: STRING 에서 VARCHAR 로).

데이터 타입 을 다른 형식으로 변경합니다(예: STRING 에서 NUMBER 로).

텍스트/문자열 열 의 길이를 늘립니다(예: VARCHAR(50) 에서 VARCHAR(100) 으로).

텍스트/문자열 열 의 길이를 줄입니다(예: VARCHAR(50) 에서 VARCHAR(25) 로).

숫자 열 의 정밀도를 높입니다(예: NUMBER(10,2) 에서 NUMBER(20,2) 로).

숫자 열 의 정밀도를 낮춥니다(예: NUMBER(20,2) 에서 NUMBER(10,2) 로).

새 정밀도가 현재 열에 있는 모든 값을 유지하기에 충분한 경우에만 허용됩니다. 또한, 정밀도를 낮추면 Time Travel에 영향을 줄 수 있습니다(자세한 내용은 사용법 노트 참조).

숫자 열 의 배율을 변경합니다(예: NUMBER(10,2) 에서 NUMBER(10,4) 로).

설명

열에 대한 설명을 설정하거나 설정을 해제합니다.

마스킹 정책

열에 대한 마스킹 정책 을 설정하거나 설정 해제합니다.

오브젝트 태깅

열에서 태그 설정 또는 설정 해제

열은 최대 20개의 태그를 지원할 수 있으며 태그 문자열 값의 최대 문자 수는 256자입니다.

참고 항목:

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

구문

ALTER TABLE <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> ... ]
                                          [ , ... ]
                                      [ ) ]

ALTER TABLE <name> { ALTER | MODIFY } COLUMN <col1_name> SET MASKING POLICY <policy_name> [ USING ( <col1_name> , cond_col_1 , ... ) ]
                                                                                          [ FORCE ]

ALTER TABLE <name> { ALTER | MODIFY } COLUMN <col1_name> UNSET MASKING POLICY

ALTER TABLE <name> { 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 TABLE <name> { ALTER | MODIFY }
                                       COLUMN <col1_name> UNSET TAG <tag_name> [ , <tag_name> ... ]
                                     , COLUMN <col2_name> UNSET TAG <tag_name> [ , <tag_name> ... ]
                                     ...
Copy

사용법 노트

  • 단일 ALTER TABLE 문을 사용하여 테이블의 여러 열을 수정할 수 있습니다. 각 변경 사항은 쉼표로 구분하여 수정할 열과 열 속성으로 구성된 절로 지정됩니다.

    • ALTER 또는 MODIFY 키워드를 사용하여 문의 절 목록(즉, 수정할 열/속성)을 시작합니다.

    • 괄호를 사용해 절을 그룹화할 수 있지만, 필수 사항은 아닙니다.

    • 각 절에 COLUMN 키워드를 지정할 수 있지만, 필수 사항은 아닙니다.

    • 절은 어떤 순서로든 지정할 수 있습니다.

  • 열을 NOT NULL 로 설정할 때 열에 NULL 값이 포함되어 있으면 오류가 반환되고 열에 아무런 변경 사항도 적용되지 않습니다.

  • 반정형 데이터 타입(ARRAY, OBJECT, VARIANT)을 사용하는 열은 테이블이 비어 있는 경우를 제외하고는 NOT NULL 로 설정할 수 없습니다. 테이블에 행이 포함된 경우 이러한 열을 NOT NULL 로 설정하는 것은 지원되지 않으며 오류가 발생합니다.

  • 열의 기본 시퀀스를 변경하려면 열에 기본 시퀀스가 이미 있어야 합니다. ALTER TABLE ... SET DEFAULT <seq_name> 명령을 사용하여 아직 시퀀스가 없는 열에 시퀀스를 추가할 수 없습니다.

  • DEFAULT 값이 있는 열을 추가하도록 테이블을 변경하면 해당 열의 기본값을 삭제할 수 없습니다. 예를 들어, 다음 문 시퀀스에서 마지막 ALTER TABLE ... ALTER COLUMN 문은 오류를 발생시킵니다.

    CREATE TABLE t(x INT);
    INSERT INTO t VALUES (1), (2), (3);
    ALTER TABLE t ADD COLUMN y INT DEFAULT 100;
    INSERT INTO t(x) VALUES (4), (5), (6);
    
    ALTER TABLE t ALTER COLUMN y DROP DEFAULT;
    
    Copy

    이 제한은 열이 추가되기 전에 삽입된 행의 값과 열이 추가된 후에 삽입된 행 사이의 불일치를 방지합니다. 기본값이 삭제된 경우 열에는 다음이 포함됩니다.

    • 열이 추가되기 전에 삽입된 행의 NULL 값입니다.

    • 열이 추가된 후에 행의 기본값이 삽입되었습니다.

    테이블 복제본에서 열 기본값을 삭제하는 작업도 수행할 수 없습니다.

  • 열에 대해 TYPE 을 설정할 때 지정된 형식(즉, type)은 NUMBER 또는 텍스트 데이터 타입 (VARCHAR, STRING, TEXT 등)이어야 합니다.

    • NUMBER 데이터 타입의 경우 TYPE 을 사용해 다음을 수행할 수 있습니다.

      • 지정된 숫자 열의 정밀도를 높입니다.

      • 새 정밀도가 현재 열에 있는 모든 데이터 값을 유지하기에 충분한 경우 지정된 숫자 열의 정밀도를 낮춥니다.

    • 텍스트 데이터 타입의 경우 열 길이를 늘리는 데는 TYPE 만 사용할 수 있습니다.

  • 열의 정밀도가 Time Travel에 보관된 모든 열 데이터의 최대 정밀도 미만으로 감소하면 먼저 정밀도부터 높여야 테이블을 복원할 수 있습니다.

  • 마스킹 정책의 경우:

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

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

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

  • 메타데이터 관련(예: COMMENT 필드):

    주의

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

설정 예:

CREATE OR REPLACE TABLE t1 (
   c1 NUMBER NOT NULL,
   c2 NUMBER DEFAULT 3,
   c3 NUMBER DEFAULT seq1.nextval,
   c4 VARCHAR(20) DEFAULT 'abcde',
   c5 STRING);

DESC TABLE t1;

+------+-------------------+--------+-------+-------------------------+-------------+------------+-------+------------+---------+
| name | type              | kind   | null? | default                 | primary key | unique key | check | expression | comment |
|------+-------------------+--------+-------+-------------------------+-------------+------------+-------+------------+---------|
| C1   | NUMBER(38,0)      | COLUMN | N     | NULL                    | N           | N          | NULL  | NULL       | NULL    |
| C2   | NUMBER(38,0)      | COLUMN | Y     | 3                       | N           | N          | NULL  | NULL       | NULL    |
| C3   | NUMBER(38,0)      | COLUMN | Y     | DB1.PUBLIC.SEQ1.NEXTVAL | N           | N          | NULL  | NULL       | NULL    |
| C4   | VARCHAR(20)       | COLUMN | Y     | 'abcde'                 | N           | N          | NULL  | NULL       | NULL    |
| C5   | VARCHAR(16777216) | COLUMN | Y     | NULL                    | N           | N          | NULL  | NULL       | NULL    |
+------+-------------------+--------+-------+-------------------------+-------------+------------+-------+------------+---------+
Copy

t1 에 대해 다음과 같이 변경합니다.

  • NOT NULL 열 c1 을 NULL로 변경합니다.

  • c2 의 기본값을 삭제하고 열 c3 의 기본 시퀀스를 변경합니다.

  • c4 의 길이를 늘리고 열의 기본값을 삭제합니다.

  • c5 에 대한 설명을 추가합니다.

ALTER TABLE t1 ALTER COLUMN c1 DROP NOT NULL;

ALTER TABLE t1 MODIFY c2 DROP DEFAULT, c3 SET DEFAULT seq5.nextval ;

ALTER TABLE t1 ALTER c4 SET DATA TYPE VARCHAR(50), COLUMN c4 DROP DEFAULT;

ALTER TABLE t1 ALTER c5 COMMENT '50 character column';

DESC TABLE t1;

+------+-------------------+--------+-------+-------------------------+-------------+------------+-------+------------+---------------------+
| name | type              | kind   | null? | default                 | primary key | unique key | check | expression | comment             |
|------+-------------------+--------+-------+-------------------------+-------------+------------+-------+------------+---------------------|
| C1   | NUMBER(38,0)      | COLUMN | Y     | NULL                    | N           | N          | NULL  | NULL       | NULL                |
| C2   | NUMBER(38,0)      | COLUMN | Y     | NULL                    | N           | N          | NULL  | NULL       | NULL                |
| C3   | NUMBER(38,0)      | COLUMN | Y     | DB1.PUBLIC.SEQ5.NEXTVAL | N           | N          | NULL  | NULL       | NULL                |
| C4   | VARCHAR(50)       | COLUMN | Y     | NULL                    | N           | N          | NULL  | NULL       | NULL                |
| C5   | VARCHAR(16777216) | COLUMN | Y     | NULL                    | N           | N          | NULL  | NULL       | 50 character column |
+------+-------------------+--------+-------+-------------------------+-------------+------------+-------+------------+---------------------+
Copy

이전 예와 같지만, 명령의 다목적성/유연성을 설명하기 위해 다음과 같이 변경했습니다.

  • 모든 작업이 단일 ALTER COLUMN 절에서 실행됩니다.

  • 절 내부의 열 순서가 다릅니다.

  • SET DATA TYPE 을 간단히 TYPE 으로 줄였습니다.

ALTER TABLE t1 ALTER (
   c1 DROP NOT NULL,
   c5 COMMENT '50 character column',
   c4 TYPE VARCHAR(50),
   c2 DROP DEFAULT,
   COLUMN c4 DROP DEFAULT,
   COLUMN c3 SET DEFAULT seq5.nextval
  );
Copy

이 예는 똑같은 결과를 냅니다.

테이블 열에 열 수준 보안 마스킹 정책을 적용합니다.

-- single column

ALTER TABLE empl_info MODIFY COLUMN empl_id SET MASKING POLICY mask_empl_id;

-- multiple columns

ALTER TABLE empl_info MODIFY
    COLUMN empl_id SET MASKING POLICY mask_empl_id
  , COLUMN empl_dob SET MASKING POLICY mask_empl_dob
;
Copy

테이블 열에서 열 수준 보안 마스킹 정책을 설정 해제합니다.

-- single column

ALTER TABLE empl_info modify column empl_id unset masking policy;

-- multiple columns

ALTER TABLE empl_info MODIFY
    COLUMN empl_id UNSET MASKING POLICY
  , COLUMN empl_dob UNSET MASKING POLICY
;
Copy