답변:
확장을 설치하지 마십시오 pg_catalog
: 당신이 시스템 카탈로그에 혼란을하지 않기 때문에 (즉, 기본 않는 한 거의 확장은 그런 식으로 설계되어 있습니다) 지금까지 . @Chris 는 한 가지 이유를 보여줍니다. 다른 것도 있습니다.
그러나 "public"스키마는 특별한 것이 아닙니다 . 표준 배포판에 사전 설치된 기본 스키마 일 뿐이므로 바로 시작할 수 있습니다. 일부 DB 관리자는 "공개"스키마를 전혀 사용하지 않고 일부는 삭제하기도합니다.
CREATE EXTENSION
"공개"스키마와 관련이 없습니다. 별도의 지시가없는 한 현재 스키마에 설치됩니다. 일부 확장에는 사전 설정된 스키마 (예 : PGQ / Londiste )가 있습니다. 설명서 :
schema_name
확장 기능으로 컨텐츠를 재배치 할 수있는 경우 확장 기능을 설치할 스키마의 이름입니다. 명명 된 스키마가 이미 존재해야합니다. 지정하지 않고 확장의 제어 파일이 스키마를 지정하지 않으면 현재 기본 오브젝트 작성 스키마가 사용됩니다 .
확장 자체는 스키마 내에있는 것으로 간주되지 않습니다. 확장에는 데이터베이스 전체에서 고유해야하는 규정되지 않은 이름이 있습니다. 그러나 확장에 속하는 개체는 스키마 내에있을 수 있습니다.
대담한 강조 광산.
사용자, 스키마 및 관리 방법을 결정하십시오 search_path
.
그런 다음 확장을 설치할 위치를 결정하십시오. 선택한 스키마에 설치하고 search_path
모든 사용자 의 기본값 또는 일부 또는 전혀없는 사용자에 대한 스키마를 기본값으로 포함 할 수 있습니다 (따라서 규정 된 참조가 필요함). 그것은 모두 당신이 달성하고자하는 것에 달려 있습니다.
무엇을하든 일관성을 유지하십시오.
전용 "확장"스키마에 확장 (설치 가능)을 설치하고 싶습니다.이 확장은 "public"(및 "$ user"(이를 사용하는 경우)) search_path
뒤에 기본값으로 포함됩니다 . 내 자신의 공용 기능과 다른 공용 개체를 깔끔하게 분리 할 수 있습니다. 내 설정 postgresql.conf
:
search_path = "$user",public,extensions
또는:
search_path = public,extensions
그리고 다음을 사용하여 확장을 설치합니다.
CREATE EXTENSION some_extension SCHEMA extensions;
한 가지주의 할 사항 :이 방법으로 extensions
스키마에서 동일한 이름 (및 매개 변수)의 오브젝트 뒤에 있는 스키마 에서 오브젝트를 "숨길"(정규화되지 않은) 수 있습니다 public
.
관련 :
In PostgreSQL 9.0 and later, PL/pgSQL is installed by default. However it is still a loadable module, so especially security-conscious administrators could choose to remove it.
pg_catalog
. (변경하려고하면 오류가 발생합니다.) 이것은 함수용 절차 언어 확장을 설치하기위한 표준입니까?
pg_catalog
내가 아는 한 확장 프로그램을 설치하는 것은 권장되지 않습니다. 기본 public
스키마도 사용해야합니다. 기본 스키마도 search_path
기본적으로 있습니다.
예를 들어, 스키마 pageinspect
내에서 이미 만든 확장을 사용하여 작업 합니다 public
. 기본적으로 모든 함수는 스키마에있는 데이터베이스의 모든 스키마에 액세스 할 수 있습니다 public
.
이제는 다음을 사용하여 pg_catalog
스키마로 옮깁니다.
ALTER EXTENSION pageinspect SET SCHEMA pg_catalog;
그리고 그것은 잘 작동합니다.
그러나...
다시 public
사용 하여 스키마로 다시 이동하십시오.
ALTER EXTENSION pageinspect SET SCHEMA public;
허용하지 않으므로 다음 오류가 발생합니다.
ERROR: cannot remove dependency on schema pg_catalog because it is a system object
SQL state: 0A000
어 오! 글쎄, 그것은 내가 그것을 움직이게하지 않을 것입니다. public
스키마를 삭제하고 다시 만들어 스키마 로 다시 가져올 수 있습니다 .
DROP EXTENSION pageinspect;
CREATE EXTENSION pageinspect;
그래 좋아. 다시 public
스키마 의 올바른 위치 에 있으며 데이터베이스의 모든 스키마에서 함수에 여전히 액세스 할 수 있습니다.
TL, DR; public
확장 에는 기본 스키마 만 사용하십시오 .
plpgsql
확장은 어떻게 든이 규칙의 예외입니까? 내가 본 모든 설치는 pg_catalog에이 확장이 있습니다