이 문서는 지원되지 않는 버전의 PostgreSQL 용입니다.
당신은에 대해 같은 페이지를 볼 수 있습니다PostgreSQL : 문서 : 17 : 36.17. 관련 객체를 스포츠 토토 사이트자로 포장버전 또는 위에 나열된 다른 지원 버전 중 하나입니다.

35.15. 관련 토토 핫 확대

유용한 확장PostgreSQL일반적으로 여러 SQL을 포함합니다 사물; 예를 들어, 새로운 데이터 유형에는 새로운 기능이 필요합니다. 새로운 운영자 및 아마도 새로운 인덱스 운영자 클래스. 그것은 이 모든 객체를 단일 패키지로 수집하는 데 도움이됩니다. 데이터베이스 관리 단순화.PostgreSQL그러한 패키지를 호출 a확장. 확장을 정의하려면 필요합니다 최소한 A스크립트 파일SQLExtension의 토토 핫 및 A제어 파일확장 자체의 몇 가지 기본 속성을 지정합니다. 만약에 확장에는 C 코드가 포함되며 일반적으로 C 코드가 구축 된 공유 라이브러리 파일. 한 번 이 파일이 있습니다. 간단한확장 생성명령을로드합니다 데이터베이스에 개체.

단지 확장을 사용하는 주요 장점 실행SQL로드 스크립트"느슨한"당신의 물체 데이터베이스,PostgreSQL그런 다음 확장자의 객체가 함께. 단일로 모든 객체를 삭제할 수 있습니다드롭 확장명령 (필요 없음 별도의 유지"un enclall"스크립트). 훨씬 더 유용합니다.pg_dump그것을 버리지 말아야한다는 것을 알고 있습니다 확장자의 개별 회원 객체 - 단지 포함됩니다. 에이확장 생성덤프의 명령, 대신에. 이것은 새로운 버전의 마이그레이션을 크게 단순화합니다. 더 많은 객체를 포함 할 수있는 확장자 오래된 버전. 그러나 확장자가 있어야합니다 이러한로드 할 때 사용 가능한 컨트롤, 스크립트 및 기타 파일 새 데이터베이스에 덤프하십시오.

PostgreSQL당신을 허락하지 않을 것입니다 확장에 포함 된 개별 객체를 전체 확장을 떨어 뜨립니다. 또한 변경할 수 있습니다 확장 멤버 객체의 정의 (예 : via함수 생성 또는 교체a 기능), 수정 된 정의는 버려pg_dump. 그런 변화 일반적으로 동시에 같은 변경을하는 경우에만 합리적입니다. 확장자의 스크립트 파일에서. (그러나 특별 조항이 있습니다 구성 데이터를 포함하는 테이블; 아래를 참조하십시오.)

확장 메커니즘에는 포장 조항도 있습니다 SQL의 정의를 조정하는 수정 스크립트 확장에 포함 된 객체. 예를 들어, 버전 1.1의 경우 확장자는 한 기능을 추가하고 다른 기능을 변경합니다. 함수 1.0과 비교하여 확장자 저자는 A를 제공 할 수 있습니다스크립트 토토 핫그 두 가지만 만듭니다 변화. 그만큼Alter Extension Update명령을 사용하여 이러한 변경 사항을 적용하고 추적 할 수 있습니다. 확장 버전은 실제로 주어진에 설치됩니다. 데이터 베이스.

확장의 구성원이 될 수있는 SQL 객체의 종류 의 설명에 표시됩니다.Alter Extension. 특히 물체 데이터베이스, 역할 및와 같은 데이터베이스 클러스터 전체입니다 테이블 스페이스, 확장자가 있기 때문에 확장 멤버가 될 수 없습니다 하나의 데이터베이스 내에서만 알려져 있습니다. (확장 스크립트는 있지만 그러한 객체를 만드는 것은 금지되지 않습니다. 확장의 일부로 추적되지 않습니다.) 또한 테이블은 연장의 회원이 될 수 있지만 자회사는 인덱스와 같은 개체는 직접 구성원으로 간주되지 않습니다. 확장. 또 다른 중요한 요점은 스키마가 속할 수 있다는 것입니다 확장에 이르지만 그 반대는 아닙니다. 자격이없는 이름이며 존재하지 않습니다"내"모든 스키마. 확장 회원 그러나 물체는 적절할 때마다 스키마에 속합니다 그들의 객체 유형. 그것은 적절하거나 적합하지 않을 수 있습니다 스키마를 소유하려면 멤버 객체가 내부에 있습니다.

35.15.1. 확장 파일

thePostgreSQL : 문서 : 9.2 : 토토 결과 생성명령은 각 확장자의 제어 파일에 의존합니다. 접미사로 확장자와 동일하게.control설치Sharedir/Extension디렉토리. 적어도 하나가 있어야합니다SQL이름 지정을 따르는 스크립트 파일 무늬Extension--버전.SQL(예 :foo--1.0.sql버전1.0확장foo). 기본적으로 스크립트 파일도에 배치됩니다.Sharedir/Extension디렉토리; 그러나 제어 파일은 스크립트의 다른 디렉토리를 지정할 수 있습니다. 파일.

확장 제어 파일의 파일 형식은 다음과 같습니다.postgresql.conf파일, 즉 목록parameter_name = value한 줄 당 과제. 공백 에 의해 소개 된 줄과 의견#are 허용된. 한 단어가 아닌 값을 인용하십시오. 또는 번호.

컨트롤 파일은 다음 매개 변수를 설정할 수 있습니다.

디렉토리(String)

Extension 's를 포함하는 디렉토리SQL스크립트 파일. 절대 경로가 주어지지 않는 한 이름은 설치Sharedir디렉토리. 기본 동작은 동일합니다 지정디렉토리 = '확대'.

default_version(String)

확장자의 기본 버전 (That 버전이 지정되지 않은 경우 설치됩니다확장 생성). 이건 생략 할 수 있습니다.확장 생성아니오이면 실패버전옵션이 나타나므로 일반적으로 나타납니다 그렇게하고 싶지 않습니다.

댓글(String)

확장에 대한 주석 (모든 문자열). 또는 주석은를 통해 설정할 수 있습니다.댓글스크립트 파일.

인코딩(String)

스크립트 파일에서 사용하는 문자 세트 인코딩. 스크립트 파일에 비 ASCII 문자. 그렇지 않으면 파일이 가정됩니다 데이터베이스 인코딩에있을 것입니다.

module_pathname(String)

이 매개 변수의 값은 대체됩니다 각각module_pathname스크립트 파일에서. 만약에 설정되지 않으며 대체는 없습니다. 일반적으로 이것은입니다 로 설정됩니다$ libdir/shared_library_nameandmodule_pathname함수 만들기명령 C-language functions로 스크립트 파일이 그렇지 않습니다 공유 라이브러리의 이름을 하드 와이어해야합니다.

요구(String)

이 확장자의 확장 이름 목록 예를 들어에 따라 다릅니다.요구 사항 = 'foo, bar'. 이러한 확장자는 설치해야합니다 이것을 설치하기 전에.

SuperUser(부울)

이 매개 변수 인 경우true(기본값), 슈퍼 사용자만이 만들 수 있습니다 확장 또는 새 버전으로 업데이트하십시오. 로 설정된 경우거짓, 단지 특권 설치에서 명령을 실행하는 데 필요합니다 업데이트 스크립트가 필요합니다.

rejocatable(부울)

확장자는rejocatable포함 된 개체를 확장 초기 생성 후 다른 스키마. 기본값은거짓, 즉 확장은 재배치 할 수 없습니다. 자세한 내용은 아래를 참조하십시오 정보.

스키마(String)

이 매개 변수는 relocaitable에 대해서만 설정할 수 있습니다 확장. 그것은 확장을 강제로 적재합니다 정확히 이름이 지정된 스키마와 다른 스키마가 아닙니다. 아래를 참조하십시오 더 많은 정보.

기본 제어 파일 외에확장.Control, 확장 할 수 있습니다 스타일에 이름이 지정된 보조 제어 파일이 있습니다확장--버전19999_20009. 제공되는 경우, 이것들 스크립트 파일 디렉토리에 있어야합니다. 보조 제어 파일은 기본 제어 파일과 동일한 형식을 따릅니다. 어느 보조 제어 파일에 설정된 매개 변수는 기본을 무시합니다. 해당 버전을 설치하거나 업데이트 할 때 제어 파일 확대. 그러나 매개 변수디렉토리anddefault_version보조로 설정할 수 없습니다 제어 파일.

확장자SQL스크립트 파일에는 트랜잭션을 제외한 모든 SQL 명령이 포함될 수 있습니다 제어 명령 (시작, 커밋등) 및 명령 트랜잭션 블록 내부에서 실행 (예 :진공). 스크립트 파일이 있기 때문입니다 트랜잭션 블록 내에서 암시 적으로 실행됩니다.

AN EXTENSION 'sSQL스크립트 파일은로 시작하는 줄도 포함 할 수 있습니다.\ echo, 무시됩니다 ( 의견) 확장 메커니즘에 의해. 이 조항은입니다 스크립트 파일에 공급되는 경우 일반적으로 오류를 던지는 데 사용됩니다PSQL로드되지 않고 을 통해확장 생성(예제 참조 아래 스크립트). 그 없이는 사용자가 실수로로드 할 수 있습니다 Extension의 내용으로"느슨한"확장보다는 대상, 업무 상태 회복하기가 약간 지루합니다.

스크립트 파일에는 허용 된 문자가 포함될 수 있습니다. 지정된 인코딩, 제어 파일에는 일반 만 포함되어야합니다 ASCII, 방법이 없기 때문에PostgreSQL컨트롤을 인코딩하는 것을 알기 위해 파일이 있습니다. 실제로 이것은 원한다면 문제입니다. Extension의 의견에 비 ASCII 문자를 사용하십시오. 이 경우 권장되는 관행은 컨트롤을 사용하지 않는 것입니다. 파일댓글매개 변수 사용확장에 대한 의견a 주석을 설정하려면 스크립트 파일

35.15.2. 확장 재배치

사용자는 종종 Extension의 저자와 다른 스키마로의 확장 염두에 두었습니다. 지원되는 세 가지 수준이 있습니다 이전 성 :

  • 완전히 재배치 가능한 확장을 다른 확장으로 이동할 수 있습니다 스키마는 데이터 베이스. 이것은와 함께 이루어집니다.ALTER 확장 세트 스키마자동으로 명령 모든 멤버 객체를 새 스키마로 이름을 바꿉니다. 일반적으로 확장에 포함 된 경우에만 가능합니다 어떤 스키마에 대한 내부 가정이 없습니다 객체가 있습니다. 또한 확장자의 객체는 모두 시작할 수있는 한 스키마에서 (그렇지 않은 개체를 무시 절차 언어와 같은 모든 스키마에 속함). 마크 a 설정으로 완전히 재배치 가능한 확장rejocatable = true제어 파일의

  • 설치 중에 확장이 재배치 할 수 있습니다 그러나 나중에는 아닙니다. 이것은 일반적으로 그렇습니다 Extension의 스크립트 파일은 대상을 참조해야합니다 스키마는 명시 적으로, 예를 들어 설정search_pathSQL 함수의 속성. 그러한 연장을 위해이전 가능 = 거짓제어 파일에서@extschema@대상 스키마를 참조하려면 스크립트 파일. 이 문자열의 모든 발생은 될 것입니다 이전의 실제 대상 스키마 이름으로 대체되었습니다 스크립트가 실행됩니다. 사용자는 대상 스키마를 설정할 수 있습니다 사용 사용스키마옵션확장 생성.

  • 확장자가 재배치를 전혀 지원하지 않으면 설정rejocatable = false통제 파일, 또한 설정스키마의도 된 대상 스키마의 이름. 이것은 사용을 방해합니다 의스키마옵션확장 생성, 그것을 지정하지 않는 한 제어 파일에 이름이 지정된 동일한 스키마. 이 선택은입니다 확장자에 내부가 포함 된 경우 일반적으로 필요합니다 대체 할 수없는 스키마 이름에 대한 가정 의 사용@extschema@. 그만큼@extschema@대체 메커니즘 이 경우에도 사용할 수 있지만 제한적이지만 스키마 이름은 컨트롤에 의해 결정되므로 사용합니다. 파일.

모든 경우에 스크립트 파일은로 실행됩니다.search_path처음에는 대상 스키마를 가리키도록 설정했습니다. 즉,확장 생성동등합니다 이것의 :

@extschema @;로 Local Search_Path를 설정하십시오.

이것은 스크립트 파일로 생성 된 개체가 이동할 수 있습니다. 대상 스키마로. 스크립트 파일이 변경 될 수 있습니다search_path원하는 경우 일반적으로 그렇습니다 탐탁지 않은.search_path복원되었습니다 완료시 이전 설정으로확장 생성.

대상 스키마는에 의해 결정됩니다스키마제어 파일의 매개 변수입니다 주어진, 그렇지 않으면스키마옵션 의확장 생성그것이 주어진 경우, 그렇지 않으면 현재 기본 객체 생성 스키마 (첫 번째 발신자 중 하나search_path). 언제 제어 파일스키마매개 변수입니다 사용 된 대상 스키마는 아직 그렇지 않은 경우 생성됩니다. 존재하지만 다른 두 경우에는 이미 존재해야합니다.

전제 조건 확장이 나열된 경우요구제어 파일에서 대상 스키마는의 초기 설정에 추가됩니다.search_path. 이것은 그들의 대상이 될 수있게한다 새 확장자의 스크립트 파일에 표시됩니다.

relocatable 확장에 객체를 포함 할 수 있지만 여러 스키마에 퍼지면 일반적으로 바람직합니다 외부 사용을위한 모든 객체를 단일에 배치하십시오. 확장자의 대상 스키마로 간주되는 스키마. 그런 배열은 기본 설정과 편리하게 작동합니다.search_path생성 중 종속 확장.

35.15.3. 확장 구성 테이블

일부 확장에는 구성 테이블이 포함되어 있습니다 이후 사용자가 추가하거나 변경할 수있는 데이터 확장 설치. 일반적으로 테이블이 일부인 경우 연장, 테이블의 정의 나 그 내용도pg_dump. 하지만 그 동작은 구성 테이블의 경우 바람직하지 않습니다. 어느 사용자의 데이터 변경은 덤프에 포함되어야합니다. 확장은 덤프 후에 다르게 행동합니다 Reload.

이 문제를 해결하려면 확장자의 스크립트 파일이 테이블 구성 테이블로 생성되었으므로 원인pg_dump테이블을 포함합니다 덤프의 내용 (정의가 아님). 그렇게하려면 전화하십시오 기능pg_extension_config_dump (regclass, text)테이블을 만든 후

테이블 작성 my_config (키 텍스트, 값 텍스트);

pg_catalog.pg_extension_config_dump를 선택하십시오 ( 'my_config', '');

테이블 수는 이런 식으로 표시 될 수 있습니다.

두 번째 인수pg_extension_config_dump빈 문자열입니다. 테이블의 전체 내용은pg_dump. 이것은 일반적으로 만 정확합니다 테이블은 처음에 확장자에 의해 생성 된대로 비어 있습니다. 스크립트. 초기 데이터가 혼합되어 있고 사용자가 제공 한 경우 표에있는 데이터,의 두 번째 주장pg_extension_config_dump제공 a여기서데이터를 선택하는 조건 버려야합니다. 예를 들어, 할 수 있습니다

테이블 작성 my_config (키 텍스트, 값 텍스트, Standard_Entry boolean);

pg_catalog.pg_extension_config_dump를 선택하십시오 ( 'my_config', 'standard_entry가 아닌 곳');

그런 다음Standard_Entry는 행에서만 사실입니다 Extension의 스크립트에 의해 생성되었습니다.

초기에 제공되는 행과 같은 더 복잡한 상황 사용자가 수정할 수 있으며 작성하여 처리 할 수 ​​있습니다. 구성 테이블을 트리거하여 수정되도록합니다 행이 올바르게 표시됩니다.

a와 관련된 필터 조건을 변경할 수 있습니다 전화로 구성 테이블pg_extension_config_dump다시. (이것은 할 것이다 일반적으로 확장 업데이트 스크립트에서 유용합니다.) 더 이상 구성 테이블이 아닌 테이블을 표시하는 방법 로 확장자에서 분리하십시오.ALTER 확장 ... 드롭 테이블.

이 테이블 사이의 외국 주요 관계 테이블이 덤프하는 순서를 지시합니다. pg_dump. 구체적으로, pg_dump는 덤프를 시도합니다 참조 테이블 전에 참조 테이블. 로서 외국의 주요 관계는 확장 시간 Create에서 설정됩니다. (데이터가 테이블에로드되기 전에) 원형 종속성은 지원되지 않습니다. 원형 의존성이있을 때 존재하면 데이터가 여전히 덤프되지만 덤프는 그렇지 않습니다. 직접 복원 할 수 있고 사용자 개입이 필수의.

35.15.4. 확장 업데이트

확장 메커니즘의 한 가지 장점은 그것이 제공한다는 것입니다. SQL 명령에 대한 업데이트를 관리하는 편리한 방법 확장자의 객체를 정의하십시오. 이것은 a를 연관시킴으로써 이루어집니다 릴리스 된 각 버전의 버전 이름 또는 번호 Extension의 설치 스크립트. 또한 사용자가 원하는 경우 데이터베이스에서 동적으로 데이터베이스를 업데이트 할 수 있으려면 다음에 버전을 제공해야합니다스크립트 토토 핫필요한 변경을 수행합니다 한 버전에서 다음 버전으로 이동합니다. 업데이트 스크립트에는 이름이 있습니다 패턴 따르기Extension--Oldversion--Newversion.SQL(예 :foo--1.0--1.1.sql버전 수정 명령1.0OF 확대foo버전1.1).

적절한 토토 핫 스크립트를 사용할 수 있다는 점에서 명령Alter Extension Update의지 지정된 새 버전으로 설치된 확장자를 업데이트하십시오. 그만큼 업데이트 스크립트는와 같은 환경에서 실행됩니다.확장 생성설치를 제공합니다 스크립트 : 특히search_pathIS 같은 방식으로 설정하고 스크립트는 확장자에 자동으로 추가됩니다.

확장자에 보조 제어 파일이있는 경우 컨트롤 업데이트 스크립트에 사용되는 매개 변수는 다음과 같습니다. 스크립트의 대상 (신규) 버전과 관련이 있습니다.

토토 핫 메커니즘은 중요한 것을 해결하는 데 사용할 수 있습니다. 특별 사례 : 변환"느슨한"확장자로 개체 모음. 확장 전에 메커니즘이 추가되었습니다PostgreSQL(9.1), 많은 사람들이 썼습니다 단순히 모듬이 포장되지 않은 확장 모듈 사물. 이러한 객체가 포함 된 기존 데이터베이스가 주어지면 객체를 올바르게 패키지로 변환 할 수있는 방법 확대? 그들을 떨어 뜨린 다음 평범한 일을합니다확장 생성는 한 가지 방법이지만 그렇지 않습니다 객체에 종속성이있는 경우 바람직합니다 (예 : if 데이터 유형의 테이블 열이 확대). 이 상황을 해결하는 방법은 빈을 만드는 것입니다. 확장, 그런 다음 사용확장 변경 추가하다각 기존 객체를 확장자에 첨부하려면, 그런 다음 마지막으로 현재에있는 새 개체를 만듭니다. 확장 버전이지만 포장되지 않은 릴리스에 없었습니다.확장 생성이 경우를 지원합니다 그것과 함께From Old_version옵션으로 인해 발생합니다 대상 버전의 일반 설치 스크립트를 실행하지 않으며 그러나 대신에 이름이 지정된 업데이트 스크립트확장--Old_version--target_version.SQL. 선택 as as를 사용할 더미 버전 이름Old_version는 확장에 달려 있습니다 그래도 저자포장되지 않은는 일반적입니다 협약. 여러 이전 버전이있는 경우 확장 스타일로 업데이트 할 수 있고 다중 더미 버전을 사용하십시오. 그것들을 식별하는 이름.

Alter Extension실행할 수 있습니다 요청 된 업데이트를 달성하기 위해 업데이트 스크립트 파일 시퀀스. 예를 들어, 만foo--1.0--1.1.sqlfoo--1.1-2.0.sql사용 가능,Alter Extension를 적용합니다 버전 업데이트 인 경우 시퀀스2.0요청됩니다1.0현재입니다 설치.

PostgreSQL가정하지 않습니다 버전 이름의 속성에 대한 모든 것 : 예를 들어, IT 모르겠다1.1다음1.0. 그것은 단지 사용 가능한 것과 일치합니다 버전 이름 및 적용 해야하는 경로를 따릅니다. 가장 적은 업데이트 스크립트. (버전 이름은 실제로 그럴 수 있습니다 포함하지 않는 문자열--또는 선도 또는 후행-.)

때로는 제공하는 것이 유용합니다"다운 그레이드"스크립트, 예를 들어foo--1.1-1-1.0.sql변경 사항을 되돌릴 수 있습니다 버전과 관련1.1. 당신이한다면 그것은 다운 그레이드 스크립트가 가능성에주의를 기울여야합니다. 더 짧은 수율이기 때문에 예기치 않게 적용될 수 있습니다 길. 위험한 사례는 A가있는 곳입니다."빠른 경로"앞으로 점프하는 스크립트를 업데이트하십시오 빠른 다운 그레이드 스크립트뿐만 아니라 여러 버전 경로의 시작점. 적용하는 데 더 적은 단계가 필요할 수 있습니다 다운 그레이드 및 빠른 경로는 하나의 버전을 앞서 나가는 것보다 한 번에. 다운 그레이드 스크립트가 대체 할 수없는 경우 객체, 이것은 바람직하지 않은 결과를 낳을 것입니다.

예기치 않은 토토 핫 경로를 확인하려면이 명령을 사용하십시오.

선택 *에서 pg_extension_update_paths ( 'Extension_name');

이것은 각각의 알려진 버전 이름의 각 쌍을 보여줍니다. 업데이트 경로 시퀀스와 함께 지정된 확장자 소스 버전에서 대상 버전, 또는NULL아니오가있는 경우 사용 가능한 토토 핫 경로. 경로는 텍스트 형식으로 표시됩니다.--분리기. 사용할 수 있습니다regexp_split_to_array (path, '-')원하는 경우 배열 형식.

35.15.5. 확장 예제

여기에 완전한 예가 있습니다SQL-2 요소 복합재 인 연장 슬롯에 모든 유형의 값을 저장할 수있는 유형 이름"K"and37181_37186. 비 텍스트 값은 자동으로 강요됩니다 스토리지 텍스트.

스크립트 파일쌍-1.0.sql다음과 같이 보입니다 :

- 스크립트가 PSQL에 소스가 생성 된 확장자를 통한 것이 아니라 불만 사항
\ echo는 "확장 쌍을 만들기 위해"만들기 "를로드합니다. \그만두다

(k text, v text)로 유형 쌍을 만듭니다.

함수 쌍 생성 또는 교체 (Anylement, Text)
쌍 언어 SQL을 'select row ($ 1, $ 2) :: pair'로 반환합니다.

함수 쌍 생성 또는 교체 (텍스트, Anylement)
쌍 언어 SQL을 'select row ($ 1, $ 2) :: pair'로 반환합니다.

함수 쌍 생성 또는 교체 (Anylement, Any Element)
쌍 언어 SQL을 'select row ($ 1, $ 2) :: pair'로 반환합니다.

함수 쌍 생성 또는 교체 (텍스트, 텍스트)
쌍 언어 SQL을 'select row ($ 1, $ 2) :: pair;'로 반환합니다.

연산자 생성 ~ (leftarg = text, rightarg = anylement, procedure = pair);
연산자 생성 ~ (leftarg = anylement, rightarg = text, procedure = pair);
연산자 생성 ~ (leftarg = anylement, rightarg = anylement, procedure = pair);
연산자 생성 ~ (leftarg = 텍스트, rightarg = text, process = pair);

제어 파일pair.control다음과 같습니다.

# 쌍 확장
댓글 = '키/값 쌍 데이터 유형'
default_version = '1.0'
regocatable = true

이 두 파일을 설치하려면 makefile이 거의 필요하지 않습니다. 올바른 디렉토리로 A를 사용할 수 있습니다.makefile이것을 포함하는 :

Extension = 쌍
데이터 = 쌍-1.0.sql

pg_config = pg_config
pgxs : = $ (shell $ (pg_config) --pgxs)
$ (pgxs) 포함

이 makefile의 의존PGXS,섹션 35.16. 명령설치컨트롤 및 스크립트를 설치합니다 에 의해보고 된대로 올바른 디렉토리에 파일PG_CONFIG.

파일이 설치되면를 사용하십시오.확장 생성로드 명령 특정 데이터베이스에 대한 토토 핫.