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
TRIGGER
및 GRANT
명령만 하위 명령으로 사용할 수 있다.
그 외 개체들에 대해서는 스키마를 만든 뒤 따로 만들어야 한다.
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 확장 기능이다.