ALTER TABLE
ALTER TABLE
기존 테이블의 속성, 열 또는 제약 조건을 수정하는 명령이에요.
출처: 문서
본문
관련 명령: ALTER TABLE … ALTER COLUMN, CREATE TABLE, DROP TABLE, SHOW TABLES, DESCRIBE TABLE
구문 (Syntax)
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> ADD STORAGE LIFECYCLE POLICY <policy_name>
ON ( <col_name> [ , <col_name> ... ] )
ALTER TABLE [ IF EXISTS ] <name> DROP STORAGE LIFECYCLE POLICY
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>' ]
[ ICEBERG_DEFAULT_DDL_COLLATION = '<collation_specification>' ]
[ ENABLE_SCHEMA_EVOLUTION = { TRUE | FALSE } ]
[ ERROR_LOGGING = { TRUE | FALSE } ]
[ CONTACT <purpose> = <contact_name> [ , <purpose> = <contact_name> ... ] ]
[ COMMENT = '<string_literal>' ]
[ ROW_TIMESTAMP = { TRUE | FALSE } ]
ALTER TABLE [ IF EXISTS ] <name> UNSET {
DATA_RETENTION_TIME_IN_DAYS |
MAX_DATA_EXTENSION_TIME_IN_DAYS |
CHANGE_TRACKING |
DEFAULT_DDL_COLLATION |
ICEBERG_DEFAULT_DDL_COLLATION |
ENABLE_SCHEMA_EVOLUTION |
ERROR_LOGGING |
CONTACT <purpose> |
COMMENT |
ROW_TIMESTAMP |
DCM PROJECT
}
[ , ... ]
여기서:
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
}
tableColumnAction ::=
{
ADD [ COLUMN ] [ IF NOT EXISTS ] <col_name> <col_type> [ [ GENERATED ALWAYS ] AS ( <expr> ) [ VIRTUAL ] ]
[
{
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 (that is, 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> ) ]
| CHECK ( <expr> )
}
[ <constraint_properties> ]
열 변경에 대한 자세한 구문과 예는 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 DATA METRIC FUNCTION <metric_name>
ON ( <col_name> [ , ... ] [ , TABLE <table_name>( <col_name> [ , ... ] ) ] )
[ WITHIN GROUP ( <group_col1> [ , <group_col2> ... ] )
[ GROUP LIMIT <integer> ] ]
[ FILTER ( <predicate> ) ]
[ EXPECTATION <expectation_name> ( <expression> )
[, <expectation_name> ( <expression> ) [ , ... ] ] ]
[ EXECUTE AS ROLE <role_name> ]
[ ANOMALY_DETECTION = { TRUE | FALSE } ]
[ SENSITIVITY = { 'LOW' | 'MEDIUM' | 'HIGH' } ]
[ , <metric_name_2> ON ( <col_name> [ , ... ] [ , TABLE <table_name>( <col_name> [ , ... ] ) ] ) ]
[ WITHIN GROUP ( <group_col1> [ , <group_col2> ... ] )
[ GROUP LIMIT <integer> ] ]
[ FILTER ( <predicate> ) ]
[ EXPECTATION <expectation_name> ( <expression> )
[, <expectation_name> ( <expression> ) [ , ... ] ] ]
[ EXECUTE AS ROLE <role_name> ]
[ ANOMALY_DETECTION = { TRUE | FALSE } ]
[ SENSITIVITY = { 'LOW' | 'MEDIUM' | 'HIGH' } ]
| DROP DATA METRIC FUNCTION <metric_name>
ON ( <col_name> [ , ... ] [ , TABLE <table_name>( <col_name> [ , ... ] ) ] )
[ , <metric_name_2> ON ( <col_name> [ , ... ] [ , TABLE <table_name>( <col_name> [ , ... ] ) ] ) ]
| MODIFY DATA METRIC FUNCTION <metric_name>
ON ( <col_name> [ , ... ] [ , TABLE <table_name>( <col_name> [ , ... ] ) ] )
{ SUSPEND | RESUME }
[ , <metric_name_2> ON ( <col_name> [ , ... ] [ , TABLE <table_name>( <col_name> [ , ... ] ) ] )
{ SUSPEND | RESUME } ]
| MODIFY DATA METRIC FUNCTION <metric_name>
ON ( <col_name> [ , ... ] [ , TABLE <table_name>( <col_name> [ , ... ] ) ] )
{ ADD | MODIFY } EXPECTATION <expectation_name> ( <expression> )
[, <expectation_name> ( <expression> ) [ , ... ] ]
| MODIFY DATA METRIC FUNCTION <metric_name>
ON ( <col_name> [ , ... ] [ , TABLE <table_name>( <col_name> [ , ... ] ) ] )
DROP EXPECTATION <expectation_name> [ , <expectation_name> [ , ... ] ]
| MODIFY DATA METRIC FUNCTION <metric_name>
ON ( <col_name> [ , ... ] [ , TABLE <table_name>( <col_name> [ , ... ] ) ] )
FILTER ( [ <predicate> ] )
[ , <metric_name_2> ON ( <col_name> [ , ... ] [ , TABLE <table_name>( <col_name> [ , ... ] ) ] )
FILTER ( [ <predicate> ] ) ]
| MODIFY DATA METRIC FUNCTION <metric_name>
SET <list_of_properties>
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
}
|
{
SET JOIN POLICY <policy_name>
[ FORCE ]
| UNSET JOIN 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> ... ]
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> ... ]
}
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> , ... ] ) ]
| CHECK ( <expr> )
}
[ <constraint_properties> ]
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> }
[ , ... ]
]
}
파라미터
*name*
변경할 테이블의 식별자예요. 식별자에 공백이나 특수 문자가 포함되어 있으면 전체 문자열을 큰따옴표로 묶어야 해요. 큰따옴표로 묶인 식별자는 대소문자를 구분해요.
RENAME TO *new_table_name*
지정한 테이블을 스키마에서 다른 테이블이 사용하지 않는 새 식별자로 이름을 바꿔요. 테이블 식별자에 대한 자세한 내용은 식별자 요구 사항을 참고하세요.
선택적으로 이름을 바꾸면서 객체를 다른 데이터베이스 또는 스키마로 이동할 수도 있어요. 이를 위해 db_name.schema_name.object_name 또는 schema_name.object_name 형태로 새 데이터베이스 또는 스키마 이름을 포함한 정규화된 new_name 값을 지정하면 돼요.
- 대상 데이터베이스 또는 스키마는 이미 존재해야 해요. 또한 새 위치에 같은 이름의 객체가 이미 있으면 안 되며, 있으면 오류를 반환해요.
- managed access 스키마로의 객체 이동은 객체 소유자(즉 객체에 대한 OWNERSHIP 권한이 있는 역할)가 대상 스키마도 소유하지 않는 한 금지돼요.
- 객체(테이블, 열 등)가 이름이 바뀌면 객체를 참조하는 다른 객체도 새 이름으로 업데이트해야 해요.
SWAP WITH *target_table_name*
Swap은 두 테이블을 단일 트랜잭션으로 이름을 바꿔요.
영구 테이블이나 일시(transient) 테이블은 만들어졌던 사용자 세션 동안만 유지되는 임시(temporary) 테이블과 swap할 수 없어요. 이 제한은 임시 테이블을 영구 또는 일시 테이블과 swap할 때, 기존의 영구/일시 테이블이 임시 테이블과 같은 이름을 가지면 발생할 수 있는 이름 충돌을 방지해요. 영구 또는 일시 테이블을 임시 테이블과 swap하려면 ALTER TABLE ... RENAME TO 문을 세 번 실행하면 돼요. 테이블 *a*를 *c*로, *b*를 *a*로, 그리고 *c*를 *b*로 순서대로 이름을 바꾸면 돼요.
테이블 이름을 바꾸거나 두 테이블을 swap하려면 작업을 수행하는 역할이 테이블(들)에 대해 OWNERSHIP 권한이 있어야 해요. 또한 테이블 이름을 바꾸려면 테이블의 스키마에 대한 CREATE TABLE 권한이 필요해요.
ADD STORAGE LIFECYCLE POLICY *policy_name* ON ( *col_name* [ , *col_name* ... ] )
테이블에 스토리지 수명주기 정책을 연결해요. 스토리지 수명주기 정책의 생성과 관리에 대한 자세한 내용은 스토리지 수명주기 정책 생성 및 관리를 참고하세요.
보관 스토리지 정책을 테이블에 연결하면 테이블은 수명 기간 동안 지정된 보관 계층에 영구 할당돼요. 새 정책을 적용해도 보관 계층을 바꿀 수 없어요. 테이블의 보관 계층을 변경하려면 Snowflake Support에 문의해 기존 보관 데이터 삭제를 요청해야 해요.
DROP STORAGE LIFECYCLE POLICY
테이블에서 스토리지 수명주기 정책을 제거해요.
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*
테이블의 스트림이 stale(오래됨) 상태가 되는 것을 방지하기 위해 Snowflake가 테이블의 데이터 보존 기간을 연장할 수 있는 최대 일수를 지정하는 객체 파라미터예요. 자세한 내용은 MAX_DATA_EXTENSION_TIME_IN_DAYS를 참고하세요.
CHANGE_TRACKING = { TRUE | FALSE }
테이블에서 변경 추적(change tracking)을 활성화할지 비활성화할지 지정해요.
TRUE는 테이블에서 변경 추적을 활성화해요. 이 옵션은 소스 테이블에 여러 숨은 열을 추가하고 해당 열에 변경 추적 메타데이터를 저장하기 시작해요. 이 열들은 약간의 스토리지를 소비해요. 변경 추적 메타데이터는 SELECT 문의 CHANGES 절을 사용하거나 테이블에서 하나 이상의 스트림을 만들어 쿼리할 수 있어요.FALSE는 테이블에서 변경 추적을 비활성화해요. 관련 숨은 열은 테이블에서 제거돼요.
DEFAULT_DDL_COLLATION = '*collation_specification*'
테이블에 추가되는 모든 새 열에 대한 기본 정렬(collation) 사양을 지정해요. 이 파라미터를 설정해도 기존 열의 정렬 사양은 바뀌지 않아요.
ICEBERG_DEFAULT_DDL_COLLATION = '*collation_specification*'
Snowflake 관리 Iceberg 테이블의 새 문자열 열에 대한 기본 정렬 사양을 지정해요.
ENABLE_SCHEMA_EVOLUTION = { TRUE | FALSE }
소스 파일에서 테이블로 로드된 데이터로부터 테이블 스키마의 자동 변경을 활성화하거나 비활성화해요. 여기에는 다음이 포함돼요:
- 추가된 열. 기본적으로 스키마 진화는 로드 작업당 최대 100개의 추가 열로 제한돼요. 로드 작업당 100개가 넘는 열을 요청하려면 Snowflake Support에 문의하세요.
- 새 데이터 파일에 없는 열에서 NOT NULL 제약 조건이 제거될 수 있어요.
TRUE로 설정하면 자동 테이블 스키마 진화가 활성화돼요. 기본값 FALSE는 자동 테이블 스키마 진화를 비활성화해요.
파일에서 데이터를 로드할 때 다음 조건이 모두 충족될 때 테이블 열이 진화해요:
- COPY INTO
문이
MATCH_BY_COLUMN_NAME옵션을 포함해요.- 데이터를 로드하는 역할이 테이블에 대해 EVOLVE SCHEMA 또는 OWNERSHIP 권한이 있어요.
또한 CSV 스키마 진화의 경우
MATCH_BY_COLUMN_NAME및PARSE_HEADER와 함께 사용할 때ERROR_ON_COLUMN_COUNT_MISMATCH를 false로 설정해야 해요.ERROR_LOGGING = { TRUE | FALSE }테이블에 DML 오류 로깅을 켤지 지정해요.TRUE는 테이블의 DML 오류 로깅을 켜고,FALSE는 끕니다. 자세한 내용은 DML 오류 로깅을 참고하세요.세션에 대해 OPT_OUT_ERROR_LOGGING 파라미터가
TRUE로 설정되어 있으면 특정 테이블에 켜져 있더라도 DML 오류 로깅이 켜지지 않아요.CONTACT purpose = contact [ , purpose = contact ... ]기존 객체에 하나 이상의 연락처를 연결해요. 유효한 목적 목록은 객체에 연락처 연결을 참고하세요. CONTACT 속성은 같은 문에서 다른 속성과 함께 설정할 수 없어요.COMMENT = '*string_literal*'테이블에 주석을 추가하거나 기존 주석을 덮어써요.ROW_TIMESTAMP = { TRUE | FALSE }테이블에 행 타임스탬프(row timestamp)를 추가하거나 제거해요.TRUE는 행 타임스탬프를 추가하고,FALSE는 제거해요.FALSE설정은 저장된 모든 METADATA$ROW_LAST_COMMIT_TIME 값을 영구 삭제해요. 다시 활성화해도 이 값은 복원되지 않으며 Time Travel 쿼리는 아무것도 반환하지 않아요.COPY 옵션은 CREATE STAGE, ALTER STAGE, CREATE TABLE 또는 ALTER TABLE 명령으로 지정하지 마세요. COPY 옵션은 COPY INTO
명령으로 지정하는 것이 좋아요.
UNSET ...테이블에 대해 설정 해제할 하나 이상의 속성/파라미터를 지정해요. 이것은 다시 기본값으로 재설정해요:DATA_RETENTION_TIME_IN_DAYSMAX_DATA_EXTENSION_TIME_IN_DAYSCHANGE_TRACKINGDEFAULT_DDL_COLLATIONICEBERG_DEFAULT_DDL_COLLATIONENABLE_SCHEMA_EVOLUTIONCONTACT *purpose*COMMENTROW_TIMESTAMP
CONTACT 속성은 같은 문에서 다른 속성과 함께 설정 해제할 수 없어요.
UNSET DCM PROJECT테이블과 연결된 DCM 프로젝트를 제거해요.클러스터링 작업 (clusteringAction)
CLUSTER BY ( *expr* [ , *expr* , ... ] )테이블에 하나 이상의 클러스터링 키를 지정하거나 클러스터링 키의 정의를 교체해요. 지속적으로 유지되는 자동 클러스터링은 테이블이 클러스터링 키로 정의될 때 가능해요.- RECLUSTER가 이제 더 이상 사용되지 않아요. 자동 재클러스터링에 대한 자세한 내용은 자동 클러스터링 이해를 참고하세요.
- 성능 이유로 클러스터링 키를 지정할 때 데이터를 정규화하는 것이 좋아요.
{ SUSPEND | RESUME } RECLUSTER기존 테이블의 자동 클러스터링을 일시 중지하거나 재개해요.DROP CLUSTERING KEY지정한 테이블에서 클러스터링 키를 제거해요.검색 최적화 작업 (searchOptimizationAction)
ADD SEARCH OPTIMIZATION테이블에 검색 최적화를 추가해요. 선택적으로 작업이 최적화할 열이나 검색 방법을 지정할 수 있어요.DROP SEARCH OPTIMIZATION테이블에서 검색 최적화를 제거해요. 과도한 소비를 피하기 위해 특정 열이나 검색 방법만 제거할 수 있어요.데이터 메트릭 함수 작업 (dataMetricFunctionAction)
SET DATA_METRIC_SCHEDULE = { ... }객체의 DMF 스케줄을 설정해요.'<num> MINUTE'는 데이터 메트릭 함수가 실행되는 간격(분)을 지정해요. 기본값은'60 MINUTE'예요.'USING CRON <expr> <time_zone>'은 cron 표현식으로 스케줄을 지정해요.'TRIGGER_ON_CHANGES'는 DML 작업이 테이블을 수정할 때 DMF가 실행되도록 지정해요.UNSET DATA_METRIC_SCHEDULE객체와 연결된 DMF의 스케줄을 기본값60 MINUTE로 재설정해요. DMF를 일시 중지하려면 대신SET DATA_METRIC_SCHEDULE = ''문을 실행하세요.{ ADD | DROP } DATA METRIC FUNCTION metric_name테이블이나 뷰에 추가하거나 제거할 데이터 메트릭 함수의 식별자예요.ON ( col_name [ , ... ] ...)데이터 메트릭 함수를 연결할 테이블/뷰 열을 지정해요. 열의 데이터 유형은 데이터 메트릭 함수 정의에 지정된 열의 데이터 유형과 일치해야 해요. 데이터 메트릭 함수가 두 번째 테이블을 인자로 받으면 해당 테이블의 정규화된 이름과 그 열을 지정하세요.EXPECTATION expectation_name ( expression )열과 DMF 사이의 연결에 대한 기대값(expectation)을 하나 이상 정의해요.ANOMALY_DETECTION = { TRUE | FALSE }Snowflake가 DMF를 사용해 이상값을 자동으로 감지할지 지정해요. 기본값:FALSE.SENSITIVITY = { LOW | MEDIUM | HIGH }이상 감지 알고리즘의 민감도를 지정해요. 기본값:'MEDIUM'.EXECUTE AS ROLE role_nameDMF가 실행되는 역할을 지정해요. 역할은 테이블이나 뷰에 대해 SELECT 권한이 있어야 해요.MODIFY DATA METRIC FUNCTION metric_name수정할 데이터 메트릭 함수의 식별자와 열을 지정해요.{ SUSPEND | RESUME }지정한 열에서 데이터 메트릭 함수를 일시 중지하거나 재개해요. DMF가 테이블/뷰에 설정되면 DMF는 자동으로 스케줄에 포함돼요.SUSPEND는 DMF를 스케줄에서 제거하고,RESUME은 일시 중지된 DMF를 스케줄로 되돌려요.{ ADD | MODIFY } EXPECTATION열과 DMF 연결에 대한 기대값을 정의하거나 수정해요.DROP EXPECTATION열과 DMF 연결에서 지정한 기대값을 제거해요.FILTER ( [ predicate ] )연결의 행 필터를 설정, 교체 또는 지워요. 조건을 만족하는 행에서만 DMF를 평가하려면 부울 표현식을 지정하세요. 빈 괄호(FILTER ())를 지정하면 필터를 제거해 DMF가 모든 행을 평가해요.FILTER는 같은MODIFY문에서SUSPEND,RESUME,EXPECTATION또는SET과 결합할 수 없어요.FILTER는WITHIN GROUP을 사용하는 연결에서는 지원되지 않아요.SET list_of_propertiesDMF와 객체 사이 연결의 하나 이상의 속성을 설정해요. 공백으로 구분된 목록으로 여러 속성을 설정해요.DATA_QUALITY_NOTIFICATION = { TRUE | FALSE }DMF가 반환한 값이 기대 위반이거나 이상값일 때 알림을 보낼지 제어해요. 알림은 파라미터가TRUE로 설정되어 있고 객체의 데이터베이스에 알림이 켜져 있을 때 전송돼요. 기본값:TRUE.외부 테이블 열 작업 (extTableColumnAction)
ADD [ COLUMN ] [ IF NOT EXISTS ] <col_name> <col_type> AS ( <expr> ) [, ...]외부 테이블에 새 열을 추가해요. 열이 이미 있는지 확실하지 않으면 열 추가 시 IF NOT EXISTS를 지정할 수 있어요. 같은 명령에서 여러 열에 대해 이 작업을 수행할 수 있어요.*col_name*열 식별자(즉 이름)를 지정하는 문자열이에요. 테이블 식별자에 대한 모든 요구 사항이 열 식별자에도 적용돼요.*col_type*열의 데이터 유형을 지정하는 문자열(상수)이에요. 데이터 유형은 열의*expr*결과와 일치해야 해요.*expr*열의 식을 지정하는 문자열이에요. 쿼리에서 열은 이 식에서 파생된 결과를 반환해요.외부 테이블 열은 명시적 식으로 정의되는 가상 열(virtual column)이에요. 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)라고 하면 돼요. 반정형 데이터의 경우 요소 이름과 값을 큰따옴표로 묶고 VALUE 열의 경로를 점 표기법으로 이동해요. - METADATA$FILENAME: 외부 테이블에 포함된 각 스테이징 데이터 파일의 이름을 스테이지에서의 경로와 함께 식별하는 의사 열이에요.
RENAME COLUMN *col_name* to *new_col_name*지정한 열을 외부 테이블의 다른 열이 사용하지 않는 새 이름으로 이름을 바꿔요.DROP COLUMN [ IF EXISTS ] *col_name*외부 테이블에서 지정한 열을 제거해요. 열이 이미 있는지 확실하지 않으면 IF EXISTS를 지정할 수 있어요.제약 조건 작업 (constraintAction)
ADD CONSTRAINT테이블의 하나 이상의 열에 아웃오브라인 무결성 제약 조건을 추가해요. 인라인 제약 조건(열용) 추가는 열 작업을 참고하세요.RENAME CONSTRAINT *constraint_name* TO *new_constraint_name*지정한 제약 조건의 이름을 바꿔요.{ ALTER | MODIFY } CONSTRAINT ...지정한 제약 조건의 속성을 변경해요. CHECK 제약 조건에는*constraint_name*이 필요해요.DROP CONSTRAINT *constraint_name* | PRIMARY KEY | UNIQUE | FOREIGN KEY ( *col_name* [ , ... ] ) [ CASCADE | RESTRICT ]지정한 열 또는 열 집합의 지정한 제약 조건을 제거해요. CHECK 제약 조건에는*constraint_name*이 필요해요.데이터 거버넌스 정책 및 태그 작업 (dataGovnPolicyTagAction)
TAG 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테이블에서 모든 행 액세스 정책 연결을 제거해요. 이 식은 행 액세스 정책을 이벤트 테이블에서 제거하기 전에 스키마에서 행 액세스 정책을 제거할 때 유용해요. 백업이 만들어질 때 행 액세스 정책이 테이블에 적용되고 나중에 정책이 제거된 경우에도 사용돼요. 백업에서 테이블을 복원한 후에는 DROP ALL ROW ACCESS POLICIES 절과 함께 ALTER TABLE 명령을 실행할 때까지 쿼리할 수 없어요.SET AGGREGATION POLICY policy_name [ ENTITY KEY (col_name [ , ... ]) ] [ FORCE ]테이블에 집계 정책(aggregation policy)을 할당해요. 선택적 ENTITY KEY 파라미터는 테이블 내에서 엔티티를 고유하게 식별하는 열을 정의해요. 선택적 FORCE 파라미터는 기존 집계 정책을 새 집계 정책으로 원자적으로 교체해요.UNSET AGGREGATION POLICY테이블에서 집계 정책을 분리해요.SET JOIN POLICY policy_name [ FORCE ]테이블에 조인 정책(join policy)을 할당해요. 선택적 FORCE 파라미터는 기존 조인 정책을 새 조인 정책으로 원자적으로 교체해요.UNSET JOIN POLICY테이블에서 조인 정책을 분리해요.{ ALTER | MODIFY } [ COLUMN ] ...USING ( col_name , cond_col_1 ... )조건부 마스킹 정책 SQL 식에 전달할 인자를 지정해요. 목록의 첫 번째 열은 정책 조건이 데이터를 마스킹하거나 토큰화할 열을 지정하며, 마스킹 정책이 설정된 열과 일치해야 해요. 추가 열은 쿼리의 각 행에서 데이터를 마스킹하거나 토큰화할지 결정하기 위해 평가할 열을 지정해요.SET MASKING POLICY policy_name [ USING ... ] [ FORCE ]지정한 열에 마스킹 정책을 설정해요.SET MASKING POLICY ... FORCE는 지정한 열에 이미 설정된 정책을 새 정책으로 교체해요.UNSET MASKING POLICY열에서 마스킹 정책을 제거해요. 여러 열에서 마스킹 정책을 한 번에 제거할 수 있어요.SET PROJECTION POLICY policy_name [ FORCE ]지정한 열에 프로젝션 정책을 설정해요.FORCE는 기존 정책을 교체해요.UNSET PROJECTION POLICY열에서 프로젝션 정책을 제거해요.SET TAG .../UNSET TAG ...열에 태그를 설정하거나 제거해요.사용 참고사항 (Usage notes)
다음 경우를 제외하고 ALTER TABLE은 세션의 TRANSACTION_DEFAULT_ISOLATION_LEVEL 파라미터 설정과 무관하게 커밋 지향(commit-oriented) 방식으로 실행돼요:
- 잠금 대기 시간 초과로 실패한 ALTER TABLE 문은 롤백되고 이전 상태로 되돌아가요.
- 실패한 ALTER TABLE 문은 관찰되는 모든 격리 수준(단일 문 및 트랜잭션)에 대해 롤백돼요.
- 트랜잭션 내에서 유효한 모든 격리 수준에서 다음 구문이 지원돼요:
ALTER TABLE ... RENAME TOALTER TABLE ... SWAP WITHALTER TABLE ... SET ...ALTER TABLE ... ADD COLUMNALTER TABLE ... ADD CONSTRAINTALTER TABLE ... CLUSTER BYALTER TABLE ... ADD SEARCH OPTIMIZATIONALTER TABLE ... SET MASKING POLICYALTER TABLE ... UNSET MASKING POLICY
ALTER TABLE의 유형(예: 열, 정책)별 사용 참고사항은 각 섹션을 참고하세요.접근 제어 요구 사항 (Access control requirements)
ALTER TABLE 작업에 필요한 권한은 수행 중인 작업에 따라 달라요. 예를 들어 테이블 이름 바꾸기에는 테이블에 대한 OWNERSHIP 권한과 스키마에 대한 CREATE TABLE 권한이 필요해요. 다른 작업에는 더 제한적이거나 더 관대한 권한이 필요할 수 있어요. 자세한 내용은 권한 보기를 참고하세요.
예 (Examples)
테이블 이름 바꾸기
t1이라는 테이블을 만듭니다:CREATE OR REPLACE TABLE t1(a1 number);SHOW TABLES LIKE 't1';+-------------------------------+------+---------------+-------------+-------+---------+------------+------+-------+--------+----------------+-----------------+-------------+-------------------------+-----------------+----------+--------+ | 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;테이블 swap하기
t1과t2라는 테이블을 만듭니다:CREATE OR REPLACE TABLE t1(a1 NUMBER, a2 VARCHAR, a3 DATE); CREATE OR REPLACE TABLE t2(b1 VARCHAR);다음 문은 테이블
t1을t2와 swap합니다:ALTER TABLE t1 SWAP WITH t2;열 추가하기
다음 문은
t1테이블에a2라는 열, NOT NULL 제약 조건이 있는a3, 기본값과 NOT NULL이 있는a4, 언어별 정렬 사양이 있는 VARCHAR 열a5를 추가합니다:ALTER TABLE t1 ADD COLUMN a2 NUMBER; ALTER TABLE t1 ADD COLUMN a3 NUMBER NOT NULL; ALTER TABLE t1 ADD COLUMN a4 NUMBER DEFAULT 0 NOT NULL; ALTER TABLE t1 ADD COLUMN a5 VARCHAR COLLATE 'en_US';IF NOT EXISTS절을 사용해 열이 존재하지 않을 때만a2라는 열을 추가할 수 있어요. 기존a2열이 있으므로IF NOT EXISTS를 지정하면 문이 오류로 실패하지 않아요.ALTER TABLE t1 ADD COLUMN IF NOT EXISTS a2 NUMBER;열 이름 바꾸기 / 열 제거하기
ALTER TABLE t1 RENAME COLUMN a1 TO b1; ALTER TABLE t1 DROP COLUMN a2; ALTER TABLE t1 DROP COLUMN IF EXISTS a2;외부 테이블의 열 추가, 이름 바꾸기, 제거
외부 테이블을 만들고 열을 추가합니다:
CREATE EXTERNAL TABLE exttable1 LOCATION=@mystage/logs/ AUTO_REFRESH = true FILE_FORMAT = (TYPE = PARQUET) ;ALTER TABLE exttable1 ADD COLUMN a1 VARCHAR AS (value:a1::VARCHAR);ALTER TABLE exttable1 RENAME COLUMN a1 TO b1;ALTER TABLE exttable1 DROP COLUMN b1;클러스터링 키 순서 변경
CREATE OR REPLACE TABLE T1 (id NUMBER, date TIMESTAMP_NTZ, name STRING) CLUSTER BY (id, date);ALTER TABLE t1 CLUSTER BY (date, id);행 액세스 정책 추가 및 제거
ALTER TABLE t1 ADD ROW ACCESS POLICY rap_t1 ON (empl_id);ALTER TABLE t1 ADD ROW ACCESS POLICY rap_test2 ON (cost, item);ALTER TABLE t1 DROP ROW ACCESS POLICY rap_v1;더 알아보기 (Learn more)