| PostgreSQL 9.3.25 문서 | ||||
|---|---|---|---|---|
| 이전 | 배트맨 토토 : 문서 : 9.3 : Frontend/백엔드 프로토콜 | 48장. 프런트엔드/백엔드 프로토콜 | PostgreSQL : 문서 : 9.3 : 토토 사이트 복제 프로토콜 | |
이 섹션에서는 토토 사이트 흐름과 의미를 설명합니다. 각 토토 사이트 유형. (각각의 정확한 표현에 대한 자세한 내용은 토토 사이트가 나타납니다.PostgreSQL : 문서 : 9.3 : 사설 토토 형식.) 다음에 따라 여러 가지 하위 프로토콜이 있습니다. 연결 상태: 시작, 쿼리, 함수 호출,복사및 종료. 또한 있다 비동기 작업에 대한 특별 조항(포함 알림 응답 및 명령 취소)이 발생할 수 있습니다. 시작 단계 이후 언제든지.
세션을 시작하기 위해 프런트엔드는 서버에 대한 연결을 엽니다. 그리고 시작 메시지를 보냅니다. 이 메시지에는 사용자 및 사용자가 연결하려는 데이터베이스 그것도 사용할 특정 프로토콜 버전을 식별합니다. (선택적으로, 시작 메시지에는 런타임에 대한 추가 설정이 포함될 수 있습니다. 매개 변수.) 그런 다음 서버는 이 정보와 콘텐츠를 사용합니다. 구성 파일(예:pg_hba.conf) 연결 여부를 확인합니다. 잠정적으로 허용되는 추가 인증은 무엇입니까? 필수입니다(있는 경우).
그러면 서버는 적절한 인증 요청을 보냅니다 프론트엔드가 적절한 응답으로 응답해야 하는 토토 사이트 인증 응답 토토 사이트(예: 비밀번호) 모두를 위해 GSSAPI, SSPI를 제외한 인증 방법은 최대 1개입니다. 요청과 하나의 응답. 일부 방법에서는 전혀 응답이 없습니다. 프런트엔드에서 필요하므로 인증 요청이 발생하지 않습니다. GSSAPI 및 SSPI의 경우 여러 패킷 교환이 필요할 수 있습니다. 인증을 완료하세요.
인증 주기는 서버가 거부하거나 거부하면서 끝납니다. 연결 시도(ErrorResponse) 또는 전송 인증알았어.
이 단계에서 서버로부터 가능한 메시지는 다음과 같습니다:
연결 시도가 거부되었습니다. 그러면 서버는 즉시 연결을 종료합니다.
인증 교환이 성공적으로 완료되었습니다.
프런트엔드는 이제 Kerberos V5 인증에 참여해야 합니다. 대화 상자(여기에서는 설명되지 않음, Kerberos 사양의 일부) 서버와 함께. 이것이 성공하면 서버는 다음과 같이 응답합니다. AuthenticationOk, 그렇지 않으면 ErrorResponse로 응답합니다.
프런트엔드는 이제 다음을 포함하는 비밀번호 메시지를 보내야 합니다. 일반 텍스트 형식의 비밀번호입니다. 이것이 올바른 비밀번호라면, 서버는 AuthenticationOk로 응답하고, 그렇지 않으면 응답합니다. ErrorResponse를 사용합니다.
이제 프런트엔드는 다음을 포함하는 비밀번호 메시지를 보내야 합니다.
MD5를 통해 암호화된 비밀번호(사용자 이름 포함)를 다시 암호화했습니다.
지정된 4바이트 무작위 솔트를 사용하여
인증MD5비밀번호 메시지입니다. 이 비밀번호가 맞다면,
서버는 AuthenticationOk로 응답하고, 그렇지 않으면 응답합니다.
ErrorResponse로. 실제 PasswordMessage를 계산할 수 있습니다.
SQL에서는 다음과 같이concat('md5',
md5(concat(md5(concat(비밀번호, 사용자 이름)), 무작위-소금))).
( 명심하세요md5()함수
결과를 16진수 문자열로 반환합니다.)
이 응답은 로컬 Unix 도메인 연결에서만 가능합니다. SCM 자격 증명 메시지를 지원하는 플랫폼에서. 프런트엔드 SCM 자격 증명 메시지를 발행한 다음 단일 데이터를 보내야 합니다. 바이트. (데이터 바이트의 내용은 흥미롭지 않습니다. 서버가 메시지를 받을 때까지 충분히 오래 기다리도록 하는 데 사용됩니다. 자격 증명 메시지.) 자격 증명이 허용되는 경우 서버는 AuthenticationOk로 응답하고, 그렇지 않으면 다음으로 응답합니다. 오류응답. (이 메시지 유형은 9.1 이전 버전에서만 발행됩니다. 서버. 결국 프로토콜에서 제거될 수 있음 사양.)
이제 프런트엔드가 GSSAPI 협상을 시작해야 합니다. 그만큼 프런트엔드는 첫 번째 부분과 함께 PasswordMessage를 보냅니다. 이에 대한 응답으로 GSSAPI 데이터 스트림이 제공됩니다. 추가 토토 사이트가 있는 경우 필요한 경우 서버는 AuthenticationGSSContinue로 응답합니다.
프런트엔드는 이제 SSPI 협상을 시작해야 합니다. 프런트엔드 SSPI 데이터의 첫 번째 부분과 함께 PasswordMessage를 보냅니다. 이에 대한 응답으로 스트리밍합니다. 추가 토토 사이트가 필요한 경우 서버는 AuthenticationGSSContinue로 응답합니다.
이 메시지에는 이전 단계의 응답 데이터가 포함되어 있습니다 GSSAPI 또는 SSPI 협상(AuthenticationGSS, AuthenticationSSPI 또는 이전 AuthenticationGSS계속). 만약 이 메시지의 GSSAPI 또는 SSPI 데이터는 더 많은 데이터가 필요함을 나타냅니다. 인증을 완료하려면 프런트엔드에서 해당 데이터를 다음과 같이 보내야 합니다. 다른 비밀번호 메시지. GSSAPI 또는 SSPI 인증이 이 메시지가 완료되면 서버는 다음에 메시지를 보냅니다. AuthenticationOk는 성공적인 인증을 나타냅니다. 실패를 나타내는 ErrorResponse입니다.
서버는 요청된 마이너 프로토콜 버전을 지원하지 않습니다. 클라이언트에 의해 실행되지만 이전 버전의 프로토콜을 지원합니다. 이 메시지는 지원되는 가장 높은 부 버전을 나타냅니다. 이것 클라이언트가 지원되지 않는 것을 요청한 경우에도 메시지가 전송됩니다. 프로토콜 옵션(예: 다음으로 시작)_pq_.)을 시작 패킷에 넣습니다. 이 토토 사이트는 그 뒤에는 ErrorResponse 또는 성공을 나타내는 토토 사이트가 옵니다. 인증 실패.
프런트엔드가 인증 방법을 지원하지 않는 경우 서버에서 요청하면 즉시 닫혀야 합니다. 연결.
AuthenticationOk를 받은 후 프런트엔드는 기다려야 합니다. 서버의 추가 메시지를 확인하세요. 이 단계에서는 백엔드 프로세스가 시작되고 있으며 프런트엔드에 관심이 있을 뿐입니다. 방관자. 시작 시도가 실패할 가능성이 여전히 있습니다. (ErrorResponse) 또는 서버가 요청한 지원을 거부합니다. 부 프로토콜 버전(NegotiateProtocolVersion)이지만 일반적인 경우 백엔드는 일부 ParameterStatus 메시지를 보냅니다. BackendKeyData, 마지막으로 ReadyForQuery입니다.
이 단계 동안 백엔드는 다음을 적용하려고 시도합니다. 추가 런타임 매개변수 설정은 시작 메시지. 성공하면 이 값은 세션이 됩니다. 기본값. 오류로 인해 ErrorResponse가 발생하고 종료됩니다.
이 단계에서 백엔드에서 가능한 메시지는 다음과 같습니다.
이 토토 사이트는 프런트엔드가 반드시 수행해야 하는 비밀 키 데이터를 제공합니다. 나중에 취소 요청을 발행할 수 있도록 하려면 저장하세요. 그만큼 프런트엔드는 이 토토 사이트에 응답하지 않아야 하지만 계속되어야 합니다. ReadyForQuery 토토 사이트를 수신합니다.
이 메시지는 프런트엔드에 현재(초기)에 대해 알려줍니다. 다음과 같은 백엔드 매개변수 설정client_encoding또는날짜 스타일. 그만큼 프런트엔드는 이 토토 사이트를 무시하거나 해당 설정을 기록할 수 있습니다. 향후 사용; 보다섹션 48.2.6자세한 내용을 확인하세요. 프런트엔드는 다음 사항에 응답해서는 안 됩니다. 이 메시지는 계속해서 ReadyForQuery를 수신해야 합니다. 메시지.
시작이 완료되었습니다. 이제 프런트엔드에서 명령을 실행할 수 있습니다.
시작에 실패했습니다. 이 토토 사이트를 보낸 후 연결이 종료됩니다. 토토 사이트.
경고 메시지가 발행되었습니다. 프런트엔드가 표시되어야 합니다. 메시지를 수신하지만 ReadyForQuery를 계속 수신하거나 오류응답.
ReadyForQuery 메시지는 백엔드가 보내는 메시지와 동일합니다. 각 명령 주기 후에 발행됩니다. 코딩 요구 사항에 따라 프론트엔드에서는 ReadyForQuery를 다음과 같이 고려하는 것이 합리적입니다. 명령 주기 시작 또는 ReadyForQuery 종료로 간주 시작 단계 및 각 후속 명령 주기.
간단한 쿼리 주기는 프런트엔드에서 다음을 전송하여 시작됩니다. 백엔드에 대한 쿼리 메시지입니다. 메시지에 SQL 명령이 포함되어 있습니다. (또는 명령)을 텍스트 문자열로 표현합니다. 그런 다음 백엔드는 다음을 보냅니다. 내용에 따라 하나 이상의 응답 메시지 쿼리 명령 문자열, 마지막으로 ReadyForQuery 응답 메시지입니다. ReadyForQuery는 프런트엔드에 새 메시지를 안전하게 보낼 수 있음을 알립니다. 명령. (실제로 프론트엔드가 기다릴 필요는 없습니다. 다른 명령을 실행하기 전에 ReadyForQuery를 수행해야 하지만 프런트엔드는 다음을 수행해야 합니다. 그런 다음 다음과 같은 경우 어떤 일이 발생하는지 파악하는 책임을 집니다. 이전 명령이 실패하고 이미 실행된 이후 명령 성공합니다.)
백엔드에서 가능한 응답 메시지는 다음과 같습니다:
SQL 명령이 정상적으로 완료되었습니다.
백엔드가 프런트엔드에서 테이블로 데이터를 복사할 준비가 되었습니다. 보다섹션 48.2.5.
백엔드가 테이블에서 프런트엔드로 데이터를 복사할 준비가 되었습니다. 보다섹션 48.2.5.
다음에 대한 응답으로 행이 곧 반환될 것임을 나타냅니다.선택, 가져오기, 등 질의합니다. 이 토토 사이트의 내용은 열 레이아웃을 설명합니다. 행의. 그 뒤에는 각 항목에 대한 DataRow 토토 사이트가 표시됩니다. 행이 프런트엔드로 반환됩니다.
a에 의해 반환된 행 집합 중 하나선택, 가져오기등 질문.
빈 쿼리 문자열이 인식되었습니다.
오류가 발생했습니다.
쿼리 문자열 처리가 완료되었습니다. 별도의 메시지 쿼리 문자열에 다음이 포함될 수 있으므로 이를 나타내기 위해 전송됩니다. 여러 SQL 명령. (CommandComplete는 처리 종료를 표시합니다. 전체 문자열이 아닌 하나의 SQL 명령입니다.) ReadyForQuery는 항상 처리가 성공적으로 종료되었는지 또는 오류.
문의와 관련하여 경고 토토 사이트가 발행되었습니다. 알림은 다른 응답에 추가됩니다. 즉, 백엔드는 계속해서 명령을 처리하세요.
a에 대한 응답선택질의(또는 다음과 같이 행 집합을 반환하는 기타 쿼리설명또는표시) 일반적으로 RowDescription, 0개 이상의 DataRow 메시지로 구성됩니다. 명령완료.복사~에서 또는 프런트엔드는 다음에 설명된 대로 특수 프로토콜을 호출합니다.섹션 48.2.5. 기타 모든 쿼리 유형은 일반적으로 CommandComplete 토토 사이트만 생성합니다.
쿼리 문자열에는 여러 개의 쿼리가 포함될 수 있으므로( 세미콜론), 이전에 이러한 응답 시퀀스가 여러 개 있을 수 있습니다. 백엔드가 쿼리 문자열 처리를 완료합니다. ReadyForQuery는 전체 문자열이 처리되고 백엔드가 완료되면 발행됩니다. 새 쿼리 문자열을 받아들일 준비가 되었습니다.
완전히 비어 있는(공백 이외의 내용 없음) 쿼리인 경우 문자열이 수신되면 응답은 다음과 같습니다.EmptyQueryResponse ReadyForQuery.
오류 발생 시 ErrorResponse가 발행되고 ReadyForQuery. 쿼리 문자열의 모든 추가 처리는 다음과 같습니다. ErrorResponse에 의해 중단되었습니다(더 많은 쿼리가 남아 있더라도). 이는 메시지 시퀀스 도중에 발생할 수 있습니다. 개별 쿼리에 의해 생성되었습니다.
간단한 쿼리 모드에서 검색된 값의 형식은 항상 다음과 같습니다. 텍스트(주어진 명령이 다음과 같은 경우 제외)가져오기다음으로 선언된 커서에서바이너리옵션. 이 경우 검색된 값은 바이너리 형식입니다. RowDescription에 제공된 형식 코드 메시지는 어떤 형식이 사용되고 있는지 알려줍니다.
프런트엔드는 ErrorResponse를 수용할 준비가 되어 있어야 하며 다른 유형의 토토 사이트가 나타날 때마다 통지응답 토토 사이트가 나타납니다. 토토 사이트. 또한 참조하세요섹션 48.2.6관련 외부 이벤트로 인해 백엔드가 생성할 수 있는 토토 사이트입니다.
권장되는 방법은 상태 머신에서 프런트엔드를 코딩하는 것입니다. 언제든지 모든 토토 사이트 유형을 허용하는 스타일 정확한 것에 대한 가정을 세우는 것보다 의미가 있습니다. 토토 사이트의 순서입니다.
확장 쿼리 프로토콜은 위에서 설명한 내용을 분석합니다. 간단한 쿼리 프로토콜을 여러 단계로 변환합니다. 결과 개선을 위해 준비 단계를 여러 번 재사용할 수 있습니다. 능률. 그 밖에도 다음과 같은 추가 기능을 사용할 수 있습니다. 데이터 값을 별도의 매개변수로 제공할 수 있는 가능성 쿼리 문자열에 직접 삽입할 필요가 없습니다.
확장 프로토콜에서는 프런트엔드가 먼저 Parse를 보냅니다. 텍스트 쿼리 문자열을 포함하는 메시지(선택적으로 일부) 매개변수 자리 표시자의 데이터 유형에 대한 정보 대상 준비된 명령문 개체의 이름(빈 문자열 이름이 지정되지 않은 준비된 문을 선택합니다). 응답은 다음 중 하나입니다. ParseComplete 또는 ErrorResponse. 매개변수 데이터 유형은 다음과 같습니다. OID로 지정됩니다. 주어지지 않으면 파서는 다음을 추론하려고 시도합니다. 유형이 지정되지 않은 리터럴과 동일한 방식으로 데이터 유형을 지정합니다. 문자열 상수.
참고:매개변수 데이터 유형은 다음에 의해 지정되지 않은 채로 남을 수 있습니다. 0으로 설정하거나 매개변수 유형 OID 배열을 만들어서 매개변수 기호 개수()보다 짧습니다.$n)에 사용됨 쿼리 문자열. 또 다른 특별한 경우는 매개변수의 유형이 다음과 같이 지정됨무효(즉, OID는무효유사형). 이는 허용한다는 의미입니다. 다음과 같은 기능 매개변수에 사용되는 매개변수 기호 실제로는 OUT 매개변수입니다. 일반적으로 a무효매개변수를 사용할 수 있지만 그러한 경우 매개변수 기호는 함수의 매개변수 목록에 나타납니다. 효과적으로 무시됩니다. 예를 들어, 다음과 같은 함수 호출은foo($1,$2,$3,$4)함수와 일치할 수 있음 IN 인수 2개와 OUT 인수 2개를 사용하는 경우, if$3그리고$4유형이 있는 것으로 지정됨무효.
참고:분석 토토 사이트에 포함된 쿼리 문자열 둘 이상의 SQL 문을 포함할 수 없습니다. 그렇지 않으면 구문 오류가 발생합니다. 보고되었습니다. 이 제한은 단순 쿼리에는 존재하지 않습니다. 프로토콜이지만 확장 프로토콜에는 존재합니다. 준비된 명령문이나 포털에 여러 개를 포함할 수 있도록 허용 명령을 사용하면 프로토콜이 지나치게 복잡해집니다.
성공적으로 생성되면 명명된 준비된 명령문 개체가 지속됩니다. 명시적으로 삭제되지 않는 한 현재 세션이 끝날 때까지 유지됩니다. 이름이 지정되지 않은 준비된 문은 다음 구문 분석까지만 지속됩니다. 이름 없는 명령문을 대상으로 지정하는 명령문은 다음과 같습니다. 발행. (간단한 쿼리 메시지도 이름이 지정되지 않은 쿼리 메시지를 삭제합니다. 문.) 명명된 준비된 문은 명시적으로 닫혀야 합니다. 다른 Parse 메시지로 재정의되기 전에는 이름이 지정되지 않은 문에는 필요하지 않습니다. 명명된 준비된 명령문 다음을 사용하여 SQL 명령 수준에서 생성하고 액세스할 수도 있습니다.준비그리고실행.
준비된 명령문이 존재하면 다음을 위해 준비될 수 있습니다. Bind 메시지를 사용하여 실행합니다. 바인딩 메시지는 다음과 같은 이름을 제공합니다. 소스가 준비된 명령문(빈 문자열은 이름이 지정되지 않음을 나타냄) 준비된 문), 대상 포털 이름(비어 있음) 문자열은 이름이 지정되지 않은 포털을 나타냄) 및 모든 항목에 사용할 값 준비된 문에 매개변수 자리 표시자가 있습니다. 그만큼 제공된 매개변수 세트는 준비된 매개변수 세트에 필요한 것과 일치해야 합니다. 성명. (당신이 선언한 경우)공허파라미터 메시지의 매개변수에 대해 NULL 값을 전달합니다. 바인드 메시지.) 바인드는 또한 모든 데이터에 사용할 형식을 지정합니다. 쿼리에 의해 반환되었습니다. 형식을 전체적으로 지정할 수 있습니다. 열당. 응답은 BindComplete 또는 오류응답.
참고:텍스트와 바이너리 출력 사이의 선택은 다음과 같습니다 SQL에 관계없이 Bind에 지정된 형식 코드에 따라 결정됩니다. 관련 명령. 그만큼바이너리속성 확장 쿼리를 사용할 때 커서 선언은 관련이 없습니다. 규약.
쿼리 계획은 일반적으로 바인드 메시지가 다음과 같을 때 발생합니다. 처리됨. 준비된 명령문에 매개변수가 없거나 반복적으로 실행되면 서버는 생성된 계획을 저장하고 동일한 준비된 메시지에 대한 후속 바인딩 메시지 중에 다시 사용하십시오. 성명. 그러나 일반 항목이 발견된 경우에만 그렇게 합니다. 계획보다 훨씬 덜 효율적인 계획을 만들 수 있습니다. 이는 제공된 특정 매개변수 값에 따라 달라집니다. 이것 프로토콜에 관한 한 투명하게 발생합니다.
성공적으로 생성되면 명명된 포털 개체는 다음까지 지속됩니다. 명시적으로 삭제되지 않는 한 현재 트랜잭션이 종료됩니다. 안 이름이 지정되지 않은 포털은 거래가 끝나면 파괴됩니다. 이름이 지정되지 않은 포털을 다음과 같이 지정하는 다음 Bind 문이 실행되자마자 목적지가 발행됩니다. (간단한 쿼리 메시지도 이름이 지정되지 않은 포털을 삭제합니다.) 이름이 지정된 포털은 명시적으로 지정되어야 합니다. 다른 Bind 메시지에 의해 재정의되기 전에 닫히지만 이름이 지정되지 않은 포털에는 필요하지 않습니다. 명명된 포털도 가능합니다. 다음을 사용하여 SQL 명령 수준에서 생성 및 액세스할 수 있습니다.커서 선언그리고가져오기.
포털이 존재하면 실행을 사용하여 실행할 수 있습니다. 메시지. 실행 메시지는 포털 이름(비어 있음)을 지정합니다. 문자열은 이름이 지정되지 않은 포털을 나타냄) 및 최대 결과 행 수 (의미 없음"모든 행 가져오기"). 그만큼 결과 행 수는 명령이 포함된 포털에만 의미가 있습니다. 행 세트를 반환합니다. 다른 경우에는 명령이 항상 실행됩니다. 완료되고 행 개수는 무시됩니다. 가능한 응답 실행하는 것은 실행된 쿼리에 대해 위에서 설명한 것과 동일합니다. Execute가 원인이 되지 않는다는 점을 제외하고는 간단한 쿼리 프로토콜을 통해 ReadyForQuery 또는 RowDescription이 발행됩니다.
실행이 완료되기 전에 실행이 종료되는 경우 포털(0이 아닌 결과 행 개수에 도달하여) PortalSuspended 메시지; 이 메시지의 출현은 동일한 항목에 대해 또 다른 Execute가 실행되어야 한다는 프런트엔드 작업을 완료하는 포털입니다. CommandComplete 메시지 소스 SQL 명령의 완료를 나타내는 메시지는 다음까지 전송되지 않습니다. 포털 실행이 완료되었습니다. 따라서 실행 단계는 다음과 같습니다. 항상 다음 중 정확히 하나의 출현으로 종료됩니다. 메시지: CommandComplete, EmptyQueryResponse(포털이 빈 쿼리 문자열에서 생성됨), ErrorResponse 또는 포털이 일시 중지되었습니다.
각 확장 쿼리 메시지 시리즈가 완료되면 프런트엔드는 동기화 메시지를 발행해야 합니다. 이 매개변수 없는 메시지 그렇지 않은 경우 백엔드가 현재 트랜잭션을 닫도록 합니다. 내부에시작/커밋트랜잭션 차단("닫기"오류가 없으면 커밋하거나 롤백한다는 의미 오류인 경우). 그런 다음 ReadyForQuery 응답이 발행됩니다. 목적 동기화는 오류 복구를 위한 재동기화 지점을 제공하는 것입니다. 확장 쿼리 처리 중 오류가 감지된 경우 메시지가 나타나면 백엔드는 ErrorResponse를 발행한 후 읽고 삭제합니다. 동기화에 도달할 때까지 메시지를 보낸 다음 ReadyForQuery를 발행하고 정상적인 메시지 처리로 돌아갑니다. (그러나 건너뛰는 것은 금지되어 있습니다. 오류가 감지되면 발생합니다그동안동기화 처리 중 — 이를 통해 각각에 대해 단 하나의 ReadyForQuery가 전송됩니다. 동조.)
참고:동기화로 인해 트랜잭션 블록이 열리지 않습니다.시작폐쇄됩니다. 가능하다 ReadyForQuery 메시지에 다음이 포함되어 있으므로 이 상황을 감지합니다. 거래상태정보입니다.
이러한 기본적이고 필수 작업 외에도 다음이 있습니다. 확장 쿼리와 함께 사용할 수 있는 몇 가지 선택적 작업 규약.
설명 메시지(포털 변형)는 기존 포털(또는 이름이 지정되지 않은 포털의 경우 빈 문자열)입니다. 그만큼 응답은 행을 설명하는 RowDescription 메시지입니다. 포털을 실행하여 반환됩니다. 또는 NoData 메시지인 경우 포털에는 행을 반환하는 쿼리가 포함되어 있지 않습니다. 또는 해당 포털이 없는 경우 ErrorResponse입니다.
설명 메시지(문 변형)는 다음의 이름을 지정합니다. 기존의 준비된 문(또는 이름이 지정되지 않은 경우 빈 문자열) 준비된 진술). 응답은 ParameterDescription 메시지입니다. 명령문에 필요한 매개변수를 설명하고 그 뒤에 반환될 행을 설명하는 RowDescription 메시지 명령문이 최종적으로 실행될 때(또는 다음과 같은 경우 NoData 메시지) 명령문은 행을 반환하지 않습니다.) 다음과 같은 경우 ErrorResponse가 발행됩니다. 그런 준비된 진술은 없습니다. Bind는 그렇지 않았기 때문에 아직 발행되지 않았지만 반환된 열에 사용할 형식은 다음과 같습니다. 아직 백엔드에 알려지지 않았습니다. 형식 코드 필드 이 경우 RowDescription 메시지는 0이 됩니다.
팁:대부분의 시나리오에서 프런트엔드는 하나 또는 Execute를 실행하기 전에 설명의 다른 변형을 사용하여 반환될 결과를 해석하는 방법을 알고 있습니다.
닫기 메시지는 기존의 준비된 명령문을 닫거나 포털 및 릴리스 리소스. Close를 발행하는 것은 오류가 아닙니다. 존재하지 않는 문이나 포털 이름에 대해. 응답은 다음과 같습니다 일반적으로 CloseComplete이지만 일부 경우 ErrorResponse일 수 있습니다. 리소스를 공개하는 동안 문제가 발생했습니다. 참고하세요 준비된 문을 닫으면 열려 있는 모든 포털이 암시적으로 닫힙니다. 그 진술로 구성된 것입니다.
플러시 토토 사이트로 인해 특정 출력이 발생하지 않습니다. 생성되지만 백엔드가 보류 중인 모든 데이터를 전달하도록 강제합니다. 출력 버퍼. 확장 쿼리 후에는 Flush를 보내야 합니다. 프런트엔드가 결과를 검사하려는 경우 Sync를 제외한 명령 더 많은 명령을 내리기 전에 해당 명령을 확인하세요. 플러시 없이, 백엔드에서 반환된 토토 사이트는 최소 개수로 결합됩니다. 네트워크 오버헤드를 최소화하기 위해 가능한 패킷 수입니다.
참고:간단한 쿼리 메시지는 대략 다음과 같습니다. Parse, Bind, Portal Description, Execute 시리즈와 동일합니다. 이름이 지정되지 않은 준비된 문 및 포털을 사용하여 닫기, 동기화 객체가 있고 매개변수가 없습니다. 한 가지 차이점은 허용된다는 것입니다. 쿼리 문자열의 여러 SQL 문이 자동으로 각각에 대해 바인드/설명/실행 순서를 수행합니다. 계승. 또 다른 차이점은 반환되지 않는다는 것입니다. ParseComplete, BindComplete, CloseComplete 또는 NoData 메시지.
함수 호출 하위 프로토콜은 클라이언트가 데이터베이스에 존재하는 모든 함수를 직접 호출합니다.pg_proc시스템 카탈로그. 클라이언트는 반드시 함수에 대한 실행 권한이 있습니다.
참고:함수 호출 하위 프로토콜은 레거시 기능입니다. 새로운 코드에서는 이를 피하는 것이 가장 좋습니다. 비슷한 결과가 나올 수 있습니다 다음과 같은 준비된 문을 설정하여 수행됩니다.SELECT 함수($1, ...). 기능 그런 다음 호출 주기를 바인딩/실행으로 대체할 수 있습니다.
함수 호출 주기는 프런트엔드가 다음을 전송하여 시작됩니다. 백엔드에 대한 FunctionCall 메시지입니다. 그런 다음 백엔드는 다음 중 하나를 보냅니다. 함수 결과에 따라 더 많은 응답 메시지 호출하고 마지막으로 ReadyForQuery 응답 메시지를 보냅니다. 쿼리 준비 새 쿼리를 안전하게 보낼 수 있음을 프런트엔드에 알립니다. 함수 호출.
백엔드에서 가능한 응답 메시지는 다음과 같습니다:
오류가 발생했습니다.
함수 호출이 완료되었으며 다음에 제공된 결과를 반환했습니다. 메시지. (함수 호출 프로토콜은 오직 행 유형이나 결과 집합이 아닌 단일 스칼라 결과입니다.)
함수 호출 처리가 완료되었습니다. ReadyForQuery는 처리가 성공적으로 종료되었는지 또는 종료되었는지 여부에 관계없이 항상 전송됩니다. 오류입니다.
기능과 관련하여 경고 토토 사이트가 발행되었습니다 부르다. 알림은 다른 응답, 즉 백엔드에 추가됩니다. 계속해서 명령을 처리합니다.
그복사명령은 고속 대량을 허용합니다 서버와의 데이터 전송. 복사 및 복사 각 작업은 연결을 별개의 하위 프로토콜로 전환합니다. 작업이 완료될 때까지 지속됩니다.
복사 모드(서버로 데이터 전송)는 다음과 같은 경우에 시작됩니다. 백엔드는 a를 실행합니다.STDIN에서 복사SQL 성명. 백엔드는 CopyInResponse 메시지를 프론트엔드. 그런 다음 프런트엔드는 0개 이상의 CopyData를 보내야 합니다. 메시지를 생성하여 입력 데이터 스트림을 형성합니다. (메시지 경계 행 경계와 관련이 있을 필요는 없습니다. 비록 그것이 종종 합리적인 선택일지라도.) 프론트엔드는 CopyDone 메시지를 보내 복사 모드를 종료합니다. (성공적인 종료 허용) 또는 CopyFail 메시지( 원인은복사실패할 SQL 문 오류). 그런 다음 백엔드는 명령 처리 모드로 되돌아갑니다. 그건 그 전에 있었어.복사시작했습니다. 단순하거나 확장된 쿼리 프로토콜이 됩니다. 다음에는 전송됩니다 CommandComplete(성공한 경우) 또는 ErrorResponse(성공한 경우) 아니다).
복사 모드 중 백엔드에서 오류가 감지된 경우 (CopyFail 메시지 수신 포함) 백엔드가 발행합니다. ErrorResponse 메시지. 만약복사명령이 확장 쿼리 메시지를 통해 실행되면 백엔드는 이제 동기화 메시지가 수신될 때까지 프런트엔드 메시지를 삭제합니다. 그런 다음 ReadyForQuery를 발행하고 정상적인 처리로 돌아갑니다. 만약복사명령이 간단한 명령으로 실행되었습니다. 쿼리 메시지, 해당 메시지의 나머지 부분은 삭제되고 ReadyForQuery가 발행되었습니다. 두 경우 모두 후속 CopyData, 프런트엔드에서 발행된 CopyDone 또는 CopyFail 메시지는 단순히 탈락하다.
백엔드는 플러시 및 동기화 메시지를 무시합니다. 복사 모드. 기타 비복사 메시지 유형의 수신 설명된 대로 복사 상태를 중단하는 오류를 구성합니다. 위에. (플러시 및 동기화에 대한 예외는 사용자의 편의를 위한 것입니다. 실행 후 항상 플러시 또는 동기화를 보내는 클라이언트 라이브러리 실행할 명령이 다음과 같은지 확인하지 않고 메시지를 보냅니다.STDIN에서 복사.)
복사 모드(서버에서 데이터 전송)는 다음 경우에 시작됩니다. 백엔드는 다음을 실행합니다.STDOUT에 복사SQL 성명. 백엔드는 CopyOutResponse 메시지를 프런트엔드 뒤에 0개 이상의 CopyData 메시지가 옵니다(항상 하나 행당), CopyDone이 이어집니다. 그런 다음 백엔드는 다음으로 되돌아갑니다. 이전에는 명령 처리 모드였습니다.복사시작하고 CommandComplete를 보냅니다. 그만큼 프런트엔드는 전송을 중단할 수 없습니다(단, 연결 또는 취소 요청 실행), 삭제할 수 있음 원치 않는 CopyData 및 CopyDone 메시지.
복사 모드 중 백엔드에서 오류가 감지된 경우, 백엔드는 ErrorResponse 메시지를 발행하고 다음으로 되돌아갑니다. 정상적인 처리. 프런트엔드는 수신을 처리해야 합니다. 복사 모드 종료에 대한 ErrorResponse입니다.
NoticeResponse 및 ParameterStatus 메시지에 대해 가능합니다. CopyData 메시지 사이에 삽입됩니다. 프런트엔드에서 처리해야 함 이러한 경우에는 다른 비동기 메시지를 준비해야 합니다. 유형도 마찬가지입니다(참조섹션 48.2.6). 그렇지 않으면, CopyData 또는 CopyDone 이외의 모든 메시지 유형은 다음과 같이 처리될 수 있습니다. 복사 모드를 종료합니다.
복사-모두라는 또 다른 복사 관련 모드가 있습니다. 고속 대량 데이터 전송을 허용합니다.그리고서버에서. 둘 다 복사 모드 walsender 모드의 백엔드가 다음을 실행할 때 시작됩니다.START_REPLICATION문장. 백엔드는 CopyBothResponse 메시지를 프런트엔드에 보냅니다. 백엔드와 그러면 프런트엔드는 한쪽 끝에서 CopyData 메시지를 보낼 때까지 CopyData 메시지를 보낼 수 있습니다. 복사 완료 메시지. 클라이언트가 CopyDone 메시지를 보낸 후 연결은 모두 복사 모드에서 복사 모드로 전환되고 클라이언트는 더 이상 CopyData 메시지를 보낼 수 없습니다. 마찬가지로, 서버가 CopyDone 메시지를 보내면 연결이 복사로 들어갑니다. 모드이며 서버는 더 이상 CopyData 메시지를 보내지 못할 수 있습니다. 후에 양측 모두 CopyDone 메시지를 보냈으며 복사 모드는 다음과 같습니다. 종료되고 백엔드는 명령 처리 모드로 되돌아갑니다. 모두 복사 모드 중에 백엔드에서 오류가 감지된 경우 백엔드는 ErrorResponse 메시지를 발행하고 프론트엔드를 폐기합니다. 동기화 메시지가 수신될 때까지 메시지를 보낸 후 발행합니다. ReadyForQuery를 실행하고 일반 처리로 돌아갑니다. 프런트엔드는 다음과 같이 해야 합니다. ErrorResponse 수신을 두 가지 모두에서 복사본을 종료하는 것으로 처리합니다. 지도; 이 경우 CopyDone을 보내서는 안 됩니다. 보다섹션 48.3자세한 정보는 모두 복사 모드를 통해 전송된 하위 프로토콜에서.
CopyInResponse, CopyOutResponse 및 CopyBothResponse 메시지에는 프런트엔드에 행당 열 및 각 열에 사용되는 형식 코드. (현재 구현 기준으로 특정 열의 모든 열은복사작업은 동일한 형식을 사용합니다. 그러나 메시지 디자인에서는 이를 가정하지 않습니다.)
백엔드가 메시지를 보내는 경우가 몇 가지 있습니다 프런트엔드의 명령으로 특별히 프롬프트되지 않은 것 개울. 프런트엔드는 이러한 메시지를 처리할 준비가 되어 있어야 합니다. 쿼리에 참여하지 않더라도 언제든지 가능합니다. 최소한 쿼리 읽기를 시작하기 전에 이러한 경우를 확인하십시오. 응답.
NoticeResponse 메시지가 다음으로 인해 생성될 수 있습니다. 외부 활동에; 예를 들어 데이터베이스 관리자가 명령 a"빠르게"데이터베이스 종료, 백엔드는 이전에 이 사실을 나타내는 NOTICEResponse를 보냅니다. 연결을 닫습니다. 따라서 프런트엔드는 항상 다음과 같은 경우에도 NoticeResponse 메시지를 수락하고 표시할 준비가 되어 있습니다. 연결이 명목상 유휴 상태입니다.
ParameterStatus 토토 사이트는 활성 상태일 때마다 생성됩니다. 백엔드가 믿는 매개변수의 값이 변경됩니다. 프론트엔드는 알아야 합니다. 가장 일반적으로 이는 응답으로 발생합니다. 에SET다음에 의해 실행된 SQL 명령 프론트엔드이며 이 경우는 사실상 동기식입니다. 매개변수 상태 변경이 발생할 수 있기 때문에 관리자가 구성 파일을 변경한 다음SIGHUP서버에 신호를 보냅니다. 또한, 만일 aSET명령이 롤백되었습니다. 적절한 ParameterStatus 메시지가 생성되어 보고됩니다. 현재 유효 값입니다.
현재 고정된 매개변수 세트가 있습니다. ParameterStatus가 생성됩니다.서버_버전, 서버_인코딩, client_encoding, 응용프로그램_이름, is_superuser, session_authorization, 날짜 스타일, 간격 스타일, 시간대, integer_datetimes및standard_conforming_strings. (서버_인코딩, 시간대, 그리고integer_datetimes다음에 의해 보고되지 않았습니다. 8.0 이전 릴리스;standard_conforming_strings다음에 의해 보고되지 않았습니다. 8.1 이전 릴리스;간격 스타일아니었어 8.4 이전 릴리스에서 보고됨;응용프로그램_이름이전 릴리스에서는 보고되지 않았습니다. 9.0.) 참고서버_버전, 서버_인코딩그리고integer_datetimes는 의사 매개변수입니다. 시작 후 변경합니다. 이 세트는 향후 변경될 수도 있습니다. 구성 가능해집니다. 따라서 프런트엔드는 단순히 무시해야 합니다. 이해하지 못하거나 관리하지 않는 매개변수에 대한 ParameterStatus 에 대한.
프런트엔드가 a를 발행하는 경우듣기명령, 그러면 백엔드는 알림 응답 토토 사이트를 보냅니다. NoticeResponse!)와 혼동될 수 있습니다.알림명령이 동일한 채널에 대해 실행됩니다. 이름.
참고:현재는NotificationResponse만 보낼 수 있습니다. 거래 외부에서는 발생하지 않습니다. 명령-응답 시리즈(단, 직전에 발생할 수도 있음) ReadyForQuery. 다음을 가정하는 프런트엔드 로직을 설계하는 것은 현명하지 않습니다. 그러나 그것은. 좋은 습관은 받아들일 수 있는 것이다 프로토콜의 어느 지점에서나 알림 응답을 받을 수 있습니다.
쿼리를 처리하는 동안 프런트엔드에서 요청할 수 있습니다. 쿼리 취소. 취소 요청이 직접 전송되지 않습니다. 구현상의 이유로 백엔드에 대한 공개 연결 효율성: 우리는 백엔드가 지속적으로 확인하는 것을 원하지 않습니다. 쿼리 처리 중 프런트엔드의 새 입력에 대한 것입니다. 취소 요청은 비교적 자주 발생하지 않으므로 약간씩 요청합니다. 일반적인 경우에는 페널티를 피하기 위해 번거롭습니다.
취소 요청을 발행하기 위해 프런트엔드는 새로운 연결을 엽니다 서버에 서버로 전달하고 CancelRequest 메시지를 보냅니다. 일반적으로 새 서비스를 통해 전송되는 StartupMessage 메시지 연결. 서버는 이 요청을 처리한 다음 연결. 보안상의 이유로 직접 답변을 드리지 않습니다. 취소 요청 메시지입니다.
CancelRequest 메시지는 다음을 포함하지 않는 한 무시됩니다. 동일한 키 데이터(PID 및 비밀 키)가 프런트엔드에 전달되었습니다. 연결 시작. 요청이 PID 및 비밀 키와 일치하는 경우 현재 실행 중인 백엔드의 경우 현재 처리 쿼리가 중단되었습니다. (기존 구현에서는 다음과 같이 수행됩니다. 처리 중인 백엔드 프로세스에 특수 신호 보내기 쿼리입니다.)
취소 신호는 효과가 있을 수도 있고 없을 수도 있습니다. 예를 들어 백엔드가 처리를 마친 후에 도착하는 경우 쿼리를 수행하면 아무런 효과가 없습니다. 취소인 경우 효과적이면 현재 명령이 조기에 종료됩니다. 오류 메시지와 함께.
이 모든 것의 결과는 보안과 보안상의 이유로 효율성 측면에서 프런트엔드는 취소 여부를 직접 알 수 있는 방법이 없습니다. 요청이 성공했습니다. 백엔드가 완료될 때까지 계속 기다려야 합니다. 쿼리에 응답합니다. 취소하면 확률이 높아집니다. 현재 쿼리가 곧 완료될 가능성이 높아집니다. 성공하는 대신 오류 메시지와 함께 실패합니다.
취소 요청이 새로운 연결을 통해 전송되었기 때문에 서버이며 일반적인 프런트엔드/백엔드 통신을 통하지 않습니다. 링크를 통해 취소 요청은 어느 곳에서나 발행될 수 있습니다. 쿼리가 취소될 프런트엔드뿐만 아니라 프로세스도 마찬가지입니다. 이것 다중 프로세스를 구축할 때 추가적인 유연성을 제공할 수 있습니다. 응용 프로그램. 또한 보안 위험이 발생합니다. 권한이 없는 사람이 쿼리를 취소하려고 할 수 있습니다. 보안 위험 동적으로 생성된 비밀 키를 요구하여 해결됩니다. 취소 요청에 제공됩니다.
정상적이고 우아한 종료 절차는 프런트엔드가 Terminate 토토 사이트를 보내고 즉시 연결을 닫습니다. ~에 이 토토 사이트를 받으면 백엔드는 연결을 닫고 종료됩니다.
드문 경우(예: 관리자 명령 데이터베이스 종료) 프런트엔드 요청 없이 백엔드 연결이 끊어질 수 있음 그렇게 하려면. 이러한 경우 백엔드는 오류 전송을 시도합니다. 또는 그 전에 연결이 끊어진 이유를 알려주는 알림 메시지 연결을 종료합니다.
다른 종료 시나리오는 다양한 실패 사례에서 발생합니다. 한쪽 끝 또는 다른 쪽 끝의 코어 덤프, 통신 링크, 메시지 경계 동기화 손실 등 프런트엔드나 백엔드 중 하나에서 예상치 못한 종료가 발생하는 경우 연결이 완료되면 정리되고 종료되어야 합니다. 프론트엔드에는 서버에 다시 연결하여 새 백엔드를 시작하는 옵션 스스로 종료하고 싶지 않습니다. 연결을 닫는 것도 인식할 수 없는 메시지 유형이 수신된 경우 권장됩니다. 아마도 메시지 경계 동기화가 손실되었음을 나타냅니다.
정상 또는 비정상 종료의 경우 열려 있는 트랜잭션 커밋되지 않고 롤백됩니다. 그러나 다음 사항에 유의해야 합니다. 비- 동안 프런트엔드 연결이 끊어집니다.선택쿼리가 처리 중입니다. 백엔드가 아마도 작업을 완료할 것입니다. 연결이 끊어지기 전에 쿼리하십시오. 쿼리가 외부인 경우 모든 거래 블록(시작 ... 커밋sequence) 결과는 다음과 같습니다. 연결 끊김이 인식되기 전에 커밋되었습니다.
만약PostgreSQL함께 만들어졌습니다SSL지원, 프런트엔드/백엔드 통신은 다음을 사용하여 암호화될 수 있습니다.SSL. 이는 통신 보안을 제공합니다. 공격자가 세션을 캡처할 수 있는 환경 교통. 암호화에 대한 자세한 내용은PostgreSQL다음 사용자와의 세션SSL, 참조섹션 17.9.
시작하려면SSL-암호화됨 연결되면 프런트엔드는 처음에 SSLRequest 메시지를 보냅니다. StartupMessage 대신. 그러면 서버는 다음과 같이 응답합니다. 다음을 포함하는 단일 바이트S또는N, 의향이 있거나 의향이 없음을 나타냅니다. 공연하다SSL입니다. 그만큼 프런트엔드가 이 시점에서 연결을 닫을 수 있습니다. 응답이 불만족스럽습니다. 이후에 계속하려면S, 수행SSL시작 핸드셰이크(여기에는 설명되지 않음,SSL사양)을 서버와 연결합니다. 이것이라면 성공하면 일반적인 StartupMessage 전송을 계속합니다. 이에 StartupMessage 및 모든 후속 데이터가 다음과 같은 경우SSL-암호화되었습니다. 이후에 계속하려면N, 일반적인 StartupMessage를 보내고 암호화하지 않고 진행합니다.
프런트엔드는 ErrorMessage를 처리할 준비도 되어 있어야 합니다. 서버의 SSLRequest에 대한 응답입니다. 이는 다음과 같은 경우에만 발생합니다. 서버는 다음을 추가하기 이전에 발생했습니다.SSL지원포스트그레SQL. (이러한 서버는 현재 매우 고대이며 아마도 더 이상 야생에 존재하지 않을 것입니다.) 이 경우 연결은 닫혀야 하지만 프런트엔드는 다음을 선택할 수 있습니다. 새로운 연결을 열고 요청하지 않고 진행하세요.SSL.
초기 SSLRequest는 다음 연결에서도 사용될 수 있습니다. CancelRequest 메시지를 보내기 위해 열려 있습니다.
프로토콜 자체는 서버에 대한 방법을 제공하지 않지만 강요하다SSL암호화, 관리자는 암호화되지 않은 데이터를 거부하도록 서버를 구성할 수 있습니다. 인증 확인의 부산물로 세션을 생성합니다.