38.17. 관련 객체를 토토 꽁 머니자로 포장#

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

단지 실행하는 대신 토토 꽁 머니을 사용하는 주요 장점SQL스크립트를로드하려면 스크립트느슨한데이터베이스에 대한 객체는입니다.PostgreSQL그런 다음 토토 꽁 머니자의 객체가 함께 있다는 것을 이해할 것입니다. 단일로 모든 객체를 삭제할 수 있습니다드롭 토토 꽁 머니명령 (별도를 유지할 필요 없음제거스크립트). 훨씬 더 유용합니다.pg_dump토토 꽁 머니의 개별 멤버 객체를 버리지 않아야한다는 것을 알고 있습니다.토토 꽁 머니 생성대신 덤프로 명령하십시오. 이것은 기존 버전보다 더 많거나 다른 객체를 포함 할 수있는 새로운 버전의 토토 꽁 머니 버전으로의 마이그레이션을 크게 단순화합니다. 그러나 이러한 덤프를 새 데이터베이스에로드 할 때 토토 꽁 머니자의 컨트롤, 스크립트 및 기타 파일을 사용할 수 있어야합니다.

PostgreSQL전체 토토 꽁 머니을 삭제하는 것을 제외하고는 토토 꽁 머니에 포함 된 개별 객체를 삭제하지 못하게합니다. 또한 토토 꽁 머니 멤버 객체의 정의를 변경할 수 있지만 (예 : via함수 생성 또는 교체함수의 경우), 수정 된 정의는 덤프되지 않을 것임을 명심하십시오pg_dump. 이러한 변경은 일반적으로 토토 꽁 머니자의 스크립트 파일에서 동시에 동일한 변경을하는 경우에만 합리적입니다. (그러나 구성 데이터가 포함 된 테이블에 대한 특별 조항이 있습니다. 참조섹션 38.17.3.) 프로덕션 상황에서는 일반적으로 토토 꽁 머니 회원 객체에 대한 변경 사항을 수행하기 위해 토토 꽁 머니 업데이트 스크립트를 작성하는 것이 좋습니다.

토토 꽁 머니 스크립트는 토토 꽁 머니자의 일부인 객체에서 권한을 설정할 수 있습니다.grantandRevoke진술. 각 객체에 대한 최종 권한 세트 (설정된 경우)는에 저장됩니다.PG_INIT_PRIVS시스템 카탈로그. 언제pg_dump사용됩니다.토토 꽁 머니 생성명령은 덤프에 포함되며이 뒤 따릅니다.grantandRevoke덤프가 취할 때 객체의 권한을 설정하는 데 필요한 진술.

PostgreSQL현재 토토 꽁 머니 스크립트 발행을 지원하지 않습니다정책 작성또는보안 레이블진술. 토토 꽁 머니이 만들어진 후에 설정 될 것으로 예상됩니다. 토토 꽁 머니 객체의 모든 RLS 정책 및 보안 레이블은에 의해 생성 된 덤프에 포함됩니다.pg_dump.

토토 꽁 머니 메커니즘에는 토토 꽁 머니에 포함 된 SQL 객체의 정의를 조정하는 포장 수정 스크립트에 대한 조항이 있습니다. 예를 들어, 토토 꽁 머니자의 버전 1.1이 하나의 함수를 추가하고 1.0에 비해 다른 함수의 본문을 변경하면 토토 꽁 머니자 저자는를 제공 할 수 있습니다.스크립트 업데이트그 두 가지만 변경합니다. 그만큼Alter Extension Update명령을 사용하여 이러한 변경 사항을 적용하고 주어진 데이터베이스에 실제로 설치되는 토토 꽁 머니 버전을 추적 할 수 있습니다.

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

Extension의 스크립트가 임시 객체 (예 : 임시 테이블)를 생성하는 경우 해당 객체는 현재 세션의 나머지 부분에 대한 토토 꽁 머니 멤버로 처리되지만 임시 객체는 세션 종료시 자동으로 삭제됩니다. 이것은 전체 토토 꽁 머니자를 삭제하지 않고 토토 꽁 머니 멤버 객체를 삭제할 수 없다는 규칙의 예외입니다.

38.17.1. 토토 꽁 머니 파일#

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

토토 꽁 머니 제어 파일의 파일 형식은와 동일합니다.postgresql.conf파일, 즉 목록parameter_name = value한 줄 당 과제. 빈 줄과 댓글이 소개#허용됩니다. 단일 단어 나 숫자가 아닌 값을 인용하십시오.

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

디렉토리(Stri토토 꽁 머니) #

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

default_version(Stri토토 꽁 머니) #

Extension의 기본 버전 (버전이 지정되지 않은 경우 설치되는 버전토토 꽁 머니 생성). 이것은 생략 될 수 있지만, 그 결과토토 꽁 머니 생성아니오이면 실패버전옵션이 나타나므로 일반적으로 그렇게하고 싶지 않습니다.

댓글(Stri토토 꽁 머니) #

토토 꽁 머니에 대한 주석 (모든 문자열). 주석은 처음에 토토 꽁 머니자를 만들 때 적용되지만 토토 꽁 머니 업데이트 중에는 그렇지 않습니다 (사용자 지원 주석을 무시할 수 있으므로). 또는 Extension의 주석은 A를 작성하여 설정할 수 있습니다.댓글스크립트 파일의 명령.

인코딩(Stri토토 꽁 머니) #

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

module_pathname(Stri토토 꽁 머니) #

이 매개 변수의 값은 각 발생마다 대체됩니다module_pathname스크립트 파일에서. 설정되지 않으면 치환이 이루어지지 않습니다. 일반적으로 이것은로 설정됩니다.$ libdir/shared_library_nameandmodule_pathname기능 생성C- 언어 함수에 대한 명령, 스크립트 파일이 공유 라이브러리의 이름을 하드 와이어 할 필요가 없도록합니다.

요구(Stri토토 꽁 머니) #

예를 들어이 토토 꽁 머니자가 의존하는 토토 꽁 머니 이름 목록요구 = 'foo, bar'. 이 토토 꽁 머니은이 토토 꽁 머니을 설치하기 전에 설치해야합니다.

no_relocate(Stri토토 꽁 머니) #

이 토토 꽁 머니에 의존하는 토토 꽁 머니 이름 목록은 스키마를 통해 스키마를 변경하여 금지되어야합니다토토 꽁 머니자 변경 ... 스키마 설정. 이 토토 꽁 머니자의 스크립트가 필요한 토토 꽁 머니 스키마의 이름을 참조하는 경우 ( 사용이 필요합니다.@extschema :이름@구문) 이름을 추적 할 수없는 방식으로.

SuperUser(부울) #

이 매개 변수 인 경우true(기본값), 슈퍼 사용자 만 토토 꽁 머니자 만 만들거나 새 버전으로 업데이트 할 수 있습니다 (그러나 참조신뢰할 수있는, 아래). 로 설정된 경우거짓, 설치 또는 업데이트 스크립트에서 명령을 실행하는 데 필요한 권한 만 필요합니다. 이것은 일반적으로로 설정해야합니다.true스크립트 명령에 슈퍼 사용자 권한이 필요한 경우. (어쨌든 그러한 명령은 실패하지만 오류를 앞쪽으로 제공하는 것이 더 사용자 친화적입니다.)

신뢰할 수있는(부울) #

이 매개 변수, 설정된 경우true(기본값이 아님)는 일부 비 슈퍼 사용자가있는 토토 꽁 머니자를 설치할 수 있습니다SuperUser설정true. 구체적으로, 설치는 누구나 허용됩니다.생성현재 데이터베이스의 권한. 사용자가 실행할 때토토 꽁 머니 생성는 슈퍼 사용자가 아니지만이 매개 변수로 인해 설치할 수있게되면 설치 또는 업데이트 스크립트는 호출 사용자가 아닌 부트 스트랩 슈퍼 사용자로 실행됩니다. 이 매개 변수는 관련이 없습니다.SuperUseris거짓. 일반적으로 파일 시스템 액세스와 같은 다른 슈퍼 루저 전용 능력에 대한 액세스를 허용 할 수있는 토토 꽁 머니에 대해이를 설정해서는 안됩니다. 또한 신뢰할 수있는 토토 꽁 머니자를 표시하려면 Extension의 설치를 작성하고 스크립트를 안전하게 업데이트하려면 상당한 노력이 필요합니다. 보다섹션 38.17.6.

rejocatable(부울) #

토토 꽁 머니자는rejocatable토토 꽁 머니을 초기 생성 후 포함 된 객체를 다른 스키마로 이동할 수 있다면. 기본값은거짓, 즉 토토 꽁 머니은 재배치 할 수 없습니다. 보다섹션 38.17.2자세한 내용은

스키마(Stri토토 꽁 머니) #

이 매개 변수는 재생 불가능한 토토 꽁 머니에 대해서만 설정할 수 있습니다. 그것은 토토 꽁 머니이 명명 된 스키마에 정확히로드되도록 강요합니다. 그만큼스키마매개 변수는 토토 꽁 머니 업데이트가 아닌 연장을 생성 할 때만 상담됩니다. 보다섹션 38.17.2자세한 내용은

기본 제어 파일 외에토토 꽁 머니.control, 토토 꽁 머니자는 스타일에 이름이 지정된 2 차 제어 파일을 가질 수 있습니다Extension--버전.control. 제공된 경우 스크립트 파일 디렉토리에 있어야합니다. 보조 제어 파일은 기본 제어 파일과 동일한 형식을 따릅니다. 보조 제어 파일에 설정된 모든 매개 변수는 해당 버전의 토토 꽁 머니 버전을 설치하거나 업데이트 할 때 기본 제어 파일을 무시합니다. 그러나 매개 변수디렉토리default_version보조 제어 파일로 설정할 수 없습니다.

토토 꽁 머니자SQL스크립트 파일은 트랜잭션 제어 명령을 제외하고는 SQL 명령을 포함 할 수 있습니다 (시작, 커밋등) 및 트랜잭션 블록 내에서 실행할 수없는 명령 (예 :진공). 스크립트 파일이 트랜잭션 블록 내에서 암시 적으로 실행되기 때문입니다.

토토 꽁 머니자SQL스크립트 파일은로 시작하는 줄도 포함 할 수 있습니다\ echo, 이것은 토토 꽁 머니 메커니즘에 의해 무시 될 것입니다 (주석으로 취급). 이 조항은 일반적으로 스크립트 파일에 공급되는 경우에 오류를 던지는 데 사용됩니다.PSQL토토 꽁 머니 생성(예제 스크립트 참조섹션 38.17.7). 그 없이는 사용자가 실수로 Extension의 내용을로드 할 수 있습니다.느슨한토토 꽁 머니이 아닌 물체, 회복하기가 약간 지루한 상황입니다.

토토 꽁 머니 스크립트에 문자열이 포함 된 경우@elevowner@, 그 문자열은 사용자 호출의 (적절하게 인용 된) 이름으로 대체됩니다토토 꽁 머니 생성또는Alter Extension. 일반적 으로이 기능은 Bootstrap 슈퍼 사용자가 아닌 호출 사용자에게 선택한 객체의 소유권을 할당하도록 신뢰할 수있는 토토 꽁 머니에 의해 사용됩니다. (그러나 그렇게하는 데주의를 기울여야합니다. 예를 들어, C-Language 기능의 소유권을 비 슈퍼 러자에게 할당하면 해당 사용자에게 권한 에스컬레이션 경로를 만듭니다.).

스크립트 파일에는 지정된 인코딩이 허용하는 문자가 포함될 수 있지만 제어 파일은 일반 ASCII 만 포함해야합니다.PostgreSQL제어 파일을 인코딩하는 것이 무엇인지 알기 위해. 실제로 이것은 Extension의 주석에서 비 ASCII 문자를 사용하려는 경우에만 문제가됩니다. 이 경우 권장되는 관행은 제어 파일을 사용하지 않는 것입니다댓글매개 변수이지만 대신 사용토토 꽁 머니에 대한 의견주석을 설정하려면 스크립트 파일 내에서.

38.17.2. 토토 꽁 머니 재배치#

사용자는 종종 토토 꽁 머니에 포함 된 개체를 Extension의 저자가 생각했던 것과 다른 스키마에로드하려고합니다. 3 가지 지원 수준의 재배치 성이 있습니다.

  • 데이터베이스에로드 된 후에도 완전히 재배치 가능한 토토 꽁 머니을 다른 스키마로 이동할 수 있습니다. 이것은와 함께 이루어집니다.Alter Extension Set Schema명령은 모든 멤버 객체를 새 스키마로 자동 이름을 바꿉니다. 일반적으로 이것은 토토 꽁 머니에 해당 객체에 어떤 스키마에 대한 내부 가정이 포함되어 있지 않은 경우에만 가능합니다. 또한 토토 꽁 머니자의 객체는 하나의 스키마에 있어야합니다 (절차 언어와 같은 스키마에 속하지 않는 객체를 무시 함). 설정하여 완전히 재배치 가능한 토토 꽁 머니을 표시rejocatable = true제어 파일의

  • 토토 꽁 머니은 설치 중에 재배치 할 수 있지만 나중에는 재배치 할 수 있습니다. 이것은 일반적으로 토토 꽁 머니자의 스크립트 파일이 대상 스키마를 명시 적으로 참조 해야하는 경우, 예를 들어 설정입니다.search_pathSQL 함수의 속성. 그러한 연장을 위해rejocatable = false제어 파일에서@extschema@스크립트 파일의 대상 스키마를 참조합니다. 이 문자열의 모든 발생은 스크립트가 실행되기 전에 실제 대상 스키마의 이름 (필요한 경우 두 번 인용)으로 대체됩니다. 사용자는를 사용하여 대상 스키마를 설정할 수 있습니다.스키마옵션토토 꽁 머니 생성.

  • 토토 꽁 머니자가 재배치를 전혀 지원하지 않으면 설정rejocatable = false제어 파일에스키마의도 된 대상 스키마의 이름으로. 이것은의 사용을 방지 할 것입니다.스키마옵션토토 꽁 머니 생성, 제어 파일에 명명 된 동일한 스키마를 지정하지 않는 한. 이 선택은 일반적으로 토토 꽁 머니자에 |@extschema@. 그만큼@extschema@스키마 이름이 제어 파일에 의해 결정되기 때문에 사용이 제한적이지만이 경우에도 대체 메커니즘을 사용할 수 있습니다..

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

로컬 Search_Path를 @extschema @, pg_temp;에 설정하십시오.

스크립트 파일에서 만든 객체가 대상 스키마로 이동할 수 있습니다. 스크립트 파일이 변경 될 수 있습니다search_path원하는 경우 일반적으로 바람직하지 않습니다.search_path완료되면 이전 설정으로 복원되었습니다토토 꽁 머니 생성.

대상 스키마는에 의해 결정됩니다.스키마제어 파일의 매개 변수가 제공되는 경우.스키마옵션토토 꽁 머니 생성그렇지 않은 경우, 그렇지 않으면 현재 기본 오브젝트 생성 스키마 (발신자의 첫 번째 객체search_path). 컨트롤 파일스키마매개 변수가 사용되면 대상 스키마가 아직 존재하지 않으면 대상 스키마가 생성되지만 다른 두 경우에는 이미 존재해야합니다.

전제 조건 토토 꽁 머니이 나열된 경우요구제어 파일에서 대상 스키마가의 초기 설정에 추가됩니다.search_path, 새로운 Extension의 대상 스키마에 따라. 이를 통해 해당 객체가 새로운 Extension의 스크립트 파일에 표시 될 수 있습니다.

보안 용PG_TEMPsearch_path모든 경우에.

relocatable 토토 꽁 머니에는 여러 schemas에 퍼져있는 객체를 포함 할 수 있지만, 외부 사용을위한 모든 객체를 단일 스키마에 배치하는 것이 바람직합니다. 이러한 배열은 기본 설정과 편리하게 작동합니다.search_path의존적 토토 꽁 머니을 생성하는 동안.

토토 꽁 머니자 참조가 다른 토토 꽁 머니자에 속하는 개체를하는 경우 해당 참조를 스키마 자격을 확보하는 것이 좋습니다. 그렇게하려면 쓰기@extschema :이름@Extension의 스크립트 파일에서이름다른 토토 꽁 머니자의 이름입니다 (이 토토 꽁 머니자에 나열되어 있어야합니다요구목록). 이 문자열은 해당 Extension의 대상 스키마의 이름 (필요한 경우 이중 인용)으로 대체됩니다. 이 표기법은 Extension의 스크립트 파일에서 스키마 이름에 대해 하드 유선 가정을 할 필요가 없지만 사용하면 다른 토토 꽁 머니자의 스키마 이름을이 토토 꽁 머니자의 설치된 개체에 포함시킬 수 있습니다. (일반적으로 발생하는 경우@extschema :이름@함수 본문 또는 a와 같은 문자열 문자 내부에서 사용됩니다.search_path설정. 다른 경우에는 구문 분석 중에 객체 참조가 OID로 줄어들고 후속 조회가 필요하지 않습니다.) 다른 토토 꽁 머니자의 스키마 이름이 너무 포함 된 경우 다른 토토 꽁 머니자 이름이 설치된 후 다른 토토 꽁 머니이 재배치되는 것을 방지해야합니다.no_relocate목록.

38.17.3. 토토 꽁 머니 구성 테이블#

일부 토토 꽁 머니에는 토토 꽁 머니 설치 후 사용자가 추가하거나 변경할 수있는 데이터가 포함 된 구성 테이블이 포함됩니다. 일반적으로 테이블이 토토 꽁 머니자의 일부인 경우 테이블의 정의 나 콘텐츠가 덤프되지 않습니다.pg_dump. 그러나 그 동작은 구성 테이블의 경우 바람직하지 않습니다. 사용자의 모든 데이터 변경 사항은 덤프에 포함되어야합니다. 그렇지 않으면 덤프 및 복원 후에 토토 꽁 머니이 다르게 행동합니다.

이 문제를 해결하기 위해 토토 꽁 머니자의 스크립트 파일은 구성 관계로 작성된 테이블 또는 시퀀스를 표시 할 수 있습니다.pg_dump덤프에 테이블 또는 시퀀스의 내용 (정의가 아님)을 포함합니다. 그렇게하려면 함수를 호출하십시오pg_extension_config_dump (regclass, text)예를 들어 테이블 또는 시퀀스를 작성한 후

테이블 작성 my_config (키 텍스트, 값 텍스트);
시퀀스를 만듭니다. my_config_seq;

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

여러 테이블이나 시퀀스 가이 방식으로 표시 될 수 있습니다. 관련 시퀀스Serial또는bigserial열도 표시 될 수 있습니다.

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

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

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

그런 다음Standard_EntryExtension의 스크립트에 의해 생성 된 행에서만 사실입니다.

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

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

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

이 테이블 사이의 외국의 주요 관계는 PG_DUMP에 의해 테이블이 버려지는 순서를 결정합니다. 구체적으로, pg_dump는 참조 테이블 전에 참조 표를 덤프하려고 시도합니다. 외국의 주요 관계가 Create Extension Time (테이블에로드하기 전에)에서 설정되면 원형 의존성은 지원되지 않습니다. 원형 의존성이 존재하면 데이터는 여전히 덤프되지만 덤프는 직접 복원 할 수 없으며 사용자 개입이 필요합니다.

관련 시퀀스Serial또는bigserial열을 직접 표시하려면 직접 표시해야합니다. 부모 관계를 표시하는 것만으로는 충분하지 않습니다.

38.17.4. 토토 꽁 머니 업데이트#

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

적절한 업데이트 스크립트를 사용할 수있게되면 명령Alter Extension Update지정된 새 버전으로 설치된 토토 꽁 머니자를 업데이트합니다. 업데이트 스크립트는와 같은 환경에서 실행됩니다.토토 꽁 머니 생성설치 스크립트 제공 : 특히search_path| 같은 방식으로 설정되며 스크립트에 의해 생성 된 새 개체는 토토 꽁 머니자에 자동으로 추가됩니다. 또한 스크립트가 토토 꽁 머니 멤버 객체를 삭제하기로 선택하면 토토 꽁 머니자에서 자동으로 분리됩니다.

토토 꽁 머니자에 보조 제어 파일이 있으면 업데이트 스크립트에 사용되는 제어 매개 변수는 스크립트 대상 (신규) 버전과 관련된 것입니다..

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

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

때로는 제공하는 것이 유용합니다다운 그레이드스크립트, 예를 들어foo--1.1--1.0.sql버전과 관련된 변경 사항을 되돌릴 수 있도록1.1. 그렇게하면 더 짧은 경로를 생성하기 때문에 다운 그레이드 스크립트가 예기치 않게 적용될 가능성에주의하십시오. 위험한 사례는 A가있는 곳입니다.빠른 경로Fast Path의 시작점으로의 다운 그레이드 스크립트뿐만 아니라 여러 버전을 뛰어 넘는 스크립트를 업데이트하십시오. 한 번에 하나의 버전을 이동하는 것보다 다운 그레이드를 적용하고 빠른 경로를 적용하는 데 더 적은 단계가 필요할 수 있습니다. 다운 그레이드 스크립트가 대체 할 수없는 객체를 떨어 뜨리면 바람직하지 않은 결과를 얻을 수 있습니다.

예상치 못한 업데이트 경로를 확인하려면이 명령을 사용하십시오.

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

이것은 소스 버전에서 대상 버전으로 이동하기 위해 찍은 업데이트 경로 시퀀스와 함께 지정된 토토 꽁 머니자에 대한 별개의 알려진 버전 이름 쌍을 보여줍니다.NULL사용 가능한 업데이트 경로가없는 경우. 경로는 텍스트 형식으로 표시됩니다.--분리기. 사용할 수 있습니다regexp_split_to_array (path, '-')배열 형식을 선호하는 경우.

38.17.5. 업데이트 스크립트를 사용하여 내선 설치#

잠시 동안 주변에 있었던 토토 꽁 머니자는 아마도 여러 버전으로 존재할 것이며, 저자는 업데이트 스크립트를 작성해야합니다. 예를 들어, a를 출시 한 경우foo버전의 토토 꽁 머니1.0, 1.11.2, 업데이트 스크립트가 있어야합니다foo--1.0--1.1.sqlandfoo--1.1-1.2.sql. 전에PostgreSQL10, 새 스크립트 파일도 만들어야했습니다foo--1.1.sqlandfoo--1.2.sql최신 토토 꽁 머니 버전을 직접 구축하거나 다른 최신 버전을 설치 하여만 직접 설치할 수 없습니다1.0그런 다음 업데이트. 그것은 지루하고 복제 적 이었지만 지금은 불필요합니다. 왜냐하면토토 꽁 머니 생성업데이트 체인을 자동으로 팔로우 할 수 있습니다. 예를 들어, 스크립트 파일 만foo--1.0.sql, foo--1.0--1.1.sqlfoo--1.1-1.2.sql이용 가능 한 다음 버전 설치 요청1.23 개의 스크립트를 순서대로 실행하여 영광입니다. 처리는 처음 설치 한 것과 동일합니다1.0그런 다음 업데이트1.2. (Alter Extension Update, 여러 경로를 사용할 수 있으면 가장 짧은 경로가 선호됩니다.)이 스타일의 Extension의 스크립트 파일을 정리하면 작은 업데이트를 생성하는 데 필요한 유지 보수 노력의 양을 줄일 수 있습니다.

이 스타일로 내장 된 토토 꽁 머니자가있는 보조 (버전 특정) 제어 파일을 사용하는 경우, 컨트롤 파일이 해당 버전에 대한 암시 적 업데이트가 수행되는 방법을 결정하기 때문에 각 버전에는 독립형 설치 스크립트가 없더라도 제어 파일이 필요합니다. 예를 들어, iffoo--1.0.control지정요구 사항 = 'bar'그러나foo의 다른 제어 파일은 그렇지 않습니다. 토토 꽁 머니자의 의존성은bar에서 업데이트 할 때 삭제됩니다1.0다른 버전으로.

38.17.6. 토토 꽁 머니에 대한 보안 고려 사항#

광범위하게 분산 된 토토 꽁 머니은 그들이 차지하는 데이터베이스에 대해 거의 가정하지 않아야합니다. 따라서 검색 경로 기반 공격으로 손상 될 수없는 안전한 스타일로 토토 꽁 머니 기능을 제공하는 기능을 작성하는 것이 적절합니다.

SuperUsertrue로 설정된 속성은 설치 및 업데이트 스크립트 내에서 수행 된 작업에 대한 보안 위험을 고려해야합니다. 악의적 인 사용자가 나중에 부주의하게 작성된 토토 꽁 머니 스크립트의 실행을 손상시킬 Trojan-Horse 객체를 만드는 것은별로 어렵지 않습니다. 해당 사용자는 슈퍼 사용자 권한을 획득 할 수 있습니다..

토토 꽁 머니자가 표시된 경우신뢰할 수있는, 설치 사용자는 설치 스키마를 선택할 수 있으며, 슈퍼 사용자 권한을 얻기 위해 불안한 스키마를 의도적으로 사용할 수 있습니다. 따라서 신뢰할 수있는 토토 꽁 머니은 보안 관점에서 극도로 노출되며, 모든 스크립트 명령을 신중하게 검사하여 타협이 없도록해야합니다.

작문 기능에 대한 조언은 안전하게 제공됩니다섹션 38.17.6.1아래, 설치 스크립트 작성에 대한 조언은 단단히 제공됩니다섹션 38.17.6.2.

38.17.6.1. 토토 꽁 머니 기능에 대한 보안 고려 사항#

토토 꽁 머니에 의해 제공되는 SQL 언어 및 PL- 언어 함수는 실행 시간에 구문 분석 시간에 발생하기 때문에 검색 경로 기반 공격의 위험에 처해 있습니다..

the함수 생성참조 페이지 작성에 대한 조언이 포함되어 있습니다보안 정의기안전하게 기능합니다. 기능을 고급 사용자가 호출 할 수 있으므로 토토 꽁 머니자가 제공하는 기능에 해당 기술을 적용하는 것이 좋습니다.

설정할 수없는 경우search_path보안 스키마 만 포함하기 위해, 각 자격이없는 이름은 악의적 인 사용자가 정의한 개체로 해결 될 수 있다고 가정합니다. 의존하는 구성을 조심하십시오search_path암시 적으로; 예를 들어,inCASE표현언제항상 검색 경로를 사용하여 연산자를 선택하십시오. 그들의 대신 사용연산자 (스키마. =) anyCASE표현.

일반 목적 토토 꽁 머니은 일반적으로 보안 스키마에 설치되었다고 가정해서는 안됩니다. 즉, 자체 객체에 대한 스키마 자격을 갖춘 참조조차도 완전히 위험이 없습니다. 예를 들어, 토토 꽁 머니자가 함수를 정의한 경우myschema.myfunc (bigint)그런 다음myschema.myfunc (42)적대적인 기능으로 캡처 할 수 있습니다myschema.myfunc (Integer). 기능 및 연산자 매개 변수의 데이터 유형이 필요한 경우 명시 적 캐스트를 사용하여 선언 된 인수 유형과 정확히 일치하도록 조심하십시오.

38.17.6.2. 토토 꽁 머니 스크립트에 대한 보안 고려 사항#

스크립트가 실행될 때 발생하는 검색 경로 기반 공격에 대해 토토 꽁 머니 설치 또는 업데이트 스크립트를 작성해야합니다. 스크립트의 객체 참조를 스크립트 작성자보다 다른 객체로 해결하도록 만들 수있는 경우, 잘못 정의 된 토토 꽁 머니 객체가 사용될 때 즉시 또는 나중에 타협이 발생할 수 있습니다..

remods기능 생성and운영자 클래스 만들기일반적으로 안전하지만 구성 요소로서 일반 목적 표현을 갖는 명령을 조심하십시오. 예를 들어,보기 만들기a와 마찬가지로 조사해야합니다.기본값expression in함수 만들기.

때로는 토토 꽁 머니 스크립트가 DDL을 통해 불가능한 카탈로그 조정을 위해서는 일반 목적 SQL을 실행해야 할 수도 있습니다. 보안으로 그러한 명령을 실행하도록주의하십시오search_path; 하다not토토 꽁 머니/알터 생성보안. 모범 사례는 일시적으로 설정하는 것입니다search_pathtoPG_CATALOG, PG_TEMP및 필요한 경우 Extension의 설치 스키마에 대한 참조를 삽입하십시오. (이 관행은보기를 만드는 데 도움이 될 수 있습니다.) 예제는에서 찾을 수 있습니다.Contrib모듈의PostgreSQL소스 코드 배포.

교차 토토 꽁 머니 참조는 다른 토토 꽁 머니이 어떤 스키마에 있는지에 대한 불확실성 때문에 부분적으로 완전히 안전하게 만드는 것은 극히 어렵습니다. 동일한 스키마에 모든 토토 꽁 머니이 설치되면 위험이 줄어 듭니다.search_path. 그러나 현재이를 요구하는 메커니즘은 없습니다. 현재 모범 사례는 다른 사람이 항상 설치되지 않는 한 다른 사람에 의존하는 경우 신뢰할 수있는 토토 꽁 머니을 표시하지 않는 것입니다.PG_CATALOG.

38.17.7. 토토 꽁 머니 예제#

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

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

- 스크립트가 PSQL에서 생성 토토 꽁 머니자를 통한 것이 아니라 PSQL에 공급되는 경우 불만 사항
\ echo는 "토토 꽁 머니 쌍을 만들기 위해"만들기 "를로드합니다. \그만두다

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

기능 쌍 만들기 (텍스트, 텍스트)
쌍 언어 SQL을 'select row ($ 1, $ 2) ::@extschema@.pair;'로 반환합니다.

연산자 생성 ~ (leftarg = text, rightarg = text, function = pair);

- "set search_path"는 쉽게 얻을 수 있지만 자격을 갖춘 이름은 더 잘 수행됩니다.
기능 생성 (쌍)
쌍 언어 SQL을 반환합니다
'select row (하위 ($ 1.K), Lower ($ 1.V)) ::@extschema@.pair;'
SET SEARCH_PATH = PG_TEMP;

함수 생성 pair_concat (쌍, 쌍)
쌍 언어 SQL을 반환합니다
AS 'select row ($ 1.K 운영자 (PG_CATALOG. ||) $ 2.K,
               $ 1.V Operator (PG_CATALOG. ||) $ 2.V) ::@extschema@.pair; ';

제어 파일pair.control다음과 같이 보입니다 :

# 쌍 토토 꽁 머니
댓글 = '키/값 쌍 데이터 유형'
default_version = '1.0'
# extschema @의 사용으로 인해 # 재배치 할 수 없습니다.
regocatable = false

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

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

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

이 makefile의 의존PGXS,섹션 38.18. 명령설치|PG_CONFIG.

파일이 설치되면를 사용하십시오.토토 꽁 머니 생성객체를 특정 데이터베이스에로드하도록 명령.

수정 제출

문서에 올바른 것이 없으면 일치하지 않습니다. 특정 기능에 대한 귀하의 경험 또는 추가 설명이 필요합니다. 사용이 양식문서 문제를보고하려면