ALTER TABLE …

ALTER TABLE … (열 수정)

기존 테이블의 열(column) 속성을 수정하는 명령이에요. 열의 기본값, NULL 허용 여부, 데이터 타입, 주석, 마스킹 정책, 프로젝션 정책, 태그 등을 변경할 수 있어요.

출처: 문서

본문

관련 명령: ALTER TABLE, CREATE TABLE, DROP TABLE, SHOW TABLES, DESCRIBE TABLE

아래 표는 열 속성 수정의 지원/미지원 동작을 설명해요.

작업 지원 미지원 설명
기본값
열의 기본값 제거 (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))
바이너리 문자열 열 길이 증가 (예: BINARY(50) → BINARY(100))
바이너리 문자열 열 길이 감소 (예: BINARY(50) → BINARY(25))
숫자 열 정밀도 증가 (예: NUMBER(10,2) → NUMBER(20,2))
숫자 열 정밀도 감소 (예: NUMBER(20,2) → NUMBER(10,2)) 새 정밀도가 현재 열의 모든 값을 담을 수 있는 경우에만 허용돼요. 또한 정밀도를 줄이면 Time Travel에 영향을 줄 수 있어요.
숫자 열 스케일 변경 (예: NUMBER(10,2) → NUMBER(10,4))
주석
열의 주석 설정 또는 해제
마스킹 정책
열에 마스킹 정책 설정 또는 해제
프로젝션 정책
열에 프로젝션 정책 설정 또는 해제
객체 태깅
열에 태그 설정 또는 해제 열은 최대 20개 태그를 지원하며, 태그 문자열 값의 최대 문자 수는 256이에요.

구문 (Syntax)

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 ] dataGovnPolicyTagAction

사용 메모 (Usage notes)

  • 하나의 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;

이 제한은 열이 추가되기 전에 삽입된 행과 추가된 후에 삽입된 행의 값 사이의 불일치를 방지해요. 기본값을 제거하면 열에는 다음이 포함될 거예요:

  • 열이 추가되기 전에 삽입된 행에 대해 NULL 값.
  • 열이 추가된 후에 삽입된 행에 대해 기본값.

테이블의 모든 클론에서도 기본 열 값을 제거하는 것이 금지돼요.

  • 열의 TYPE을 설정할 때 지정된 타입(type)은 NUMBER 또는 텍스트 데이터 타입(VARCHAR, STRING, TEXT 등)이어야 해요.
  • NUMBER 데이터 타입의 경우 TYPE으로 다음을 수행할 수 있어요:
    • 지정된 숫자 열의 정밀도를 증가.
    • 새 정밀도가 현재 열의 모든 데이터 값을 담을 수 있으면 지정된 숫자 열의 정밀도를 감소.
  • 텍스트 데이터 타입의 경우 TYPE은 열의 길이를 늘리는 데만 사용할 수 있어요.
  • 열의 정밀도가 Time Travel에 유지된 열 데이터의 최대 정밀도 아래로 내려가면, 정밀도를 먼저 높이지 않고는 테이블을 복원할 수 없어요.
  • 인터랙티브 테이블의 경우 현재 ALTER TABLE MODIFY COLUMN 명령과 함께 사용할 수 있는 절은 COMMENT와 UNSET COMMENT뿐이에요.
  • 마스킹 정책:
    • USING 절과 FORCE 키워드는 모두 선택사항이며, 열에 마스킹 정책을 설정하는 데 어느 것도 필수가 아니에요. USING 절과 FORCE 키워드는 따로 또는 함께 사용할 수 있어요. 자세한 내용은 다음을 참고하세요:
    • 조건부 열을 사용하는 단일 마스킹 정책은 테이블의 열 구조가 정책에 지정된 열과 일치한다면 여러 테이블에 적용할 수 있어요.
  • 마스킹 정책이 있는 하나 이상의 테이블 열이나 행 접근 정책이 있는 테이블 자체를 수정할 때는 POLICY_CONTEXT 함수를 사용해 마스킹 정책으로 보호된 열과 행 접근 정책으로 보호된 테이블에 대한 쿼리를 시뮬레이션해요.
  • 메타데이터 관련(예: COMMENT 필드): Snowflake 서비스를 사용할 때 메타데이터로 개인 데이터(User 객체 외), 민감한 데이터, 수출 통제 데이터 또는 기타 규제 대상 데이터를 입력하지 않도록 주의해야 해요. 자세한 내용은 Snowflake의 메타데이터 필드를 참고하세요.

예시 (Examples)

예시 설정:

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    |
+------+-------------------+--------+-------+-------------------------+-------------+------------+-------+------------+---------+

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 |
+------+-------------------+--------+-------+-------------------------+-------------+------------+-------+------------+---------------------+

이전 예시와 같지만 명령의 유연성을 보여주기 위한 변경과 함께:

  • 모든 작업이 단일 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
  );

이 예시는 같은 결과를 만들어요.

열 수준 보안 마스킹 정책을 테이블 열에 적용해요:

-- 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
;

테이블 열에서 열 수준 보안 마스킹 정책을 해제해요:

-- 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
;

더 알아보기 (Learn more)