CREATE SCHEMA

CREATE SCHEMA — 새 스키마 정의

요약

CREATE SCHEMA 스키마이름 [ AUTHORIZATION 롤명세 ] [ 스키마요소 [ ... ] ]
CREATE SCHEMA AUTHORIZATION 롤명세 [ 스키마요소 [ ... ] ]
CREATE SCHEMA IF NOT EXISTS 스키마이름 [ AUTHORIZATION 롤명세 ]
CREATE SCHEMA IF NOT EXISTS AUTHORIZATION 롤명세

롤명세 자리에는:

    사용자이름
  | CURRENT_USER
  | SESSION_USER

설명

CREATE SCHEMA 명령은 현재 데이터베이스에 새 스키마를 만든다. 스키마 이름은 현재 데이터베이스에서 유일해야 한다.

스키마란 하나의 이름 공간이다: 이 스키마 안에, 여러 개체들(테이블, 자료형, 함수, 연산자)이 담긴다(포함된다). 이 개체들은 같은 이름으로 다른 스키마에 다른 개체로 있을 수도 있다. 이 각 개체를 사용하기 위해 그 이름을 지정할 때, 개체 이름 앞에 스키마 이름을 접두사로 두고, 스키마 이름과 개체 이름 사이에 점(.)을 찍어 그 개체를 식별한다. 또한 스키마 이름을 생략하면, 해당 개체는 search_path 환경 설정값으로 지정한 스키마들 가운데 차례대로 찾고, 처음 발견 된 것을 작업 개체로 판단한다. 이런 개체를 만드는 각종 CREATE 명령에서도 그 이름 앞에 스키마 이름을 지정할 수 있으며, 스키마 이름을 생략하면, search_path 값 제일 앞에 있는 스키마 안에 해당 개체를 만든다. 이 기본 스키마를 현재 스키마라고 하며, current_schema 함수로 그 값을 확인할 수 있다.

선택적으로, CREATE SCHEMA 명령에는 그 스키마를 만들면서, 그 스키마 안에 포함될 개체들을 함께 만들 수 있는 하위 명령도 포함할 수 있다. 이 하위 명령은 스키마를 만들고 난 다음 분리되어 따로 실행할 수 있는 명령들로 구성된다. 이 때 AUTHORIZATION 옵션이 있으면, 소속 개별 개체들도 같은 소유주로 지정한다. 그 소속 개별 개체들의 각각의 소유주를 다르게 지정하려면, 하위 명령을 분리해서 작업하거나, 만든 뒤 소유주 변경 작업으로 진행하면 된다.

매개 변수

스키마이름

새로 만들 스키마 이름. 생략하면, 현재 사용자 이름(사용자이름)을 스키마 이름으로 한다. 스키마 이름으로 pg_로 시작하는 이름은 시스템 스키마로 예약되어 있어 사용할 수 없다.

사용자이름

새 스키마의 소유주 이름. 생략하면 이 명령을 수행하는 사용자를 소유주로 한다. 이 사용자 이름과 현재 명령 수행하는 사용자가 다르면, 현재 사용자는 슈퍼유저이거나, 직간접적으로 지정하는 사용자이름 롤의 구성원이어야 한다.

스키마요소

새 스키마를 만들면서 그 스키마 소속 하위 개체들도 함께 만든다. 현재, CREATE TABLE, CREATE VIEW, CREATE INDEX, CREATE SEQUENCE, CREATE TRIGGERGRANT 명령만 하위 명령으로 사용할 수 있다. 그 외 개체들에 대해서는 스키마를 만든 뒤 따로 만들어야 한다.

IF NOT EXISTS

해당 이름의 스키마가 이미 있으면, 알림 메시지만 보이고, 무시한다. 이 옵션을 사용하면, 스키마요소 하위 명령은 사용할 수 없다.

참고

스키마를 만드려면, 해당 데이터베이스에 대해서 CREATE 권한이 있는 사용자여야 한다. (슈퍼유저는 이 제약 무시하고 만들 수 있다.)

예제

스키마 만들기:

CREATE SCHEMA myschema;

joe 사용자를 소유주로 하는 같은 이름의 스키마 만들기:

CREATE SCHEMA AUTHORIZATION joe;

test 이름의 스키마가 없으면, 이 이름의 스키마를 만들면서 소유주를 joe로 지정. 이미 있으면, 무시. (소유주가 누구인지는 상관하지 않고 무시함)

CREATE SCHEMA IF NOT EXISTS test AUTHORIZATION joe;

스키마를 만들면서, 테이블과 뷰도 함께 만들기:

CREATE SCHEMA hollywood
    CREATE TABLE films (title text, release date, awards text[])
    CREATE VIEW winners AS
        SELECT title, release FROM films WHERE awards IS NOT NULL;

개별 개체를 만드는 명령 뒤에 각각 세미 콜론을 쓰지 않음을 주의해야 한다.

다음은 윗 명령을 개별 명령으로 분리한 경우:

CREATE SCHEMA hollywood;
CREATE TABLE hollywood.films (title text, release date, awards text[]);
CREATE VIEW hollywood.winners AS
    SELECT title, release FROM hollywood.films WHERE awards IS NOT NULL;

호환성

SQL 표준에서는 PostgreSQL 에서 제공하고 있는 하위 명령과 함께, DEFAULT CHARACTER SET 구문도 허용한다.

SQL 표준에서는 하위 명령의 순서는 상관 없다. PostgreSQL에서는 이 부분이 구현 되어 있지 않고, 단지 차례 대로 수행하기 때문에, 하위 개체들의 의존성 문제가 발생하면 그 하위 명령의 순서를 바꿔서 다시 실행해야 한다.

SQL 표준에서는 해당 스키마의 소유주는 그 스키마 소속 모든 개체의 소유주가 된다. PostgreSQL에서는 스키마의 소유주와 그 소속 개체들의 소유주가 각기 다를 수 있다. 이 경우는 해당 스키마에 대해서 어떤 사용자가 CREATE 권한이 있거나, 슈퍼유저면 가능하다.

IF NOT EXISTS 옵션은 PostgreSQL 확장 기능이다.

관련 항목

ALTER SCHEMA, DROP SCHEMA