CREATE OR ALTER \<object\>
CREATE OR ALTER <object>
CREATE OR ALTER 명령은 CREATE 명령과 ALTER 명령의 기능을 결합한 DDL 명령이에요. CREATE <object> 명령이 지원하는 구문으로 객체를 정의하되, ALTER <object> 명령의 제약을 적용해요.
출처: 문서
본문
CREATE OR ALTER 명령은 CREATE 명령과 ALTER 명령의 기능을 결합한 DDL 명령이에요. CREATE <object> 명령이 지원하는 구문으로 객체를 정의하되, ALTER <object> 명령의 제약을 적용해요.
명령은 데이터와 연관(association)을 유지해요. 즉, 데이터와 기타 상태, 태그 연관과 연결된 정책, 객체에 대한 권한 부여가 보존돼요. 다만 일부 객체 변환은 데이터 삭제로 이어질 수 있어요. 예를 들어 CREATE OR ALTER TABLE 문이 컬럼 삭제를 초래하면, 그 컬럼에 있던 데이터는 손실돼요 (하지만 Time Travel로 복구할 수는 있어요).
CREATE OR ALTER 명령은 선언적(declarative)이고 멱등적(idempotent)인 방법으로 객체에 증분 업데이트를 적용할 수 있게 해요. 실행하면 CREATE OR ALTER 문은 다음 결과 중 하나로 이어져요.
- 객체가 없으면 정의에 따라 만들어져요.
- 객체가 있으면 문에 정의된 객체로 수정(alter)돼요.
- 객체가 이미 정의와 일치하면 변경되지 않고 유지돼요.
CREATE OR ALTER가 CREATE 및 ALTER와 어떻게 다른지
CREATE와 ALTER는 명령형(imperative) 명령이에요. 각 문은 컬럼 추가, 속성 변경, 객체 이름 바꾸기 같은 특정 작업을 설명해요. CREATE OR ALTER는 선언적이에요. 객체의 완전한 원하는 상태를 설명하고, Snowflake가 그 상태에 도달하는 데 필요한 변경을 계산해요.
이 구분은 핵심 이점과 핵심 제약을 모두 설명해요.
- 멱등성(Idempotency). 같은 문을 여러 번 실행해도 항상 같은 결과가 나와요. 이는
CREATE OR ALTER를 배포 스크립트와 IaC(infrastructure-as-code) 워크플로에 안전하게 만드는데, 같은 스크립트가 새 환경과 기존 환경 모두에서 실행되기 때문이에요. 환경 간에 plan-then-deploy 워크플로로 Snowflake 객체를 코드로 관리하는 더 완전한 솔루션은 Snowflake DCM Projects를 참고해요. - 이름 바꾸기 없음(No renaming).
CREATE OR ALTER는 원하는 정의를 현재 상태와 비교해 동작하므로 컬럼이 추가·제거되었는지는 감지할 수 있지만, 컬럼 이름이 바뀌었는지는 결정할 수 없어요. 현재 테이블에 컬럼b가 있고 새 정의에는 없으며, 새 정의에 컬럼c가 있고 현재 테이블에는 없다면, Snowflake는 이것을b의 삭제와c의 추가로 처리하지b에서c로의 이름 변경으로 처리하지 않아요. 명시적 이름 변경에는ALTER TABLE ... RENAME COLUMN을 사용해요. - ALTER 제약 적용(ALTER limitations apply). 객체가 이미 존재하면 Snowflake는 해당
ALTER명령과 같은 엔진으로 계산된 델타를 적용해요.ALTER가 지원하지 않는 작업은CREATE OR ALTER에서도 지원되지 않아요. 예를 들어 컬럼의 데이터 유형을 호환되지 않는 유형으로 변경할 수 없어요.
CREATE OR ALTER 문은 객체의 완전한 원하는 상태를 정의해요. Snowflake는 해당 ALTER 명령에서 사용할 수 있는 것과 같은 작업으로 그 상태에 도달하는 데 필요한 최소 변경 집합을 계산하고 적용해요.
함께 보기: CREATE <object>, ALTER <object>
CREATE OR ALTER 명령
구체적인 구문·사용 메모·예시는 다음을 참고해요.
계정 객체 (Account Objects):
- CREATE OR ALTER AUTHENTICATION POLICY
- CREATE OR ALTER DATABASE
- CREATE OR ALTER NETWORK POLICY
- CREATE OR ALTER ROLE
- CREATE OR ALTER SHARE
- CREATE OR ALTER WAREHOUSE
데이터베이스 객체 (Database Objects):
- CREATE OR ALTER APPLICATION ROLE
- CREATE OR ALTER APPLICATION SERVICE
- CREATE OR ALTER BACKUP POLICY
- CREATE OR ALTER BACKUP SET
- CREATE OR ALTER DATABASE ROLE
- CREATE OR ALTER DATA METRIC FUNCTION
- CREATE OR ALTER DYNAMIC TABLE
- CREATE OR ALTER EXTERNAL FUNCTION (Preview)
- CREATE OR ALTER FILE FORMAT
- CREATE OR ALTER FUNCTION
- CREATE OR ALTER FUNCTION (Snowpark Container Services) (Preview)
- CREATE OR ALTER MASKING POLICY
- CREATE OR ALTER NETWORK RULE
- CREATE OR ALTER PIPE (Preview)
- CREATE OR ALTER PROCEDURE
- CREATE OR ALTER ROW ACCESS POLICY
- CREATE OR ALTER SCHEMA
- CREATE OR ALTER SEMANTIC VIEW
- CREATE OR ALTER STAGE
- CREATE OR ALTER STREAM (Preview)
- CREATE OR ALTER TABLE
- CREATE OR ALTER TAG
- CREATE OR ALTER TASK
- CREATE OR ALTER VERSIONED SCHEMA (Preview)
- CREATE OR ALTER VIEW
일반 사용 메모 (General usage notes)
- 데이터 거버넌스: CREATE OR ALTER 명령은 데이터 거버넌스 변경을 지원하지 않아요. 기존 태그나 정책은 CREATE OR ALTER 문의 영향을 받지 않고 그대로 유지돼요.
- 객체 속성·매개변수 해제(Unsetting): 수정된 객체 정의에 이전에 설정된 속성이나 매개변수가 없으면 그 값이 해제(unset)돼요.
- 명시적인 매개변수 값을 해제하면 매개변수가 기본값으로 재설정돼요. 매개변수가 대상 객체를 포함하는 객체에 설정되어 있으면 대상 객체는 포함하는 객체에 설정된 값을 상속해요. 그 외에는 객체의 매개변수 값이 기본값으로 재설정돼요.
- 다른 속성과 달리 CHANGE_TRACKING과 ROW_TIMESTAMP 속성은 CREATE OR ALTER 명령에서 지정하지 않아도 해제되지 않아요.
- 원자성(Atomicity): CREATE OR ALTER TABLE 명령은 원자성을 보장하지 않아요. 매우 넓은 테이블에 대한 CREATE OR ALTER TABLE 문이 실행 중 실패하는 드문 경우에, 변경의 일부만 테이블에 적용되었을 수 있어요. 부분 변경 가능성이 있다면 오류 메시지는 대부분 다음 텍스트를 포함해요.
예를 들어 문이 컬럼CREATE OR ALTER execution failed. Partial updates may have been applied.A를 삭제하고 새 컬럼B를 추가하려 하는데 문이 중단되면, 컬럼A는 삭제되었지만 컬럼B는 추가되지 않았을 수 있어요.참고: 변경이 부분적으로 적용되어도 결과 테이블은 여전히 유효한 상태이며, 추가 ALTER TABLE 문으로 원래 변경 집합을 완료할 수 있어요. 부분 업데이트에서 복구하기 위해 Snowflake는 다음 복구 메커니즘을 권장해요.
- 전방 수정(Fix forward): CREATE OR ALTER TABLE 문을 다시 실행해요. 두 번째 시도에서 문이 성공하면 대상 상태가 달성돼요. 오류 메시지를 조사해 가능하면 오류를 고치고 CREATE OR ALTER TABLE 문을 다시 실행해요.
- 롤백(Roll back): 전방 수정이 불가능하면 부분 변경을 수동으로 롤백하는 것을 권장해요. DESCRIBE TABLE과 SHOW TABLES 명령으로 테이블 상태를 조사해 어떤 부분 변경이 적용되었는지(있는 경우) 결정해요. 부분 변경이 적용되었다면 적절한 ALTER TABLE 문을 실행해 테이블을 원래 상태로 되돌려요.
-
참고: 어떤 경우에는 부분 변경을 되돌리지 못할 수도 있어요. 자세한 내용은 ALTER TABLE … ALTER COLUMN 항목의 컬럼 속성 수정 지원·비지원 작업을 참고해요.
- 부분 업데이트 복구에 도움이 필요하면 Snowflake 지원에 문의해요.
제약 (Limitations)
CREATE OR ALTER <object> 명령의 구체적인 제약은 객체에 따라 달라져요. 제약의 몇 가지 예는 다음과 같아요.
- CREATE OR ALTER TABLE 명령은 검색 최적화(search optimization)를 지원하지 않아요. 검색 최적화는 CREATE TABLE 구문의 일부가 아니기 때문이에요.
- 테이블의 컬럼 데이터 유형을 호환되지 않는 유형으로 변경할 수 없어요.
- 태스크(task)를 수정하려면 먼저 일시 중지해야 해요.
- CREATE OR ALTER TABLE … AS SELECT는 현재 지원되지 않아요.
- 객체나 컬럼 이름을 바꾸거나 컬럼 순서를 변경할 수 없어요.
특정 객체의 제약은 해당 객체의 참조 항목을 참고해요.
더 알아보기 (Learn more)
- CREATE <object> — 객체 생성 명령
- ALTER <object> — 객체 수정 명령
- Snowflake DCM Projects — 객체를 코드로 관리하는 솔루션