CREATE SCHEMA
CREATE SCHEMA
새 스키마(schema)를 현재 데이터베이스에 만드는 명령이에요. 객체들을 이름 충돌 없이 묶어두는 네임스페이스 역할을 합니다.
출처: PostgreSQL 문서
본문
문법 (Synopsis)
CREATE SCHEMA schema_name [ AUTHORIZATION role_specification ] [ schema_element [ ... ] ]
CREATE SCHEMA AUTHORIZATION role_specification [ schema_element [ ... ] ]
CREATE SCHEMA IF NOT EXISTS schema_name [ AUTHORIZATION role_specification ]
CREATE SCHEMA IF NOT EXISTS AUTHORIZATION role_specification
where role_specification can be:
user_name
| CURRENT_ROLE
| CURRENT_USER
| SESSION_USER
설명 (Description)
CREATE SCHEMA는 현재 데이터베이스에 새 스키마를 넣어요. 스키마 이름은 현재 데이터베이스의 기존 스키마 이름과 달라야 합니다.
스키마는 본질적으로 네임스페이스예요. 테이블, 데이터 타입, 함수, 연산자 같은 이름 있는 객체를 담는데, 이들의 이름은 다른 스키마의 객체와 같아도 됩니다. 이름 있는 객체는 스키마 이름을 접두사로 붙여 '한정(qualify)'하거나, 원하는 스키마를 포함한 검색 경로(search path)를 설정해 접근해요. 이름 한정 없이 지정한 CREATE 명령은 현재 스키마(검색 경로 앞쪽에 있는 것, current_schema 함수로 확인 가능)에 객체를 만듭니다.
선택적으로 CREATE SCHEMA는 새 스키마 안에 객체를 만드는 하위 명령(subcommand)도 담을 수 있어요. AUTHORIZATION 절을 쓰면 만들어진 모든 객체가 그 사용자 소유가 된다는 점 외에는, 하위 명령들은 스키마를 만든 뒤 별도로 실행한 명령과 사실상 같게 처리됩니다.
파라미터 (Parameters)
schema_name— 만들 스키마의 이름. 생략하면user_name이 스키마 이름으로 쓰여요.pg_로 시작하는 이름은 시스템 스키마용으로 예약되어 있어 쓸 수 없습니다.user_name— 새 스키마를 소유할 사용자의 역할 이름. 생략하면 명령을 실행한 사용자가 됩니다. 다른 역할이 소유한 스키마를 만들려면 그 역할로SET ROLE할 수 있어야 해요.schema_element— 스키마 안에 만들 객체를 정의하는 SQL 문. 현재CREATE SCHEMA안의 절로는CREATE TABLE,CREATE VIEW,CREATE INDEX,CREATE SEQUENCE,CREATE TRIGGER,GRANT만 허용됩니다. 다른 종류의 객체는 스키마를 만든 뒤 별도 명령으로 만들 수 있어요.IF NOT EXISTS— 같은 이름의 스키마가 이미 있으면 공지(notice) 외에는 아무것도 하지 않아요. 이 옵션을 쓰면schema_element하위 명령은 포함할 수 없습니다.
주의 사항 (Notes)
스키마를 만들려면 실행하는 사용자에게 현재 데이터베이스에 대한 CREATE 권한이 있어야 해요. (물론 슈퍼유저는 이 검사를 우회합니다.)
예제 (Examples)
스키마 만들기:
CREATE SCHEMA myschema;
사용자 joe를 위한 스키마 만들기 — 스키마 이름도 joe가 됩니다:
CREATE SCHEMA AUTHORIZATION joe;
test 스키마가 이미 없을 때만, 사용자 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;
호환성 (Compatibility)
SQL 표준은 CREATE SCHEMA에 DEFAULT CHARACTER SET 절과, PostgreSQL이 현재 받아들이는 것보다 더 많은 하위 명령 유형을 허용해요.
SQL 표준은 CREATE SCHEMA의 하위 명령이 어떤 순서로든 나타날 수 있다고 규정합니다. 현재 PostgreSQL 구현은 하위 명령의 전방 참조(forward reference)를 모두 처리하지는 못해요. 그래서 전방 참조를 피하려고 하위 명령 순서를 바꿔야 할 때가 있을 수 있습니다.
SQL 표준에 따르면 스키마의 소유자는 항상 그 안의 모든 객체를 소유합니다. PostgreSQL은 스키마 안에 스키마 소유자가 아닌 사용자가 소유한 객체가 있는 것도 허용해요. 이는 스키마 소유자가 자신의 스키마에 대한 CREATE 권한을 다른 사람에게 부여했거나, 슈퍼유저가 그 안에 객체를 만들기로 했을 때만 일어납니다.
IF NOT EXISTS 옵션은 PostgreSQL 확장 기능이에요.
함께 보기 (See Also)
ALTER SCHEMA, DROP SCHEMA
더 알아보기 (Learn more)
ALTER SCHEMA: 스키마 정의를 변경하는 명령.DROP SCHEMA: 스키마를 제거하는 명령.