pg_catalog 스키마에 확장을 설치하는 것이 좋습니다?


답변:


16

확장을 설치하지 마십시오 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.

관련 :


좋아, plpgsql확장은 어떻게 든이 규칙의 예외입니까? 내가 본 모든 설치는 pg_catalog에이 확장이 있습니다
zam6ak

@ zam6ak : 예, plpgsql은 특별한 경우입니다 : 매뉴얼 인용 :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.
Erwin Brandstetter

1
plv8도 자신을 설치합니다 pg_catalog. (변경하려고하면 오류가 발생합니다.) 이것은 함수용 절차 언어 확장을 설치하기위한 표준입니까?
jpmc26

6

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확장 에는 기본 스키마 만 사용하십시오 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.