이 문서는 지원되지 않는 PostgreSQL 버전에 대한 것입니다.
당신은 다음과 같은 페이지를 보고 싶을 수도 있습니다.PostgreSQL : 문서 : 17 : 36.17. 관련 객체를 스포츠 토토 사이트자로 포장버전 또는 위에 나열된 다른 지원 버전 중 하나를 사용하세요.

36.15. 관련 객체를 토토 핫으로 패키징

유용한 토토 핫포스트그레SQL일반적으로 여러 SQL 개체를 포함합니다. 예를 들어, 새로운 데이터 유형에는 새로운 함수, 새로운 연산자, 그리고 아마도 새로운 인덱스 연산자 클래스가 필요할 것입니다. 데이터베이스 관리를 단순화하려면 이러한 모든 객체를 단일 패키지로 수집하는 것이 도움이 됩니다.포스트그레SQL그러한 패키지를 호출합니다.토토 핫. 토토 핫을 정의하려면 최소한 a가 필요합니다.스크립트 파일다음을 포함함SQL토토 핫 프로그램의 개체를 생성하는 명령 및 a제어 파일토토 핫 프로그램 자체의 몇 가지 기본 속성을 지정합니다. 토토 핫에 C 코드가 포함된 경우 일반적으로 C 코드가 빌드된 공유 라이브러리 파일도 있습니다. 이러한 파일이 있으면 간단한PostgreSQL : 문서명령은 개체를 데이터베이스에 로드합니다.

단순히 실행하는 것보다 토토 핫 프로그램을 사용하는 것의 주요 이점SQL다발을 로드하는 스크립트"느슨한"개체를 데이터베이스에 추가하는 것입니다.포스트그레SQL그러면 토토 핫의 개체가 함께 작동한다는 것을 이해할 것입니다. 단일로 모든 객체를 삭제할 수 있습니다.삭제 토토 핫명령(별도 유지관리 필요 없음"제거"스크립트). 더욱 유용합니다.pg_dump토토 핫 프로그램의 개별 구성원 개체를 덤프해서는 안 된다는 것을 알고 있습니다. 단지 다음을 포함할 것입니다.토토 핫 프로그램 만들기11102_11402

포스트그레SQL전체 토토 핫을 삭제하는 경우를 제외하고는 토토 핫에 포함된 개별 개체를 삭제할 수 없습니다. 또한 토토 핫 멤버 객체의 정의를 변경할 수도 있지만(예: via함수 생성 또는 교체함수), 수정된 정의는 다음에 의해 덤프되지 않는다는 점을 명심하세요.pg_dump. 이러한 변경은 일반적으로 토토 핫 프로그램의 스크립트 파일에서 동일한 변경을 동시에 수행하는 경우에만 의미가 있습니다. (그러나 구성 데이터가 포함된 테이블에 대한 특별한 조항이 있습니다. 참조섹션 36.15.3.) 프로덕션 상황에서는 일반적으로 토토 핫 업데이트 스크립트를 생성하여 토토 핫 구성원 개체를 변경하는 것이 좋습니다.

토토 핫 스크립트는 다음을 사용하여 토토 핫의 일부인 개체에 대한 권한을 설정할 수 있습니다.그랜트그리고취소문장. 각 객체에 대한 최종 권한 세트(설정된 경우)는메이저 토토 사이트 : 문서시스템 카탈로그. 언제pg_dump이 사용됩니다.토토 핫 프로그램 만들기명령이 덤프에 포함되고 그 뒤에는그랜트그리고취소객체에 대한 권한을 덤프가 수행된 당시의 권한으로 설정하는 데 필요한 명령문.

PostgreSQL현재 토토 핫 스크립트 발행을 지원하지 않습니다.정책 작성또는보안 라벨문장. 이는 토토 핫이 생성된 후에 설정될 것으로 예상됩니다. 토토 핫 개체의 모든 RLS 정책 및 보안 레이블은 다음에 의해 생성된 덤프에 포함됩니다.pg_dump.

토토 핫 메커니즘에는 토토 핫에 포함된 SQL 개체의 정의를 조정하는 수정 스크립트 패키징을 위한 조항도 있습니다. 예를 들어 토토 핫 프로그램 버전 1.1이 1.0과 비교하여 하나의 함수를 추가하고 다른 함수의 본문을 변경하는 경우 토토 핫 프로그램 작성자는업데이트 스크립트이 두 가지만 변경합니다.토토 핫 프로그램 업데이트 변경13776_13910

토토 핫 프로그램의 구성원이 될 수 있는 SQL 개체의 종류는 다음에 대한 설명에 표시됩니다.PostgreSQL :. 특히 데이터베이스, 역할, 테이블스페이스 등 데이터베이스 클러스터 전체에 적용되는 개체는 토토 핫 멤버가 될 수 없습니다. 토토 핫은 하나의 데이터베이스 내에서만 알려져 있기 때문입니다. (토토 핫 스크립트가 이러한 개체를 만드는 것이 금지되지는 않지만 그렇게 하면 토토 핫의 일부로 추적되지 않습니다.) 또한 테이블은 토토 핫의 멤버가 될 수 있지만 인덱스와 같은 보조 개체는 토토 핫의 멤버로 직접 간주되지는 않습니다. 또 다른 중요한 점은 스키마가 토토 핫에 속할 수 있지만 그 반대는 가능하지 않다는 것입니다. 토토 핫과 같은 토토 핫은 정규화되지 않은 이름을 가지며 존재하지 않습니다."내부"모든 스키마. 그러나 토토 핫의 구성원 개체는 해당 개체 유형에 적합할 때마다 스키마에 속합니다. 토토 핫 프로그램이 해당 구성원 개체가 포함된 스키마를 소유하는 것은 적절할 수도 있고 적합하지 않을 수도 있습니다.

36.15.1. 토토 핫 파일

PostgreSQL : 문서명령은 각 토토 핫자에 대한 제어 파일에 의존하며, 접미사가 붙은 토토 핫자와 동일하게 이름을 지정해야 합니다..control, 설치 위치에 배치되어야 합니다.SHAREDIR/토토 핫자디렉토리. 또한 하나 이상 있어야 합니다.SQL이름 지정 패턴을 따르는 스크립트 파일토토 핫--버전.sql(예:foo--1.0.sql버전용1.0토토 핫자foo). 기본적으로 스크립트 파일은SHAREDIR/토토 핫자디렉토리; 그러나 제어 파일은 스크립트 파일에 대해 다른 디렉터리를 지정할 수 있습니다.

토토 핫 제어 파일의 파일 형식은 토토 핫 제어 파일과 동일합니다.postgresql.conf파일, 즉의 목록매개변수_이름 = 할당, 한 줄에 하나씩. 에 의해 소개된 빈 줄과 주석#허용됩니다. 단일 단어나 숫자가 아닌 값은 반드시 인용하세요.

제어 파일은 다음 매개변수를 설정할 수 있습니다:

디렉토리 (문자열)

토토 핫 프로그램이 포함된 디렉토리SQL스크립트 파일. 절대 경로가 제공되지 않는 한 이름은 설치 경로를 기준으로 합니다.공유디르디렉토리. 기본 동작은 다음을 지정하는 것과 동일합니다.디렉토리 = '토토 핫'.

기본_버전 (문자열)

토토 핫 프로그램의 기본 버전(버전이 지정되지 않은 경우 설치될 버전)토토 핫 프로그램 만들기). 생략할 수 있지만 결과는 다음과 같습니다.토토 핫 프로그램 만들기아니면 실패버전옵션이 나타나므로 일반적으로 그렇게 하고 싶지 않습니다.

댓글 (문자열)

토토 핫 프로그램에 대한 설명(모든 문자열). 이 설명은 토토 핫을 처음 생성할 때 적용되지만 토토 핫 업데이트 중에는 적용되지 않습니다(사용자가 추가한 설명을 재정의할 수 있으므로). 또는 토토 핫의 주석은 다음을 작성하여 설정할 수 있습니다.댓글스크립트 파일의 명령.

인코딩 (문자열)

스크립트 파일에 사용되는 문자 세트 인코딩. 스크립트 파일에 ASCII가 아닌 문자가 포함된 경우 이를 지정해야 합니다. 그렇지 않으면 파일이 데이터베이스 인코딩에 있는 것으로 간주됩니다.

모듈_경로이름 (문자열)

이 매개변수의 값은 다음이 발생할 때마다 대체됩니다.MODULE_PATHNAME스크립트 파일에 있습니다. 설정되지 않은 경우 대체가 이루어지지 않습니다. 일반적으로 이는 다음과 같이 설정됩니다.$libdir/shared_library_name그리고 나서MODULE_PATHNAME다음에서 사용됨함수 생성C 언어 함수에 대한 명령이므로 스크립트 파일에 공유 라이브러리의 이름을 직접 연결할 필요가 없습니다.

요구 (문자열)

이 토토 핫이 의존하는 토토 핫 이름 목록, 예를 들어requires = 'foo, bar'. 이 토토 핫 프로그램을 설치하려면 먼저 해당 토토 핫 프로그램을 설치해야 합니다.

수퍼유저 (부울)

이 매개변수가 다음과 같은 경우(기본값), 슈퍼유저만 토토 핫 프로그램을 생성하거나 새 버전으로 업데이트할 수 있습니다. 으로 설정된 경우거짓, 설치 또는 업데이트 스크립트에서 명령어를 실행하는데 필요한 권한만 필요합니다.

재배치 가능 (부울)

토토 핫자는재배치 가능토토 핫을 처음 생성한 후 포함된 개체를 다른 스키마로 이동할 수 있는 경우. 기본값은거짓, 즉 토토 핫 프로그램을 재배치할 수 없습니다. 참조섹션 36.15.2더 많은 정보를 원하시면.

스키마 (문자열)

이 매개변수는 재배치 불가능한 토토 핫에 대해서만 설정될 수 있습니다. 토토 핫이 다른 스키마가 아닌 명명된 스키마에 정확히 로드되도록 강제합니다.스키마매개변수는 토토 핫 업데이트 중에는 참조되지 않고 처음 토토 핫을 생성할 때만 참조됩니다. 참조섹션 36.15.2자세한 내용은.

기본 제어 파일에 추가로토토 핫.control, 토토 핫에는 스타일로 명명된 보조 제어 파일이 있을 수 있습니다.토토 핫--버전.control. 제공된 경우 스크립트 파일 디렉터리에 있어야 합니다. 보조 제어 파일은 기본 제어 파일과 동일한 형식을 따릅니다. 보조 제어 파일에 설정된 모든 매개변수는 해당 버전의 토토 핫을 설치하거나 업데이트할 때 기본 제어 파일을 재정의합니다. 그러나 매개변수디렉토리그리고기본_버전보조 제어 파일에는 설정할 수 없습니다.

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

토토 핫 프로그램의SQL스크립트 파일에는 다음으로 시작하는 줄도 포함될 수 있습니다.\에코, 토토 핫 메커니즘에 의해 무시됩니다(주석으로 처리). 이 조항은 일반적으로 스크립트 파일이 제공되는 경우 오류를 발생시키는 데 사용됩니다.psql다음을 통해 로드되는 대신토토 핫 프로그램 생성(다음의 예제 스크립트 참조섹션 36.15.6). 그렇지 않으면 사용자가 실수로 토토 핫 프로그램의 콘텐츠를 다음과 같이 로드할 수 있습니다."느슨한"토토 핫 기능이 아닌 개체로 인해 복구하기가 다소 지루한 상태입니다.

스크립트 파일에는 지정된 인코딩에서 허용하는 모든 문자가 포함될 수 있지만 제어 파일에는 일반 ASCII만 포함되어야 합니다. 왜냐하면 그럴 수 있는 방법이 없기 때문입니다.PostgreSQL제어 파일의 인코딩이 무엇인지 알기 위해. 실제로 이는 토토 핫 기능의 주석에 ASCII가 아닌 문자를 사용하려는 경우에만 문제가 됩니다. 이 경우 권장되는 방법은 제어 파일을 사용하지 않는 것입니다.댓글매개변수 대신에 사용토토 핫에 대한 의견스크립트 파일 내에서 주석을 설정합니다.

36.15.2. 토토 핫 재배치성

사용자는 종종 토토 핫 프로그램 작성자가 염두에 두었던 것과 다른 스키마에 토토 핫 프로그램에 포함된 개체를 로드하려고 합니다. 재배치 가능성에는 세 가지 수준이 지원됩니다.

  • 완전히 재배치 가능한 토토 핫은 데이터베이스에 로드된 후에도 언제든지 다른 스키마로 이동할 수 있습니다. 이는 다음과 같이 수행됩니다.토토 핫 프로그램 설정 스키마 변경명령은 모든 구성원 개체의 이름을 새 스키마로 자동으로 바꿉니다. 일반적으로 이는 토토 핫에 개체가 어떤 스키마에 있는지에 대한 내부 가정이 없는 경우에만 가능합니다. 또한 토토 핫의 개체는 처음부터 모두 하나의 스키마에 있어야 합니다(절차적 언어와 같이 스키마에 속하지 않는 개체는 무시). 설정을 통해 완전히 재배치 가능한 토토 핫 프로그램을 표시하세요.재배치 가능 = true제어 파일에 있습니다.

  • 토토 핫 프로그램은 설치 중에 재배치가 가능하지만 이후에는 불가능합니다. 이는 일반적으로 토토 핫의 스크립트 파일이 대상 스키마를 명시적으로 참조해야 하는 경우입니다(예: 설정에서).검색_경로SQL 함수의 속성. 이러한 토토 핫의 경우 다음을 설정하세요.재배치 가능 = 거짓제어 파일에서 사용@extschema@스크립트 파일의 대상 스키마를 참조합니다. 이 문자열의 모든 항목은 스크립트가 실행되기 전에 실제 대상 스키마의 이름으로 대체됩니다. 사용자는를 사용하여 대상 스키마를 설정할 수 있습니다.스키마옵션토토 핫 프로그램 만들기.

  • 토토 핫 프로그램이 재배치를 전혀 지원하지 않는 경우 설정재배치 가능 = false제어 파일에 있고 또한 설정스키마의도된 대상 스키마의 이름입니다. 이렇게 하면의 사용이 방지됩니다.스키마옵션토토 핫 프로그램 만들기, 제어 파일에 명명된 동일한 스키마를 지정하지 않는 한. 이 선택은 일반적으로 토토 핫에 다음을 사용하여 대체할 수 없는 스키마 이름에 대한 내부 가정이 포함된 경우 필요합니다.@extschema@.@extschema@이 경우에도 대체 메커니즘을 사용할 수 있지만 스키마 이름은 제어 파일에 의해 결정되므로 사용이 제한되어 있습니다.

모든 경우에 스크립트 파일은 다음과 같이 실행됩니다.검색_경로처음에는 대상 스키마를 가리키도록 설정되었습니다. 즉,토토 핫 프로그램 만들기이와 동등한 작업을 수행합니다:

로컬 검색 경로를 @extschema@, pg_temp로 설정;

이것은 스크립트 파일에 의해 생성된 개체가 대상 스키마로 들어갈 수 있도록 허용합니다. 스크립트 파일은 변경될 수 있습니다.검색_경로원한다면, 그러나 일반적으로 바람직하지 않습니다.검색_경로완료되면 이전 설정으로 복원됩니다.토토 핫 프로그램 만들기.

대상 스키마는 다음에 의해 결정됩니다.스키마매개변수가 제공되면 제어 파일에, 그렇지 않으면스키마옵션토토 핫 프로그램 만들기그것이 주어지면, 그렇지 않으면 현재 기본 객체 생성 스키마(호출자의 첫 번째 것검색_경로). 제어 파일이 있을 때스키마매개변수가 사용되면 대상 스키마가 아직 존재하지 않으면 생성되지만 다른 두 경우에는 이미 존재해야 합니다.

필요한 토토 핫 기능이 다음에 나열되어 있는 경우요구됨제어 파일에서 해당 대상 스키마가 초기 설정에 추가됩니다.검색_경로, 새 토토 핫의 대상 스키마를 따릅니다. 이를 통해 해당 개체가 새 토토 핫 프로그램의 스크립트 파일에 표시될 수 있습니다.

보안을 위해,pg_temp다음의 끝에 자동으로 추가됩니다.검색_경로모든 경우에.

재배치 불가능한 토토 핫에는 여러 스키마에 분산된 개체가 포함될 수 있지만 일반적으로 외부 사용을 위한 모든 개체를 토토 핫의 대상 스키마로 간주되는 단일 스키마에 배치하는 것이 바람직합니다. 이러한 배열은 기본 설정인와 함께 편리하게 작동합니다.검색_경로종속 토토 핫 생성 중.

36.15.3. 토토 핫 구성 테이블

일부 토토 핫에는 토토 핫 설치 후 사용자가 추가하거나 변경할 수 있는 데이터가 포함된 구성 테이블이 포함되어 있습니다. 일반적으로 테이블이 토토 핫의 일부인 경우 테이블 정의나 해당 내용이 덤프되지 않습니다.pg_dump. 그러나 이러한 동작은 구성 테이블에 바람직하지 않습니다. 사용자가 변경한 모든 데이터는 덤프에 포함되어야 합니다. 그렇지 않으면 덤프 및 다시 로드 후에 토토 핫 프로그램이 다르게 동작합니다.

이 문제를 해결하기 위해 토토 핫 프로그램의 스크립트 파일은 구성 관계로 생성된 테이블이나 시퀀스를 표시할 수 있으며 이로 인해 발생하는 문제는 다음과 같습니다.pg_dump테이블 또는 시퀀스의 내용(정의가 아님)을 덤프에 포함합니다. 그렇게 하려면 함수를 호출하세요.pg_extension_config_dump(regclass, 텍스트)예를 들어 테이블이나 시퀀스를 생성한 후

CREATE TABLE my_config(키 텍스트, 값 텍스트);
시퀀스 생성 my_config_seq;

SELECT pg_catalog.pg_extension_config_dump('my_config', '');
SELECT pg_catalog.pg_extension_config_dump('my_config_seq', '');

이 방법으로 테이블이나 시퀀스를 얼마든지 표시할 수 있습니다. 다음과 관련된 시퀀스연재또는큰 직렬열도 표시될 수 있습니다.

두 번째 인수가pg_extension_config_dump은 빈 문자열이며 테이블의 전체 내용이 덤프됩니다.pg_dump. 이는 일반적으로 토토 핫 스크립트에 의해 생성된 테이블이 처음에 비어 있는 경우에만 정확합니다. 테이블에 초기 데이터와 사용자 제공 데이터가 혼합되어 있는 경우,의 두 번째 인수pg_extension_config_dump제공어디29247_29321

CREATE TABLE my_config(키 텍스트, 값 텍스트, 표준 항목 부울);

SELECT pg_catalog.pg_extension_config_dump('my_config', 'standard_entry가 아닌 곳');

그런 다음 다음을 확인하세요standard_entry토토 핫 프로그램의 스크립트에 의해 생성된 행에서만 true입니다.

시퀀스의 경우 두 번째 인수pg_extension_config_dump효과가 없습니다.

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

호출을 통해 구성 테이블과 관련된 필터 조건을 변경할 수 있습니다.pg_extension_config_dump다시. (이것은 일반적으로 토토 핫 업데이트 스크립트에서 유용합니다.) 테이블을 더 이상 구성 테이블이 아닌 것으로 표시하는 유일한 방법은 다음을 사용하여 토토 핫에서 테이블을 분리하는 것입니다.토토 핫자 변경 ...드롭 테이블.

이 테이블 사이의 외래 키 관계는 pg_dump에 의해 테이블이 덤프되는 순서를 결정합니다. 특히 pg_dump는 참조 테이블보다 먼저 참조 테이블을 덤프하려고 시도합니다. 외래 키 관계는 CREATE EXTENSION 시간(데이터가 테이블에 로드되기 전)에 설정되므로 순환 종속성은 지원되지 않습니다. 순환 종속성이 존재하는 경우 데이터는 계속 덤프되지만 덤프를 직접 복원할 수 없으므로 사용자 개입이 필요합니다.

연관된 시퀀스연재또는큰 직렬열의 상태를 덤프하려면 열을 직접 표시해야 합니다. 부모 관계를 표시하는 것만으로는 이 목적에 충분하지 않습니다.

36.15.4. 토토 핫 업데이트

토토 핫 메커니즘의 한 가지 장점은 토토 핫의 개체를 정의하는 SQL 명령에 대한 업데이트를 관리하는 편리한 방법을 제공한다는 것입니다. 이는 버전 이름이나 번호를 토토 핫 설치 스크립트의 릴리스된 각 버전과 연결하여 수행됩니다. 또한 사용자가 한 버전에서 다음 버전으로 데이터베이스를 동적으로 업데이트할 수 있도록 하려면 다음을 제공해야 합니다.업데이트 스크립트한 버전에서 다음 버전으로 이동하는 데 필요한 변경을 수행합니다. 업데이트 스크립트에는 패턴을 따르는 이름이 있습니다.토토 핫--이전_버전--target_version.sql(예를 들어,foo--1.0--1.1.sql버전 수정 명령이 포함되어 있습니다1.0토토 핫foo버전으로1.1).

적절한 업데이트 스크립트를 사용할 수 있는 경우 다음 명령토토 핫 업데이트 변경설치된 토토 핫 기능을 지정된 새 버전으로 업데이트합니다. 업데이트 스크립트는 다음과 동일한 환경에서 실행됩니다.토토 핫 프로그램 생성설치 스크립트 제공: 특히,검색_경로도 같은 방식으로 설정되며 스크립트에 의해 생성된 새 개체는 자동으로 토토 핫 프로그램에 추가됩니다.

토토 핫에 보조 제어 파일이 있는 경우 업데이트 스크립트에 사용되는 제어 매개변수는 스크립트의 대상(새) 버전과 관련된 매개변수입니다.

업데이트 메커니즘은 중요한 특수 사례를 해결하는 데 사용될 수 있습니다: a"느슨한"개체를 토토 핫으로 수집합니다. 토토 핫 메커니즘이 추가되기 전포스트그레SQL(9.1에서) 많은 사람들이 단순히 여러 가지 포장되지 않은 개체를 생성하는 토토 핫 모듈을 작성했습니다. 이러한 개체가 포함된 기존 데이터베이스가 있는 경우 해당 개체를 적절하게 패키지된 토토 핫으로 어떻게 변환할 수 있습니까? 그것들을 떨어뜨린 다음 일반 작업을 수행합니다.토토 핫 프로그램 생성는 일방향이지만 개체에 종속성이 있는 경우(예: 토토 핫 프로그램에서 생성된 데이터 유형의 테이블 열이 있는 경우) 바람직하지 않습니다. 이 상황을 해결하는 방법은 빈 토토 핫을 만든 다음 다음을 사용하는 것입니다.토토 핫 프로그램 변경 추가각 기존 개체를 토토 핫 프로그램에 연결한 다음 마지막으로 현재 토토 핫 버전에는 있지만 패키지 해제된 릴리스에는 없었던 새 개체를 생성합니다.토토 핫 프로그램 생성이 사례를 뒷받침합니다발신 이전_버전옵션, 대상 버전에 대한 일반 설치 스크립트를 실행하지 않고 대신 이름이 지정된 업데이트 스크립트를 실행하게 함토토 핫--이전_버전--대상_버전.sql. 사용할 더미 버전 이름 선택old_version토토 핫 프로그램 작성자에게 달려 있지만패키지 해제일반적인 규칙입니다. 이전 버전이 여러 개 있는 경우 토토 핫 스타일로 업데이트할 수 있어야 하며 여러 더미 버전 이름을 사용하여 식별하세요.

토토 핫 프로그램 변경은 요청된 업데이트를 달성하기 위해 일련의 업데이트 스크립트 파일을 실행할 수 있습니다. 예를 들어 다음과 같은 경우에만foo--1.0--1.1.sql그리고foo--1.1--2.0.sql사용 가능합니다.토토 핫 프로그램 변경버전이 업데이트되면 순차적으로 적용됩니다.2.0다음의 경우에 요청됩니다1.0현재 설치되어 있습니다.

PostgreSQL버전 이름의 속성에 대해 아무 것도 가정하지 않습니다. 예를 들어 버전 이름이 무엇인지 알지 못합니다.1.1다음과 같습니다1.0. 사용 가능한 버전 이름을 일치시키고 가장 적은 업데이트 스크립트를 적용해야 하는 경로를 따릅니다. (버전 이름은 실제로 다음을 포함하지 않는 모든 문자열일 수 있습니다.--또는 선행 또는 후행-.)

때로는 제공하는 것이 유용합니다"다운그레이드"스크립트, 예를 들어foo--1.1--1.0.sql버전과 관련된 변경 사항을 되돌릴 수 있도록 허용1.1. 그렇게 하면 다운그레이드 스크립트가 더 짧은 경로를 생성하므로 예기치 않게 적용될 가능성에 주의하십시오. 위험한 경우는 다음과 같습니다."빠른 경로"여러 버전보다 앞서가는 업데이트 스크립트와 빠른 경로의 시작점으로의 다운그레이드 스크립트. 한 번에 한 버전씩 진행하는 것보다 다운그레이드를 적용한 다음 빠른 경로를 적용하는 데 더 적은 단계가 필요할 수 있습니다. 다운그레이드 스크립트가 대체할 수 없는 개체를 삭제하면 바람직하지 않은 결과가 발생합니다.

예기치 않은 업데이트 경로를 확인하려면 다음 명령을 사용하십시오:

SELECT * FROM pg_extension_update_paths('토토 핫_이름');

이것은 소스 버전에서 대상 버전으로 이동하는 데 사용되는 업데이트 경로 시퀀스와 함께 지정된 토토 핫에 대해 알려진 고유한 버전 이름의 각 쌍을 표시합니다. 또는NULL사용 가능한 업데이트 경로가 없는 경우. 경로는 다음과 같은 텍스트 형식으로 표시됩니다.--구분자. 당신은 사용할 수 있습니다regexp_split_to_array(경로,'--')배열 형식을 선호하는 경우.

36.15.5. 토토 핫에 대한 보안 고려 사항

널리 분산된 토토 핫 프로그램은 자신이 차지하는 데이터베이스에 대해 거의 가정하지 않아야 합니다. 따라서 검색 경로 기반 공격으로 인해 손상될 수 없는 안전한 스타일로 토토 핫 프로그램에서 제공하는 함수를 작성하는 것이 적절합니다.

다음을 가진 토토 핫 프로그램수퍼유저true로 설정된 속성은 설치 및 업데이트 스크립트 내에서 수행되는 작업에 대한 보안 위험도 고려해야 합니다. 악의적인 사용자가 부주의하게 작성된 토토 핫 스크립트의 나중에 실행을 손상시켜 해당 사용자가 슈퍼유저 권한을 획득할 수 있도록 하는 트로이 목마 개체를 만드는 것은 그리 어렵지 않습니다.

함수를 안전하게 작성하는 방법에 대한 조언은 다음에서 제공됩니다.섹션 36.15.5.1아래, 설치 스크립트를 안전하게 작성하는 방법에 대한 조언은 다음에서 제공됩니다.섹션 36.15.5.2.

36.15.5.1. 토토 핫 기능에 대한 보안 고려 사항

토토 핫에서 제공하는 SQL 언어 및 PL 언어 함수는 실행 시 검색 경로 기반 공격의 위험이 있습니다. 이러한 함수의 구문 분석은 생성 시간이 아닌 실행 시간에 발생하기 때문입니다.

함수 생성참조 페이지에는 글쓰기에 대한 조언이 포함되어 있습니다.보안 정의자안전하게 작동합니다. 높은 권한을 가진 사용자가 함수를 호출할 수 있으므로 토토 핫 프로그램에서 제공하는 모든 함수에 이러한 기술을 적용하는 것이 좋습니다.

설정할 수 없는 경우검색_경로보안 스키마만 포함하려면 정규화되지 않은 각 이름이 악의적인 사용자가 정의한 개체로 해석될 수 있다고 가정합니다. 다음에 의존하는 구성에 주의하세요.검색_경로암시적으로; 예를 들어,IN그리고사례표현언제항상 검색 경로를 사용하여 연산자를 선택하세요. 대신에연산자(스키마.=) 모두그리고경우는 다음과 같습니다표현.

범용 토토 핫은 일반적으로 보안 스키마에 설치되었다고 가정해서는 안 됩니다. 즉, 자체 개체에 대한 스키마 한정 참조도 완전히 위험이 없는 것은 아닙니다. 예를 들어 토토 핫 프로그램이 함수를 정의한 경우myschema.myfunc(bigint)다음과 같은 호출myschema.myfunc(42)적대적인 기능에 의해 캡처될 수 있습니다myschema.myfunc(정수). 필요한 경우 명시적 캐스트를 사용하여 함수 및 연산자 매개변수의 데이터 유형이 선언된 인수 유형과 정확히 일치하는지 주의하세요.

36.15.5.2. 토토 핫 스크립트에 대한 보안 고려 사항

토토 핫 프로그램 설치 또는 업데이트 스크립트는 스크립트 실행 시 발생하는 검색 경로 기반 공격으로부터 보호하기 위해 작성되어야 합니다. 스크립트 작성자가 의도한 것과 다른 개체를 확인하기 위해 스크립트의 개체 참조를 만들 수 있는 경우 손상이 즉시 발생할 수 있으며 나중에 잘못 정의된 토토 핫 개체가 사용될 때 발생할 수 있습니다.

다음과 같은 DDL 명령함수 생성그리고연산자 클래스 생성은 일반적으로 안전하지만 범용 표현식을 구성요소로 포함하는 명령에 주의하세요. 예를 들어,보기 만들기검토가 필요하며 a도 마찬가지입니다.기본값표현식함수 생성.

때로는 토토 핫 스크립트가 범용 SQL을 실행해야 할 수도 있습니다(예: DDL을 통해 불가능한 카탈로그 조정을 수행하기 위해). 보안을 사용하여 이러한 명령을 실행하도록 주의하세요.검색_경로; 하다아님제공된 경로를 신뢰토토 핫 프로그램 생성/변경안전합니다. 모범 사례는 임시로 설정하는 것입니다.검색_경로'pg_catalog, pg_temp'그리고 필요한 곳에 토토 핫 프로그램의 설치 스키마에 대한 참조를 명시적으로 삽입합니다. (이 방법은 뷰 생성에도 도움이 될 수 있습니다.) 예는 다음에서 찾을 수 있습니다.기여모듈포스트그레SQL소스코드 배포.

교차 토토 핫 참조는 부분적으로 다른 토토 핫이 어떤 스키마에 있는지에 대한 불확실성 때문에 완전히 보안을 유지하기가 매우 어렵습니다. 두 토토 핫이 동일한 스키마에 설치되면 설치 시간에 적대적인 개체가 참조 토토 핫보다 앞에 배치될 수 없기 때문에 위험이 줄어듭니다.검색_경로. 그러나 현재 이를 요구하는 메커니즘은 없습니다.

Do아님사용함수 생성 또는 교체, 이미 토토 핫 멤버인 것으로 알려진 함수의 정의를 변경해야 하는 업데이트 스크립트는 제외됩니다. (다른 사람도 마찬가지로또는 교체옵션.) 사용또는 교체불필요하게 실수로 다른 사람의 함수를 덮어쓸 위험이 있을 뿐만 아니라, 덮어쓴 함수는 이를 수정할 수 있는 원래 소유자의 소유이므로 보안 위험이 발생합니다.

36.15.6. 토토 핫 예

여기에 완전한 예가 있습니다.SQL-전용 토토 핫, 이름이 지정된 슬롯에 모든 유형의 값을 저장할 수 있는 2요소 복합 유형"k"그리고"v". 텍스트가 아닌 값은 저장을 위해 자동으로 텍스트로 강제 변환됩니다.

스크립트 파일pair--1.0.sql다음과 같습니다:

-- 스크립트가 CREATE EXTENSION을 통하지 않고 psql에서 제공되는 경우 불평합니다.
\echo 이 파일을 로드하려면 "CREATE EXTENSION 쌍"을 사용하십시오. \그만둬

CREATE TYPE 쌍 AS(k 텍스트, v 텍스트);

CREATE FUNCTION 쌍(텍스트, 텍스트)
쌍 LANGUAGE SQL을 'SELECT ROW($1, $2)::@extschema@.pair;'로 반환합니다.

CREATE OPERATOR ~ (LEFTARG = 텍스트, RIGHTARG = 텍스트, PROCEDURE = 쌍);

-- "SET search_path"는 이해하기 쉽지만 정규화된 이름은 더 나은 성능을 발휘합니다.
CREATE FUNCTION 하위(쌍)
반환 LANGUAGE SQL 쌍
AS 'SELECT ROW(lower($1.k), lower($1.v))::@extschema@.pair;'
SET 검색_경로 = pg_temp;

함수 생성 pair_concat(쌍, 쌍)
반환 LANGUAGE SQL 쌍
AS 'SELECT ROW($1.k OPERATOR(pg_catalog.||) $2.k,
               $1.v OPERATOR(pg_catalog.||) $2.v)::@extschema@.pair;';

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

# 쌍 토토 핫
comment = '키/값 쌍 데이터 유형'
default_version = '1.0'
# @extschema@ 사용으로 인해 재배치할 수 없습니다.
재배치 가능 = false

이 두 파일을 올바른 디렉토리에 설치하기 위해 makefile이 거의 필요하지 않지만 다음을 사용할 수 있습니다.메이크파일이 내용:

토토 핫 = 쌍
데이터 = 쌍--1.0.sql

PG_CONFIG = pg_config
PGXS := $(쉘 $(PG_CONFIG) --pgxs)
$(PGXS) 포함

이 makefile은 다음에 의존합니다.PGXS, 설명된 내용은섹션 36.16. 명령설치하기다음에서 보고한 대로 올바른 디렉토리에 제어 및 스크립트 파일을 설치합니다.pg_config.

파일이 설치되면 다음을 사용하십시오.PostgreSQL : 문서객체를 특정 데이터베이스에 로드하는 명령입니다.