ALTER DOMAIN — 도메인 정의 변경하기
ALTER DOMAIN — 도메인 정의 변경하기
ALTER DOMAIN은 이미 존재하는 도메인(domain, 재사용 가능한 데이터 타입)의 정의를 바꾸는 명령이에요. 기본값이나 NOT NULL 여부, 제약 조건을 고치거나 이름·소유자·스키마를 바꿀 때 씁니다. 도메인을 쓰는 여러 컬럼에 한 번에 규칙을 적용하고 싶을 때 특히 유용해요.
출처: PostgreSQL 문서
본문
시놉시스 (Synopsis)
ALTER DOMAIN name
{ SET DEFAULT expression | DROP DEFAULT }
ALTER DOMAIN name
{ SET | DROP } NOT NULL
ALTER DOMAIN name
ADD domain_constraint [ NOT VALID ]
ALTER DOMAIN name
DROP CONSTRAINT [ IF EXISTS ] constraint_name [ RESTRICT | CASCADE ]
ALTER DOMAIN name
RENAME CONSTRAINT constraint_name TO new_constraint_name
ALTER DOMAIN name
VALIDATE CONSTRAINT constraint_name
ALTER DOMAIN name
OWNER TO { new_owner | CURRENT_ROLE | CURRENT_USER | SESSION_USER }
ALTER DOMAIN name
RENAME TO new_name
ALTER DOMAIN name
SET SCHEMA new_schema
where domain_constraint is:
[ CONSTRAINT constraint_name ]
{ NOT NULL | CHECK (expression) }
설명 (Description)
ALTER DOMAIN은 기존 도메인의 정의를 변경해요. 여러 하위 형식이 있어요.
SET/DROP DEFAULT— 이 형식은 도메인의 기본값을 설정하거나 제거해요. 기본값은 이후의INSERT명령에만 적용되며, 그 도메인을 쓰는 테이블에 이미 있는 행에는 영향을 주지 않아요.SET/DROP NOT NULL— 이 형식은 도메인이 NULL을 허용하는지 거부하는지 표시를 바꿔요.SET NOT NULL은 그 도메인을 쓰는 컬럼에 null 값이 없을 때만 할 수 있어요.ADD domain_constraint [ NOT VALID ]— 이 형식은 도메인에 새 제약 조건을 추가해요. 도메인에 새 제약 조건을 추가하면 그 도메인을 쓰는 모든 컬럼이 새로 추가된 제약 조건에 대해 검사돼요.NOT VALID옵션으로 새 제약 조건을 추가하면 이 검사를 생략할 수 있고, 나중에ALTER DOMAIN ... VALIDATE CONSTRAINT로 제약 조건을 유효하게 만들 수 있어요. 새로 삽입되거나 갱신된 행은NOT VALID로 표시된 것까지 항상 모든 제약 조건에 대해 검사돼요.NOT VALID는CHECK제약 조건에만 허용돼요.DROP CONSTRAINT [ IF EXISTS ]— 이 형식은 도메인의 제약 조건을 제거해요.IF EXISTS를 지정하고 제약 조건이 존재하지 않으면 오류가 발생하지 않아요. 이 경우 대신 notice가 발행돼요.RENAME CONSTRAINT— 이 형식은 도메인의 제약 조건 이름을 바꿔요.VALIDATE CONSTRAINT— 이 형식은 이전에NOT VALID로 추가된 제약 조건을 검증해요. 즉 도메인 타입의 테이블 컬럼에 있는 모든 값이 지정된 제약 조건을 만족하는지 확인해요.OWNER— 이 형식은 도메인의 소유자를 지정된 사용자로 바꿔요.RENAME— 이 형식은 도메인의 이름을 바꿔요.SET SCHEMA— 이 형식은 도메인의 스키마를 바꿔요. 도메인과 연관된 제약 조건도 새 스키마로 함께 옮겨져요.
ALTER DOMAIN을 쓰려면 도메인의 소유자여야 해요. 도메인의 스키마를 바꾸려면 새 스키마에 대한 CREATE 권한도 있어야 하고, 소유자를 바꾸려면 새 소유 역할로 SET ROLE할 수 있어야 하며 그 역할이 도메인의 스키마에 CREATE 권한을 가져야 해요. (이런 제약은 소유자를 바꾸는 게 도메인을 드롭하고 다시 만드는 것 이상의 일을 하지 못하게 막아 주는 거예요. 다만 슈퍼유저는 어떤 도메인이든 소유권을 바꿀 수 있어요.)
매개변수 (Parameters)
name— 변경할 기존 도메인의 이름(가능하면 스키마 한정)이에요.domain_constraint— 도메인의 새 도메인 제약 조건이에요.constraint_name— 제거하거나 이름을 바꿀 기존 제약 조건의 이름이에요.NOT VALID— 제약 조건 유효성에 대해 기존 저장 데이터를 검증하지 않아요.CASCADE— 제약 조건에 의존하는 객체를, 그리고 다시 그 객체들에 의존하는 모든 객체를 자동으로 제거해요(5.15절 참고).RESTRICT— 의존하는 객체가 있으면 제약 조건 제거를 거부해요. 기본 동작이에요.new_name— 도메인의 새 이름이에요.new_constraint_name— 제약 조건의 새 이름이에요.new_owner— 도메인의 새 소유자 사용자 이름이에요.new_schema— 도메인의 새 스키마예요.
참고 (Notes)
ALTER DOMAIN ADD CONSTRAINT는 기존 저장 데이터가 새 제약 조건을 만족하는지 검증하려고 하지만, 이 검사는 완벽하지 않아요. 명령이 아직 커밋되지 않은 새로 삽입되거나 갱신된 테이블 행은 "볼" 수 없기 때문이에요. 동시 작업이 잘못된 데이터를 삽입할 위험이 있다면 NOT VALID 옵션으로 제약 조건을 추가하고, 그 명령을 커밋하고, 그 커밋 이전에 시작된 모든 트랜잭션이 끝날 때까지 기다린 뒤, ALTER DOMAIN VALIDATE CONSTRAINT를 실행해서 제약 조건을 위반하는 데이터를 찾는 방식으로 진행하세요. 이 방법은 신뢰할 수 있는데, 제약 조건이 커밋되면 모든 새 트랜잭션이 도메인 타입의 새 값에 대해 그 제약 조건을 강제하기 때문이에요.
현재 ALTER DOMAIN ADD CONSTRAINT, ALTER DOMAIN VALIDATE CONSTRAINT, ALTER DOMAIN SET NOT NULL은 명명된 도메인이나 그 파생 도메인이 데이터베이스의 어떤 테이블에서 컨테이너 타입 컬럼(복합, 배열, 범위 컬럼) 안에 사용되고 있으면 실패해요. 이들은 나중에 이런 중첩 값에 대해 새 제약 조건을 검증할 수 있도록 개선돼야 해요.
예제 (Examples)
도메인에 NOT NULL 제약 조건을 추가하려면:
ALTER DOMAIN zipcode SET NOT NULL;
도메인에서 NOT NULL 제약 조건을 제거하려면:
ALTER DOMAIN zipcode DROP NOT NULL;
도메인에 check 제약 조건을 추가하려면:
ALTER DOMAIN zipcode ADD CONSTRAINT zipchk CHECK (char_length(VALUE) = 5);
도메인에서 check 제약 조건을 제거하려면:
ALTER DOMAIN zipcode DROP CONSTRAINT zipchk;
도메인의 check 제약 조건 이름을 바꾸려면:
ALTER DOMAIN zipcode RENAME CONSTRAINT zipchk TO zip_check;
도메인을 다른 스키마로 옮기려면:
ALTER DOMAIN zipcode SET SCHEMA customers;
호환성 (Compatibility)
ALTER DOMAIN은 OWNER, RENAME, SET SCHEMA, VALIDATE CONSTRAINT 변형이 PostgreSQL 확장이라는 점을 제외하면 SQL 표준을 따르며, ADD CONSTRAINT 변형의 NOT VALID 절도 PostgreSQL 확장이에요.
더 알아보기 (Learn more)
- CREATE DOMAIN — 새 도메인을 만드는 명령이에요.
- DROP DOMAIN — 도메인을 삭제하는 명령이에요.
- CREATE TYPE — 더 복잡한 커스텀 타입을 만들 때 유용해요.