CREATE EXTENSION — 확장 설치하기
CREATE EXTENSION — 확장 설치하기
CREATE EXTENSION 명령은 확장(extension)을 현재 데이터베이스에 로드하는 명령이에요. 함수, 데이터 타입, 연산자, 인덱스 지원 메서드 같은 새 SQL 객체를 한 번에 설치해요.
출처: PostgreSQL 문서
본문
Synopsis
CREATE EXTENSION [ IF NOT EXISTS ] extension_name
[ WITH ] [ SCHEMA schema_name ]
[ VERSION version ]
[ CASCADE ]
Description
CREATE EXTENSION은 새 확장을 현재 데이터베이스에 로드해요. 같은 이름의 확장이 이미 로드되어 있으면 안 돼요.
확장을 로드하는 것은 본질적으로 그 확장의 스크립트 파일을 실행하는 것과 같아요. 그 스크립트는 보통 함수, 데이터 타입, 연산자, 인덱스 지원 메서드 같은 새 SQL 객체를 생성해요. CREATE EXTENSION은 또한 생성된 모든 객체의 정체성을 기록해서, DROP EXTENSION을 발행하면 다시 삭제할 수 있게 해줘요.
CREATE EXTENSION을 실행한 사용자는 이후 권한 검사를 위해 그 확장의 소유자가 되고, 보통은 확장의 스크립트가 생성한 모든 객체의 소유자도 돼요.
확장을 로드하는 데는 보통 그 구성 요소 객체를 생성하는 데 필요한 것과 동일한 권한이 필요해요. 많은 확장에서 이는 슈퍼유저 권한이 필요하다는 뜻이에요. 하지만 확장이 그 제어 파일(control file)에서 trusted(신뢰됨)로 표시된 경우, 현재 데이터베이스에 CREATE 권한이 있는 모든 사용자가 설치할 수 있어요. 이 경우 확장 객체 자체는 호출한 사용자가 소유하지만, 포함된 객체는 부트스트랩 슈퍼유저가 소유해요 (확장의 스크립트가 명시적으로 호출한 사용자에게 할당하지 않는 한). 이 구성은 호출한 사용자에게 확장을 삭제할 권리를 주지만, 그 안 개별 객체를 수정할 권리는 주지 않아요.
Parameters
IF NOT EXISTS
같은 이름의 확장이 이미 존재하면 오류를 던지지 않아요. 이 경우 공지가 발행돼요. 참고로 기존 확장이 현재 사용 가능한 스크립트 파일로 생성됐을 확장과 어떤 식으로든 같다는 보장은 없어요.
extension_name
설치할 확장의 이름이에요. PostgreSQL은 서버의 확장 제어 경로(extension_control_path로 설정)로 찾은 *extension_name*.control 파일의 세부 사항을 사용해 확장을 생성해요.
schema_name
확장이 내용물을 이동할 수 있게 허용할 때, 확장의 객체를 설치할 스키마의 이름이에요. 지정한 스키마는 이미 존재해야 해요. 지정하지 않고 확장의 제어 파일도 스키마를 지정하지 않으면, 현재 기본 객체 생성 스키마가 사용돼요.
확장이 제어 파일에서 schema 매개변수를 지정하면 그 스키마는 SCHEMA 절로 재정의할 수 없어요. 보통 SCHEMA 절이 주어지고 그것이 확장의 schema 매개변수와 충돌하면 오류가 발생해요. 하지만 CASCADE 절도 주어지면 충돌 시 *schema_name*은 무시돼요. 주어진 *schema_name*은 제어 파일에 schema를 지정하지 않는 필요한 확장들의 설치에 사용돼요.
확장 자체는 어떤 스키마에도 속한다고 간주되지 않는다는 것을 기억하세요. 확장은 데이터베이스 전체에서 고유해야 하는 비한정 이름을 가져요. 하지만 확장에 속하는 객체는 스키마 안에 있을 수 있어요.
version
설치할 확장의 버전이에요. 이는 식별자 또는 문자열 리터럴로 작성할 수 있어요. 기본 버전은 확장의 제어 파일에 지정된 버전이에요.
CASCADE
이 확장이 의존하는 확장 중 아직 설치되지 않은 것을 자동으로 설치해요. 그들의 의존성도 마찬가지로 재귀적으로 자동 설치돼요. SCHEMA 절은 주어진 경우 이렇게 설치되는 모든 확장에 적용돼요. 문의 다른 옵션은 자동 설치된 확장에는 적용되지 않아요. 특히 그들의 기본 버전이 항상 선택돼요.
Notes
CREATE EXTENSION을 사용해 확장을 데이터베이스에 로드하려면 먼저 그 확장의 지원 파일이 설치되어 있어야 해요. PostgreSQL과 함께 제공되는 확장을 설치하는 정보는 Additional Supplied Modules(추가 제공 모듈)에서 찾을 수 있어요.
현재 로드 가능한 확장은 pg_available_extensions 또는 pg_available_extension_versions 시스템 뷰에서 확인할 수 있어요.
주의 (Caution)
슈퍼유저로서 확장을 설치하는 것은 확장 작성자가 확장 설치 스크립트를 안전한 방식으로 작성했다고 신뢰하는 것을 요구해요. 악의적인 사용자가 부주의하게 작성된 확장 스크립트의 이후 실행을 훼손해서 그 사용자가 슈퍼유저 권한을 얻을 수 있게 만드는 트로이 목마 객체를 만드는 것은 그렇게 어렵지 않아요. 하지만 트로이 목마 객체는 스크립트 실행 중
search_path에 있을 때만 위험하며, 이는 그들이 확장의 설치 대상 스크립트나 그것이 의존하는 어떤 확장의 스키마에 있다는 뜻이에요. 따라서 스크립트가 신중히 검증되지 않은 확장을 다룰 때의 좋은 경험 법칙은, 신뢰할 수 없는 어떤 사용자에게CREATE권한이 주어지지 않았고 앞으로도 주어지지 않을 스키마에만 설치하는 거예요. 그들이 의존하는 확장도 마찬가지예요.
PostgreSQL과 함께 제공되는 확장들은, 몇 가지가 다른 확장에 의존하는 경우를 제외하고, 이런 설치 시점 공격으로부터 안전하다고 여겨져요. 그 확장들의 문서에 명시된 대로 보안 스키마에 설치하거나, 의존하는 확장들과 같은 스키마에 설치하거나, 또는 둘 다 해야 해요.
새 확장을 작성하는 정보는 36.17 절을 참고해요.
Examples
현재 데이터베이스에 hstore 확장을 설치하고 그 객체를 스키마 addons에 배치하기:
CREATE EXTENSION hstore SCHEMA addons;
같은 일을 하는 또 다른 방법:
SET search_path = addons;
CREATE EXTENSION hstore;
Compatibility
CREATE EXTENSION은 PostgreSQL 확장이에요.