36.17. 관련 객체를 스포츠 토토으로 패키징#

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

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

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

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

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

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

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

스포츠 토토 프로그램의 스크립트가 임시 개체(예: 임시 테이블)를 생성하는 경우 해당 개체는 현재 세션의 나머지 부분에 대한 스포츠 토토 멤버로 처리되지만 임시 개체와 마찬가지로 세션 종료 시 자동으로 삭제됩니다. 이는 전체 스포츠 토토을 삭제하지 않고는 스포츠 토토 구성원 개체를 삭제할 수 없다는 규칙의 예외입니다.

36.17.1. 스포츠 토토 파일#

스포츠 토토 프로그램 만들기명령은 각 스포츠 토토자에 대한 제어 파일에 의존하며, 접미사가 붙은 스포츠 토토자와 동일하게 이름을 지정해야 합니다..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'. 이 스포츠 토토 프로그램을 설치하려면 먼저 해당 스포츠 토토 프로그램을 설치해야 합니다.

no_relocate (문자열) #

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

수퍼유저 (부울) #

이 매개변수가 다음과 같은 경우(기본값), 슈퍼유저만 스포츠 토토 프로그램을 생성하거나 새 버전으로 업데이트할 수 있습니다(또한 참조신뢰할 수 있는, 아래). 으로 설정된 경우거짓, 설치 또는 업데이트 스크립트에서 명령을 실행하는 데 필요한 권한만 필요합니다. 일반적으로 다음과 같이 설정되어야 합니다.스크립트 명령 중 슈퍼유저 권한이 필요한 경우. (이러한 명령은 어쨌든 실패하지만 오류를 미리 알려주는 것이 사용자에게 더 친숙합니다.)

신뢰할 수 있는 (부울) #

이 매개변수는 다음으로 설정된 경우(기본값은 아님) 수퍼유저가 아닌 일부 사용자가 다음과 같은 스포츠 토토 기능을 설치할 수 있도록 허용합니다.수퍼유저다음으로 설정됨. 특히 다음과 같은 사용자에게는 설치가 허용됩니다.생성현재 데이터베이스에 대한 권한입니다. 사용자가 실행하는 경우스포츠 토토 프로그램 생성은(는) 수퍼유저가 아니지만 이 매개변수 덕분에 설치가 허용된 경우 설치 또는 업데이트 스크립트는 호출 사용자가 아닌 부트스트랩 수퍼유저로 실행됩니다. 이 매개변수는 다음과 같은 경우에는 관련이 없습니다.수퍼유저is거짓. 일반적으로 파일 시스템 액세스와 같이 슈퍼유저 전용 기능에 대한 액세스를 허용할 수 있는 스포츠 토토의 경우 true로 설정하면 안 됩니다. 또한 스포츠 토토 프로그램을 신뢰할 수 있음으로 표시하려면 스포츠 토토 프로그램의 설치 및 업데이트 스크립트를 안전하게 작성하기 위해 상당한 추가 노력이 필요합니다. 참조섹션 36.17.6.

재배치 가능 (부울) #

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

스키마 (문자열) #

이 매개변수는 재배치 불가능한 스포츠 토토에 대해서만 설정될 수 있습니다. 스포츠 토토이 다른 스키마가 아닌 명명된 스키마에 정확히 로드되도록 강제합니다.스키마매개변수는 스포츠 토토 업데이트 중에는 참조되지 않고 처음 스포츠 토토을 생성할 때만 참조됩니다. 참조섹션 36.17.2더 많은 정보를 원하시면.

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

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

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

스포츠 토토 스크립트에 문자열이 포함되어 있는 경우@extowner@, 해당 문자열은 호출하는 사용자의 (적절하게 인용된) 이름으로 대체됩니다.스포츠 토토 프로그램 생성또는스포츠 토토 프로그램 변경. 일반적으로 이 기능은 선택한 개체의 소유권을 부트스트랩 수퍼유저가 아닌 호출 사용자에게 할당하기 위해 신뢰할 수 있다고 표시된 스포츠 토토에서 사용됩니다. (그러나 그렇게 할 때는 주의해야 합니다. 예를 들어, 슈퍼유저가 아닌 사람에게 C 언어 기능의 소유권을 할당하면 해당 사용자에 대한 권한 에스컬레이션 경로가 생성됩니다.)

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

36.17.2. 스포츠 토토 재배치성#

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

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

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

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

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

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

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

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

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

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

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

스포츠 토토이 다른 스포츠 토토에 속하는 개체를 참조하는 경우 해당 참조를 스키마 한정하는 것이 좋습니다. 그렇게 하려면 다음을 작성하세요.@extschema:이름@스포츠 토토 프로그램의 스크립트 파일에서, 여기서이름다른 스포츠 토토의 이름입니다(이 스포츠 토토의 이름에 나열되어야 함요구목록). 이 문자열은 해당 스포츠 토토의 대상 스키마 이름(필요한 경우 큰따옴표)으로 대체됩니다. 이 표기법을 사용하면 스포츠 토토의 스크립트 파일에 있는 스키마 이름에 대해 고정된 가정을 할 필요가 없지만 이를 사용하면 다른 스포츠 토토의 스키마 이름이 이 스포츠 토토의 설치된 개체에 포함될 수 있습니다. (일반적으로 다음과 같은 경우에 발생합니다.@extschema:이름@함수 본문이나 a와 같은 문자열 리터럴 내부에서 사용됩니다.검색_경로설정. 다른 경우에는 구문 분석 중에 객체 참조가 OID로 줄어들고 후속 조회가 필요하지 않습니다.) 다른 스포츠 토토의 스키마 이름이 너무 포함되어 있는 경우 이 스포츠 토토의 이름에 다른 스포츠 토토의 이름을 추가하여 설치 후 다른 스포츠 토토이 재배치되는 것을 방지해야 합니다.no_relocate목록.

36.17.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제공어디에서38722_38796

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.17.4. 스포츠 토토 업데이트#

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

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

스포츠 토토 프로그램에 보조 제어 파일이 있는 경우 업데이트 스크립트에 사용되는 제어 매개변수는 스크립트의 대상(새) 버전과 연결된 매개변수입니다.

스포츠 토토 프로그램 변경는 요청된 업데이트를 달성하기 위해 일련의 업데이트 스크립트 파일을 실행할 수 있습니다. 예를 들어 다음과 같은 경우에만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.17.5. 업데이트 스크립트를 사용하여 스포츠 토토 설치#

한동안 사용된 스포츠 토토 기능은 아마도 여러 버전에 존재할 것이며, 이에 대한 작성자는 업데이트 스크립트를 작성해야 합니다. 예를 들어,foo버전의 스포츠 토토명1.0, 1.11.2, 업데이트 스크립트가 있어야 합니다foo--1.0--1.1.sql그리고foo--1.1--1.2.sql. 이전PostgreSQL10, 새로운 스크립트 파일도 생성해야 했습니다foo--1.1.sql그리고foo--1.2.sql최신 스포츠 토토 버전을 직접 빌드하거나 설치만으로 최신 버전을 직접 설치할 수 없습니다.1.0그리고 업데이트 중입니다. 그것은 지루하고 중복적이었지만 이제는 불필요합니다. 왜냐하면스포츠 토토 프로그램 만들기업데이트 체인을 자동으로 따라갈 수 있습니다. 예를 들어 스크립트 파일만 있는 경우foo--1.0.sql, foo--1.0--1.1.sqlfoo--1.1--1.2.sql이후 버전 설치 요청이 가능합니다.1.2이 세 스크립트를 순서대로 실행하면 영광입니다. 처리는 처음 설치한 것과 동일합니다.1.0다음으로 업데이트됨1.2. (와 마찬가지로스포츠 토토 프로그램 업데이트 변경, 여러 경로를 사용할 수 있는 경우 가장 짧은 경로가 선호됩니다.) 스포츠 토토 프로그램의 스크립트 파일을 이 스타일로 정렬하면 작은 업데이트를 생성하는 데 필요한 유지 관리 노력을 줄일 수 있습니다.

이 스타일로 유지되는 스포츠 토토자를 가진 보조(버전별) 제어 파일을 사용하는 경우 각 버전에 독립 실행형 설치 스크립트가 없더라도 제어 파일이 필요하다는 점을 명심하십시오. 해당 제어 파일이 해당 버전에 대한 암시적 업데이트 수행 방법을 결정하기 때문입니다. 예를 들어, 만약foo--1.0.control지정요구 = '바'하지만foo의 다른 제어 파일은 그렇지 않습니다. 스포츠 토토 프로그램의 종속성은다음에서 업데이트할 때 삭제됩니다1.0다른 버전으로.

36.17.6. 스포츠 토토에 대한 보안 고려 사항#

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

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

스포츠 토토자가 표시된 경우신뢰할 수 있는, 그러면 설치 사용자가 해당 설치 스키마를 선택할 수 있습니다. 이 사용자는 슈퍼유저 권한을 얻기 위해 의도적으로 안전하지 않은 스키마를 사용할 수 있습니다. 따라서 신뢰할 수 있는 스포츠 토토 프로그램은 보안 관점에서 극도로 노출되어 있으며 모든 스크립트 명령을 주의 깊게 검사하여 손상될 가능성이 없는지 확인해야 합니다.

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

36.17.6.1. 스포츠 토토 기능에 대한 보안 고려 사항#

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

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

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

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

36.17.6.2. 스포츠 토토 스크립트에 대한 보안 고려 사항#

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

다음과 같은 DDL 명령함수 생성그리고오퍼레이터 클래스 생성은 일반적으로 안전하지만 범용 표현식을 구성 요소로 포함하는 명령에 주의하세요. 예를 들어,보기 만들기a와 마찬가지로 조사가 필요합니다.기본값표현식함수 생성.

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

교차 스포츠 토토 참조는 부분적으로 다른 스포츠 토토이 어떤 스키마에 있는지에 대한 불확실성으로 인해 완전히 보안을 유지하기가 매우 어렵습니다. 두 스포츠 토토이 동일한 스키마에 설치되면 설치 시간에 적대적인 객체가 참조 스포츠 토토보다 앞에 배치될 수 없기 때문에 위험이 줄어듭니다.검색_경로. 그러나 현재 이를 요구하는 메커니즘은 없습니다. 현재 가장 좋은 방법은 다른 스포츠 토토 프로그램이 항상 설치되어 있지 않는 한 다른 스포츠 토토 프로그램에 의존하는 경우 해당 스포츠 토토 프로그램을 신뢰할 수 있다고 표시하지 않는 것입니다.pg_catalog.

36.17.7. 스포츠 토토 예#

여기에 완전한 예가 있습니다.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 = 텍스트, FUNCTION = 쌍);

-- "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.18. 명령설치하기다음에서 보고한 대로 올바른 디렉토리에 제어 및 스크립트 파일을 설치합니다.pg_config.

파일이 설치되면 다음을 사용하십시오.스포츠 토토 프로그램 만들기개체를 특정 데이터베이스에 로드하는 명령입니다.

수정사항 제출

문서에 올바르지 않은 내용이 있으면 일치하지 않습니다. 특정 기능에 대한 경험이 있거나 추가 설명이 필요한 경우 이용해주세요이 양식문서 문제를 보고합니다.