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 VALIDCHECK 제약 조건에만 허용돼요.
  • 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 DOMAINOWNER, RENAME, SET SCHEMA, VALIDATE CONSTRAINT 변형이 PostgreSQL 확장이라는 점을 제외하면 SQL 표준을 따르며, ADD CONSTRAINT 변형의 NOT VALID 절도 PostgreSQL 확장이에요.

더 알아보기 (Learn more)

  • CREATE DOMAIN — 새 도메인을 만드는 명령이에요.
  • DROP DOMAIN — 도메인을 삭제하는 명령이에요.
  • CREATE TYPE — 더 복잡한 커스텀 타입을 만들 때 유용해요.