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