54.2. ÐоÑок ÑообÑений #
- 54.2.1. ÐапÑÑк
- 54.2.2. ÐÑоÑÑое вÑполнение запÑоÑов
- 54.2.3. РаÑÑиÑенное вÑполнение запÑоÑов
- 54.2.4. ÐонвейеÑизаÑиÑ
- 54.2.5. ÐÑзов ÑÑнкÑий
- 54.2.6. ÐпеÑаÑии COPY
- 54.2.7. ÐÑÐ¸Ð½Ñ ÑоннÑе опеÑаÑии
- 54.2.8. ÐÑмена вÑполнÑÑÑÐ¸Ñ ÑÑ Ð·Ð°Ð¿ÑоÑов
- 54.2.9. ÐавеÑÑение
- 54.2.10. ÐаÑиÑа ÑеанÑа Ñ SSL
- 54.2.11. ÐаÑиÑа ÑеанÑа Ñ GSSAPI
- 54.2.2. ÐÑоÑÑое вÑполнение запÑоÑов
Ð ÑÑом Ñазделе опиÑÑваеÑÑÑ Ð¿Ð¾Ñок ÑообÑений и ÑеманÑика каждого Ñипа ÑообÑений. (ÐодÑобнее ÑоÑное пÑедÑÑавление каждого ÑообÑÐµÐ½Ð¸Ñ Ð¾Ð¿Ð¸ÑÑваеÑÑÑ Ð² Разделе 54.7.) РзавиÑимоÑÑи Ð¾Ñ ÑоÑÑоÑÐ½Ð¸Ñ ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð²ÑделÑÑÑÑÑ Ð½ÐµÑколÑко ÑазлиÑнÑÑ
Ñазделов пÑоÑокола: запÑÑк, вÑполнение запÑоÑов, вÑзов ÑÑнкÑии, копиÑование (COPY) и завеÑÑение. ÐÑÑÑ Ñакже ÑпеÑиалÑнÑе ÑÑедÑÑва Ð´Ð»Ñ Ð°ÑинÑ
ÑоннÑÑ
опеÑаÑий (в ÑаÑÑноÑÑи, Ð´Ð»Ñ Ñведомлений и оÑÐ¼ÐµÐ½Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´), коÑоÑÑе могÑÑ Ð²ÑполнÑÑÑÑÑ Ð² лÑбой Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð¿Ð¾Ñле ÑÑапа запÑÑка.
54.2.1. ÐапÑÑк #
ЧÑÐ¾Ð±Ñ Ð½Ð°ÑаÑÑ ÑеанÑ, ÐºÐ»Ð¸ÐµÐ½Ñ Ð¾ÑкÑÑÐ²Ð°ÐµÑ Ð¿Ð¾Ð´ÐºÐ»ÑÑение к ÑеÑвеÑÑ Ð¸ пеÑедаÑÑ ÑÑаÑÑовое ÑообÑение. Ð ÑÑом ÑообÑении ÑодеÑжаÑÑÑ Ð¸Ð¼ÐµÐ½Ð° полÑзоваÑÐµÐ»Ñ Ð¸ Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
, к коÑоÑой полÑзоваÑÐµÐ»Ñ Ñ
оÑÐµÑ Ð¿Ð¾Ð´ÐºÐ»ÑÑиÑÑÑÑ; в нÑм Ñакже опÑеделÑеÑÑÑ, ÐºÐ°ÐºÐ°Ñ Ð¸Ð¼ÐµÐ½Ð½Ð¾ веÑÑÐ¸Ñ Ð¿ÑоÑокола бÑÐ´ÐµÑ Ð¸ÑполÑзоваÑÑÑÑ. (СÑаÑÑовое ÑообÑение Ñакже Ð¼Ð¾Ð¶ÐµÑ ÑодеÑжаÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑе знаÑÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð¿Ð°ÑамеÑÑов вÑемени вÑполнениÑ.) ÐÑоанализиÑовав ÑÑÑ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¸ ÑодеÑжимое ÑвоиÑ
Ñайлов конÑигÑÑаÑии (в ÑаÑÑноÑÑи, pg_hba.conf), ÑеÑÐ²ÐµÑ Ð¾Ð¿ÑеделÑеÑ, можно ли пÑедваÑиÑелÑно ÑазÑеÑиÑÑ ÑÑо подклÑÑение, и ÐºÐ°ÐºÐ°Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑÐ½Ð°Ñ Ð¿ÑовеÑка подлинноÑÑи ÑÑебÑеÑÑÑ.
ÐаÑем ÑеÑÐ²ÐµÑ Ð¾ÑпÑавлÑÐµÑ ÑооÑвеÑÑÑвÑÑÑее ÑообÑение Ñ Ð·Ð°Ð¿ÑоÑом аÑÑенÑиÑикаÑии, на коÑоÑое ÐºÐ»Ð¸ÐµÐ½Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ оÑвеÑиÑÑ ÑообÑением, подÑвеÑждаÑÑим его подлинноÑÑÑ (напÑимеÑ, по паÑолÑ). ÐÐ»Ñ Ð²ÑÐµÑ Ð¼ÐµÑодов аÑÑенÑиÑикаÑии, за иÑклÑÑением GSSAPI, SSPI и SASL, Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¼Ð°ÐºÑимÑм один запÑÐ¾Ñ Ð¸ один оÑвеÑ. ÐÐ»Ñ Ð½ÐµÐºÐ¾ÑоÑÑÑ Ð¼ÐµÑодов оÑÐ²ÐµÑ ÐºÐ»Ð¸ÐµÐ½Ñа вообÑе не ÑÑебÑеÑÑÑ, Ñак ÑÑо запÑÐ¾Ñ Ð°ÑÑенÑиÑикаÑии Ñакже не пеÑедаÑÑÑÑ. ÐеÑÐ¾Ð´Ñ GSSAPI, SSPI и SASL Ð´Ð»Ñ Ð¿ÑÐ¾Ñ Ð¾Ð¶Ð´ÐµÐ½Ð¸Ñ Ð¿ÑовеÑки подлинноÑÑи могÑÑ Ð¿Ð¾ÑÑебоваÑÑ Ð²ÑполниÑÑ ÑеÑÐ¸Ñ Ð¾Ð±Ð¼ÐµÐ½Ð¾Ð² пакеÑами.
Цикл аÑÑенÑиÑикаÑии заканÑÐ¸Ð²Ð°ÐµÑ ÑеÑвеÑ, либо запÑеÑÐ°Ñ Ñоединение (ErrorResponse), либо пÑÐ¸Ð½Ð¸Ð¼Ð°Ñ ÐµÐ³Ð¾ (оÑпÑавлÑÑ AuthenticationOk).
СеÑÐ²ÐµÑ Ð¼Ð¾Ð¶ÐµÑ Ð¿ÐµÑедаваÑÑ Ð² ÑÑой Ñазе ÑледÑÑÑие ÑообÑениÑ:
- ErrorResponse (ÐÑибоÑнÑй оÑвеÑ)
ÐопÑÑка ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð±Ñла оÑвеÑгнÑÑа. СÑÐ°Ð·Ñ Ð¿Ð¾Ñле ÑÑого ÑеÑÐ²ÐµÑ Ð·Ð°ÐºÑÑÐ²Ð°ÐµÑ Ñоединение.
- AuthenticationOk (ÐÑÑенÑиÑикаÑÐ¸Ñ Ð¿Ñойдена)
Ðбмен ÑообÑениÑми Ð´Ð»Ñ Ð¿ÑовеÑки подлинноÑÑи завеÑÑÑн ÑÑпеÑно.
- AuthenticationKerberosV5 (ÐÑÑенÑиÑикаÑÐ¸Ñ Kerberos V5)
ÐÐ»Ð¸ÐµÐ½Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ ÑепеÑÑ Ð¿ÑинÑÑÑ ÑÑаÑÑие в диалоге аÑÑенÑиÑикаÑии по пÑоÑÐ¾ÐºÐ¾Ð»Ñ Kerberos V5 (здеÑÑ ÐµÐ³Ð¾ деÑали не опиÑÑваеÑÑÑ, Ñак как они оÑноÑÑÑÑÑ Ðº ÑпеÑиÑикаÑии Kerberos) Ñ ÑеÑвеÑом. ÐÑли ÑÑÐ¾Ñ Ð´Ð¸Ð°Ð»Ð¾Ð³ завеÑÑаеÑÑÑ ÑÑпеÑно, ÑеÑÐ²ÐµÑ Ð¾ÑвеÑÐ°ÐµÑ AuthenticationOk, инаÑе â ErrorResponse. ÐÑÐ¾Ñ Ð²Ð°ÑÐ¸Ð°Ð½Ñ Ð°ÑÑенÑиÑикаÑии болÑÑе не поддеÑживаеÑÑÑ.
- AuthenticationCleartextPassword (ÐÑÑенÑиÑикаÑÐ¸Ñ Ñ Ð¾ÑкÑÑÑÑм паÑолем)
ÐÐ»Ð¸ÐµÐ½Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ пеÑедаÑÑ Ð² оÑÐ²ÐµÑ ÑообÑение PasswordMessage, ÑодеÑжаÑее паÑÐ¾Ð»Ñ Ð² оÑкÑÑÑом виде. ÐÑли паÑÐ¾Ð»Ñ Ð¿ÑавилÑнÑй, ÑеÑÐ²ÐµÑ Ð¾ÑвеÑÐ°ÐµÑ ÐµÐ¼Ñ AuthenticationOk, инаÑе â ErrorResponse.
- AuthenticationMD5Password (ÐÑÑенÑиÑикаÑÐ¸Ñ Ñ Ð¿Ð°Ñолем MD5)
ÐÐ»Ð¸ÐµÐ½Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ пеÑедаÑÑ Ð² оÑÐ²ÐµÑ ÑообÑение PasswordMessage Ñ ÑезÑлÑÑаÑом пÑеобÑÐ°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ð°ÑÐ¾Ð»Ñ (и имени полÑзоваÑелÑ) в Ñ ÐµÑ MD5 Ñ Ð¿Ð¾ÑледÑÑÑим Ñ ÐµÑиÑованием Ñ ÑеÑÑÑÑÑ Ð±Ð°Ð¹ÑовÑм ÑлÑÑайнÑм знаÑением Ñоли, пеÑеданнÑм в ÑообÑении AuthenticationMD5Password. ÐÑли паÑÐ¾Ð»Ñ Ð¿ÑавилÑнÑй, ÑеÑÐ²ÐµÑ Ð¾ÑвеÑÐ°ÐµÑ AuthenticationOk, инаÑе â ErrorResponse. СодеÑжимое ÑообÑÐµÐ½Ð¸Ñ PasswordMessage можно вÑÑиÑлиÑÑ Ð² SQL как
concat('md5', md5(concat(md5(concat(password, username)), random-salt))). (УÑÑиÑе, ÑÑо ÑÑнкÑиÑmd5()возвÑаÑÐ°ÐµÑ ÑезÑлÑÑÐ°Ñ Ð² виде ÑеÑÑнадÑаÑеÑиÑной ÑÑÑоки.)- AuthenticationGSS (ÐÑÑенÑиÑикаÑÐ¸Ñ GSS)
ÐÐ»Ð¸ÐµÐ½Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ наÑаÑÑ ÑоглаÑование GSSAPI. РоÑÐ²ÐµÑ Ð½Ð° ÑÑо ÑообÑение ÐºÐ»Ð¸ÐµÐ½Ñ Ð¾ÑпÑавлÑÐµÑ GSSResponse Ñ Ð¿ÐµÑвой ÑаÑÑÑÑ Ð¿Ð¾Ñока даннÑÑ GSSAPI. ÐÑли поÑÑебÑÑÑÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑе ÑообÑениÑ, ÑеÑÐ²ÐµÑ Ð¿ÐµÑедаÑÑ Ð² оÑÐ²ÐµÑ AuthenticationGSSContinue.
- AuthenticationSSPI (ÐÑÑенÑиÑикаÑÐ¸Ñ SSPI)
ÐÐ»Ð¸ÐµÐ½Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ наÑаÑÑ ÑоглаÑование SSPI. РоÑÐ²ÐµÑ Ð½Ð° ÑÑо ÑообÑение ÐºÐ»Ð¸ÐµÐ½Ñ Ð¾ÑпÑавлÑÐµÑ GSSResponse Ñ Ð¿ÐµÑвой ÑаÑÑÑÑ Ð¿Ð¾Ñока даннÑÑ SSPI. ÐÑли поÑÑебÑÑÑÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑе ÑообÑениÑ, ÑеÑÐ²ÐµÑ Ð¿ÐµÑедаÑÑ Ð² оÑÐ²ÐµÑ AuthenticationGSSContinue.
- AuthenticationGSSContinue (ÐÑодолжение аÑÑенÑиÑикаÑии GSS)
ÐÑо ÑообÑение ÑодеÑÐ¶Ð¸Ñ Ð´Ð°Ð½Ð½Ñе оÑвеÑа на пÑедÑдÑÑий Ñаг ÑоглаÑÐ¾Ð²Ð°Ð½Ð¸Ñ GSSAPI или SSPI (AuthenticationGSS, AuthenticationSSPI или пÑедÑдÑÑего AuthenticationGSSContinue). ÐÑли в ÑÑÑÑкÑÑÑе GSSAPI или SSPI в ÑÑом ÑообÑении ÑказÑваеÑÑÑ, ÑÑо Ð´Ð»Ñ Ð·Ð°Ð²ÐµÑÑÐµÐ½Ð¸Ñ Ð°ÑÑенÑиÑикаÑии ÑÑебÑÑÑÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑе даннÑе, ÐºÐ»Ð¸ÐµÐ½Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ пеÑедаÑÑ Ð¸Ñ Ð² оÑеÑедном ÑообÑении GSSResponse. ÐÑли ÑÑим ÑообÑением завеÑÑаеÑÑÑ Ð¿ÑовеÑка подлинноÑÑи GSSAPI или SSPI, ÑеÑÐ²ÐµÑ Ð·Ð°Ñем пеÑедаÑÑ AuthenticationOk, ÑообÑÐ°Ñ Ð¾Ð± ÑÑпеÑной пÑовеÑке подлинноÑÑи, либо ErrorResponse, ÑообÑÐ°Ñ Ð¾Ð± оÑибке.
- AuthenticationSASL (ÐÑÑенÑиÑикаÑÐ¸Ñ SASL)
ÐÐ»Ð¸ÐµÐ½Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ наÑаÑÑ ÑоглаÑование SASL, иÑполÑзÑÑ Ð¾Ð´Ð¸Ð½ из Ð¼ÐµÑ Ð°Ð½Ð¸Ð·Ð¼Ð¾Ð² SASL, пеÑеÑиÑленнÑÑ Ð² ÑообÑении. РоÑÐ²ÐµÑ Ð½Ð° ÑÑо ÑообÑение ÐºÐ»Ð¸ÐµÐ½Ñ Ð¾ÑпÑавлÑÐµÑ SASLInitialResponse Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ вÑбÑанного Ð¼ÐµÑ Ð°Ð½Ð¸Ð·Ð¼Ð° и пеÑвой ÑаÑÑÑÑ Ð¿Ð¾Ñока даннÑÑ SASL. ÐÑли поÑÑебÑÑÑÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑе ÑообÑениÑ, ÑеÑÐ²ÐµÑ Ð¿ÐµÑедаÑÑ Ð² оÑÐ²ÐµÑ AuthenticationSASLContinue. Ðа подÑобноÑÑÑми обÑаÑиÑеÑÑ Ðº РазделÑ 54.3.
- AuthenticationSASLContinue (ÐÑодолжение аÑÑенÑиÑикаÑии SASL)
ÐÑо ÑообÑение ÑодеÑÐ¶Ð¸Ñ Ð´Ð°Ð½Ð½Ñе вÑзова Ñ Ð¿ÑедÑдÑÑего Ñага ÑоглаÑÐ¾Ð²Ð°Ð½Ð¸Ñ SASL (AuthenticationSASL или пÑедÑдÑÑего AuthenticationSASLContinue). ÐÐ»Ð¸ÐµÐ½Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ пеÑедаÑÑ Ð² оÑÐ²ÐµÑ ÑообÑение SASLResponse.
- AuthenticationSASLFinal (ÐконÑание аÑÑенÑиÑикаÑии SASL)
ÐÑÑенÑиÑикаÑÐ¸Ñ SASL завеÑÑена Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑми даннÑми Ð´Ð»Ñ ÐºÐ»Ð¸ÐµÐ½Ñа, ÑпеÑиÑиÑнÑми Ð´Ð»Ñ Ð¼ÐµÑ Ð°Ð½Ð¸Ð·Ð¼Ð°. ÐаÑем ÑеÑÐ²ÐµÑ Ð¿ÐµÑедаÑÑ ÑообÑение AuthenticationOk, говоÑÑÑее об ÑÑпеÑной аÑÑенÑиÑикаÑии, или ErrorResponse, говоÑÑÑее об оÑибке. Ðанное ÑообÑение пеÑедаÑÑÑÑ, ÑолÑко еÑли Ð¼ÐµÑ Ð°Ð½Ð¸Ð·Ð¼ SASL должен в завеÑÑение пеÑедаÑÑ Ñ ÑеÑвеÑа клиенÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑе ÑпеÑиÑиÑнÑе даннÑе.
- NegotiateProtocolVersion
СеÑÐ²ÐµÑ Ð½Ðµ поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ Ð¼Ð»Ð°Ð´ÑÑÑ Ð²ÐµÑÑÐ¸Ñ Ð¿ÑоÑокола, запÑоÑеннÑÑ ÐºÐ»Ð¸ÐµÐ½Ñом, но поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ Ð±Ð¾Ð»ÐµÐµ ÑаннÑÑ Ð²ÐµÑÑÐ¸Ñ Ð¿ÑоÑокола; в ÑÑом ÑообÑении ÑказÑваеÑÑÑ Ð½Ð°Ð¸Ð±Ð¾Ð»ÑÑÐ°Ñ Ð¿Ð¾Ð´Ð´ÐµÑÐ¶Ð¸Ð²Ð°ÐµÐ¼Ð°Ñ Ð¼Ð»Ð°Ð´ÑÐ°Ñ Ð²ÐµÑÑиÑ. ÐÑо ÑообÑение бÑÐ´ÐµÑ Ñакже пеÑедаваÑÑÑÑ, еÑли ÐºÐ»Ð¸ÐµÐ½Ñ Ð·Ð°Ð¿ÑоÑил в ÑÑаÑÑовом пакеÑе неподдеÑживаемÑе паÑамеÑÑÑ Ð¿ÑоÑокола (Ñо еÑÑÑ, наÑинаÑÑиеÑÑ Ñ
_pq_.). Ðа ÑÑим ÑообÑением должен поÑледоваÑÑ Ð¸Ð»Ð¸ оÑÐ²ÐµÑ ErrorResponse, или ÑообÑение, говоÑÑÑее об ÑÑÐ¿ÐµÑ Ðµ или неÑдаÑе пÑовеÑки подлинноÑÑи.
ÐÑли ÐºÐ»Ð¸ÐµÐ½Ñ Ð½Ðµ поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ Ð¼ÐµÑод пÑовеÑки подлинноÑÑи, запÑоÑеннÑй ÑеÑвеÑом, он должен немедленно закÑÑÑÑ Ñоединение.
ÐолÑÑив ÑообÑение AuthenticationOk, ÐºÐ»Ð¸ÐµÐ½Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ ждаÑÑ Ð´Ð°Ð»ÑнейÑÐ¸Ñ ÑообÑений Ð¾Ñ ÑеÑвеÑа. Ð ÑÑой Ñазе запÑÑкаеÑÑÑ Ð¾Ð±ÑлÑживаÑÑий пÑоÑеÑÑ, а ÐºÐ»Ð¸ÐµÐ½Ñ Ð¿ÑедÑÑавлÑÐµÑ Ñобой пÑоÑÑо заинÑеÑеÑованного наблÑдаÑелÑ. ÐопÑÑка запÑÑка Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð½ÐµÑдаÑной (и ÐºÐ»Ð¸ÐµÐ½Ñ Ð¿Ð¾Ð»ÑÑÐ¸Ñ ErrorResponse) либо ÑеÑÐ²ÐµÑ Ð¼Ð¾Ð¶ÐµÑ Ð¾ÑказаÑÑ Ð² поддеÑжке запÑоÑенной младÑей веÑÑии пÑоÑокола (NegotiateProtocolVersion), но в обÑÑной ÑиÑÑаÑии обÑлÑживаÑÑий пÑоÑеÑÑ Ð¿ÐµÑедаÑÑ Ð½ÐµÑколÑко ÑообÑений ParameterStatus, BackendKeyData и, наконеÑ, ReadyForQuery.
Ð Ñ Ð¾Ð´Ðµ ÑÑой ÑÐ°Ð·Ñ Ð¾Ð±ÑлÑживаÑÑий пÑоÑеÑÑ Ð¿Ð¾Ð¿ÑÑаеÑÑÑ Ð¿ÑимениÑÑ Ð²Ñе паÑамеÑÑÑ Ð²Ñемени вÑполнениÑ, полÑÑеннÑе в ÑÑаÑÑовом ÑообÑении. ÐÑли ÑÑо ÑдаÑÑÑÑ, ÑÑи знаÑÐµÐ½Ð¸Ñ ÑÑановÑÑÑÑ ÑеанÑовÑми знаÑениÑми по ÑмолÑаниÑ. ÐÑи оÑибке он пеÑедаÑÑ ErrorResponse и завеÑÑаеÑÑÑ.
ÐбÑлÑживаÑÑий пÑоÑеÑÑ Ð¼Ð¾Ð¶ÐµÑ Ð¿ÐµÑедаваÑÑ Ð² ÑÑой Ñазе ÑледÑÑÑие ÑообÑениÑ:
- BackendKeyData (ÐаннÑе клÑÑа ÑеÑвеÑа)
Ð ÑÑом ÑообÑении пеÑедаÑÑÑÑ ÑекÑеÑнÑй клÑÑ, коÑоÑÑй ÐºÐ»Ð¸ÐµÐ½Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ ÑÐ¾Ñ ÑаниÑÑ, ÑÑÐ¾Ð±Ñ Ð²Ð¿Ð¾ÑледÑÑвии имеÑÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑÑ Ð²ÑполнÑÑÑ Ð·Ð°Ð¿ÑоÑÑ. ÐÐ»Ð¸ÐµÐ½Ñ Ð½Ðµ должен оÑвеÑаÑÑ Ð½Ð° ÑÑо ÑообÑение, он должен дожидаÑÑÑÑ ÑообÑÐµÐ½Ð¸Ñ ReadyForQuery.
- ParameterStatus (СоÑÑоÑние паÑамеÑÑов)
ÐÑо ÑообÑение говоÑÐ¸Ñ ÐºÐ»Ð¸ÐµÐ½ÑÑ Ð¾ ÑекÑÑÐ¸Ñ (наÑалÑнÑÑ ) знаÑениÑÑ Ð¿Ð°ÑамеÑÑов обÑлÑживаÑÑего пÑоÑеÑÑа, напÑимеÑ, client_encoding или DateStyle. ÐÐ»Ð¸ÐµÐ½Ñ Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑоигноÑиÑоваÑÑ ÑÑо ÑообÑение или ÑÐ¾Ñ ÑаниÑÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð´Ð°Ð»ÑнейÑего иÑполÑзованиÑ; за дополниÑелÑнÑми подÑобноÑÑÑми обÑаÑиÑеÑÑ Ðº ÐодÑазделÑ 54.2.7. ÐÐ»Ð¸ÐµÐ½Ñ Ð½Ðµ должен оÑвеÑаÑÑ Ð½Ð° ÑÑо ÑообÑение, он должен дожидаÑÑÑÑ ÑообÑÐµÐ½Ð¸Ñ ReadyForQuery.
- ReadyForQuery (ÐоÑов к запÑоÑам)
ÐапÑÑк завеÑÑÑн. ТепеÑÑ ÐºÐ»Ð¸ÐµÐ½Ñ Ð¼Ð¾Ð¶ÐµÑ Ð²ÑполнÑÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ.
- ErrorResponse (ÐÑибоÑнÑй оÑвеÑ)
ÐапÑÑк не ÑдалÑÑ. Соединение закÑÑваеÑÑÑ Ð¿Ð¾Ñле пеÑедаÑи ÑÑого ÑообÑениÑ.
- NoticeResponse (ÐÑÐ²ÐµÑ Ñ Ð·Ð°Ð¼ÐµÑанием)
ÐÑдаÑÑÑÑ Ð¿ÑедÑпÑеждаÑÑее ÑообÑение. ÐÐ»Ð¸ÐµÐ½Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ вÑвеÑÑи ÑÑо ÑообÑение, но пÑодолжаÑÑ Ð¾Ð¶Ð¸Ð´Ð°ÑÑ ÑообÑÐµÐ½Ð¸Ñ ReadyForQuery или ErrorResponse.
СообÑение ReadyForQuery в данной Ñазе ниÑем не оÑлиÑаеÑÑÑ Ð¾Ñ ÑообÑений, коÑоÑÑй пеÑедаÑÑ ÑеÑÐ²ÐµÑ Ð¿Ð¾Ñле каждого Ñикла команд. РзавиÑимоÑÑи Ð¾Ñ ÑÑловий ÑеализаÑии клиенÑа, можно воÑпÑинимаÑÑ ÑообÑение ReadyForQuery как наÑинаÑÑее Ñикл команд, либо как завеÑÑаÑÑее ÑÐ°Ð·Ñ Ð·Ð°Ð¿ÑÑка и каждÑй поÑледÑÑÑий Ñикл команд.
54.2.2. ÐÑоÑÑое вÑполнение запÑоÑов #
Цикл пÑоÑÑого вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿ÑоÑов наÑÐ¸Ð½Ð°ÐµÑ ÐºÐ»Ð¸ÐµÐ½Ñ, пеÑÐµÐ´Ð°Ð²Ð°Ñ ÑеÑвеÑÑ ÑообÑение Query. ÐÑо ÑообÑение вклÑÑÐ°ÐµÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ (или командÑ) SQL, вÑÑаженнÑÑ Ð² виде ÑекÑÑовой ÑÑÑоки. РоÑÐ²ÐµÑ ÑеÑÐ²ÐµÑ Ð¿ÐµÑедаÑÑ Ð¾Ð´Ð½Ð¾ или неÑколÑко ÑообÑений, в завиÑимоÑÑи Ð¾Ñ ÑÑÑоки запÑоÑа, и завеÑÑÐ°ÐµÑ Ñикл ÑообÑением ReadyForQuery. ReadyForQuery говоÑÐ¸Ñ ÐºÐ»Ð¸ÐµÐ½ÑÑ, ÑÑо он Ð¼Ð¾Ð¶ÐµÑ Ð±ÐµÐ·Ð¾Ð¿Ð°Ñно пеÑедаваÑÑ Ð½Ð¾Ð²ÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ. (Ðа Ñамом деле ÐºÐ»Ð¸ÐµÐ½Ñ Ð¼Ð¾Ð¶ÐµÑ Ð¿ÐµÑедаÑÑ ÑледÑÑÑÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ, не дожидаÑÑÑ ReadyForQuery, но Ñогда он Ñам должен ÑазобÑаÑÑÑÑ Ð² ÑиÑÑаÑии, когда пеÑÐ²Ð°Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð° завеÑÑаеÑÑÑ Ð¾Ñибкой, а поÑледÑÑÑÐ°Ñ Ð²ÑполнÑеÑÑÑ ÑÑпеÑно.)
СеÑÐ²ÐµÑ Ð¼Ð¾Ð¶ÐµÑ Ð¿ÐµÑедаваÑÑ Ð² ÑÑой Ñазе ÑледÑÑÑие оÑвеÑнÑе ÑообÑениÑ:
- CommandComplete (Ðоманда завеÑÑена)
Ðоманда SQL вÑполнена ноÑмалÑно.
- CopyInResponse (ÐÑÐ²ÐµÑ Ð²Ñ Ð¾Ð´ÑÑего копиÑованиÑ)
СеÑÐ²ÐµÑ Ð³Ð¾Ñов копиÑоваÑÑ Ð´Ð°Ð½Ð½Ñе, полÑÑаемÑе Ð¾Ñ ÐºÐ»Ð¸ÐµÐ½Ñа, в ÑаблиÑÑ; Ñм. ÐодÑаздел 54.2.6.
- CopyOutResponse (ÐÑÐ²ÐµÑ Ð¸ÑÑ Ð¾Ð´ÑÑего копиÑованиÑ)
СеÑÐ²ÐµÑ Ð³Ð¾Ñов копиÑоваÑÑ Ð´Ð°Ð½Ð½Ñе из ÑаблиÑÑ ÐºÐ»Ð¸ÐµÐ½ÑÑ; Ñм. ÐодÑаздел 54.2.6.
- RowDescription (ÐпиÑание ÑÑÑок)
ÐоказÑваеÑ, ÑÑо в оÑÐ²ÐµÑ Ð½Ð° запÑоÑ
SELECT,FETCHи Ñ. п. бÑдÑÑ Ð²Ð¾Ð·Ð²ÑаÑÐµÐ½Ñ ÑÑÑоки. Ð ÑодеÑжимом ÑÑого ÑообÑÐµÐ½Ð¸Ñ Ð¾Ð¿Ð¸ÑÑваеÑÑÑ ÑÑÑÑкÑÑÑа ÑÑолбÑов ÑÑÐ¸Ñ ÑÑÑок. Ðа ним Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ ÑÑÑоки, возвÑаÑаемой клиенÑÑ, ÑледÑÐµÑ ÑообÑение DataRow.- DataRow (СÑÑока даннÑÑ )
Ðдна ÑÑÑока из набоÑа, возвÑаÑаемого запÑоÑом
SELECT,FETCHи Ñ. п.- EmptyQueryResponse (ÐÑÐ²ÐµÑ Ð½Ð° пÑÑÑой запÑоÑ)
ÐÑла пÑинÑÑа пÑÑÑÐ°Ñ ÑÑÑока запÑоÑа.
- ErrorResponse (ÐÑибоÑнÑй оÑвеÑ)
ÐÑоизоÑла оÑибка.
- ReadyForQuery (ÐоÑов к запÑоÑам)
ÐбÑабоÑка ÑÑÑоки запÑоÑа завеÑÑена. ЧÑÐ¾Ð±Ñ Ð¾ÑмеÑиÑÑ ÑÑо, оÑпÑавлÑеÑÑÑ Ð¾ÑделÑное ÑообÑение, Ñак как ÑÑÑока запÑоÑа Ð¼Ð¾Ð¶ÐµÑ ÑодеÑжаÑÑ Ð½ÐµÑколÑко команд SQL. (СообÑение CommandComplete говоÑÐ¸Ñ Ð¾ завеÑÑении обÑабоÑки одной ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ SQL, а не вÑей ÑÑÑоки.) ReadyForQuery пеÑедаÑÑÑÑ Ð²Ñегда, и пÑи ÑÑпеÑном завеÑÑении обÑабоÑки, и пÑи оÑибке.
- NoticeResponse (ÐÑÐ²ÐµÑ Ñ Ð·Ð°Ð¼ÐµÑанием)
ÐÑдаÑÑÑÑ Ð¿ÑедÑпÑеждение, ÑвÑзанное Ñ Ð·Ð°Ð¿ÑоÑом. ÐÑи замеÑÐ°Ð½Ð¸Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½ÑÑÑ Ð´ÑÑгие оÑвеÑÑ, Ñо еÑÑÑ ÑеÑвеÑ, вÑÐ´Ð°Ð²Ð°Ñ Ð¸Ñ , пÑÐ¾Ð´Ð¾Ð»Ð¶Ð°ÐµÑ Ð¾Ð±ÑабаÑÑваÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ.
ÐÑÐ²ÐµÑ Ð½Ð° запÑÐ¾Ñ SELECT (или дÑÑгие запÑоÑÑ, возвÑаÑаÑÑие набоÑÑ ÑÑÑок, Ñакие как EXPLAIN и SHOW) обÑÑно ÑоÑÑÐ¾Ð¸Ñ Ð¸Ð· RowDescription, нÑÐ»Ñ Ð¸Ð»Ð¸ неÑколÑкиÑ
ÑообÑений DataRow, и завеÑÑаÑÑего CommandComplete. ÐÐ»Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ COPY Ñ Ð²Ð²Ð¾Ð´Ð¾Ð¼ или вÑводом даннÑÑ
ÑеÑез клиенÑа, пÑименÑеÑÑÑ ÑпеÑиалÑнÑй пÑоÑокол, опиÑаннÑй в ÐодÑазделе 54.2.6. Со вÑеми дÑÑгими Ñипами запÑоÑами обÑÑно вÑдаÑÑÑÑ ÑолÑко ÑообÑение CommandComplete.
Так как ÑÑÑока запÑоÑа Ð¼Ð¾Ð¶ÐµÑ ÑодеÑжаÑÑ Ð½ÐµÑколÑко запÑоÑов (ÑазделÑннÑÑ ÑоÑкой Ñ Ð·Ð°Ð¿ÑÑой), до завеÑÑÐµÐ½Ð¸Ñ Ð¾Ð±ÑабоÑки вÑей ÑÑÑоки ÑеÑÐ²ÐµÑ Ð¼Ð¾Ð¶ÐµÑ Ð¿ÐµÑедаÑÑ Ð½ÐµÑколÑко ÑеÑий ÑÐ°ÐºÐ¸Ñ Ð¾ÑвеÑов. Ðогда ÑеÑÐ²ÐµÑ Ð·Ð°Ð²ÐµÑÑÐ°ÐµÑ Ð¾Ð±ÑабоÑÐºÑ Ð²Ñей ÑÑÑоки и гоÑов пÑинÑÑÑ ÑледÑÑÑÑÑ ÑÑÑÐ¾ÐºÑ Ð·Ð°Ð¿ÑоÑа, он вÑдаÑÑ ÑообÑение ReadyForQuery.
ÐÑли полÑÑена полноÑÑÑÑ Ð¿ÑÑÑÐ°Ñ ÑÑÑока запÑоÑа (не ÑодеÑжаÑÐ°Ñ Ð½Ð¸Ñего, кÑоме пÑобелÑнÑÑ Ñимволов), оÑвеÑом бÑÐ´ÐµÑ EmptyQueryResponse Ñ Ð¿Ð¾ÑледÑÑÑим ReadyForQuery.
Ð ÑлÑÑае оÑибки вÑдаÑÑÑÑ ErrorResponse Ñ Ð¿Ð¾ÑледÑÑÑим ReadyForQuery. СообÑение ErrorResponse пÑеÑÑÐ²Ð°ÐµÑ Ð´Ð°Ð»ÑнейÑÑÑ Ð¾Ð±ÑабоÑÐºÑ ÑÑÑоки запÑоÑа (даже еÑли в ней оÑÑалиÑÑ Ð´ÑÑгие запÑоÑÑ). ÐамеÑÑÑе, ÑÑо оно Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð²Ñдано и в ÑеÑедине поÑледоваÑелÑноÑÑи ÑообÑений, вÑдаваемÑÑ Ð² оÑÐ²ÐµÑ Ð½Ð° оÑделÑнÑй запÑоÑ.
Ð ÑлÑÑае пÑоÑÑого вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿ÑоÑов полÑÑаемÑе знаÑÐµÐ½Ð¸Ñ Ð²Ñегда пеÑедаÑÑÑÑ Ð² ÑекÑÑовом ÑоÑмаÑе, за иÑклÑÑением ÑезÑлÑÑаÑов ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ FETCH Ð´Ð»Ñ ÐºÑÑÑоÑа, обÑÑвленного Ñ Ð°ÑÑибÑÑом BINARY. С Ñакой командой знаÑÐµÐ½Ð¸Ñ Ð¿ÐµÑедаÑÑÑÑ Ð² двоиÑном ÑоÑмаÑе. Ðакой именно ÑоÑÐ¼Ð°Ñ Ð¸ÑполÑзÑеÑÑÑ, опÑеделÑÑÑ ÐºÐ¾Ð´Ñ ÑоÑмаÑа, пеÑедаваемÑе в ÑообÑении RowDescription.
ÐÐ»Ð¸ÐµÐ½Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ бÑÑÑ Ð³Ð¾Ñов пÑинÑÑÑ ÑообÑÐµÐ½Ð¸Ñ ErrorResponse и NoticeResponse, Ð¾Ð¶Ð¸Ð´Ð°Ñ Ð»Ñбой дÑÑгой Ñип ÑообÑений. Также обÑаÑиÑеÑÑ Ðº ÐодÑазделÑ 54.2.7 за инÑоÑмаÑией о ÑообÑениÑÑ , коÑоÑÑе ÑеÑÐ²ÐµÑ Ð¼Ð¾Ð¶ÐµÑ Ð²ÑдаваÑÑ Ð² оÑÐ²ÐµÑ Ð½Ð° внеÑние ÑобÑÑиÑ.
Ðод клиенÑа ÑекомендÑеÑÑÑ ÑеализовÑваÑÑ Ð² виде конеÑного авÑомаÑа, коÑоÑÑй в лÑбой Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð±ÑÐ´ÐµÑ Ð¿ÑинимаÑÑ ÑообÑÐµÐ½Ð¸Ñ Ð²ÑÐµÑ Ñипов, имеÑÑÐ¸Ñ ÑмÑÑл на данном ÑÑапе, но не пÑогÑаммиÑоваÑÑ Ð¶ÑÑÑко обÑабоÑÐºÑ ÑоÑной поÑледоваÑелÑноÑÑи ÑообÑений.
54.2.2.1. ÐеÑколÑко опеÑаÑоÑов в пÑоÑÑом пÑоÑоколе запÑоÑов #
Ðогда пÑоÑÑое ÑообÑение Query ÑодеÑÐ¶Ð¸Ñ Ð½ÐµÑколÑко SQL-опеÑаÑоÑов (ÑазделÑннÑÑ ÑоÑкой Ñ Ð·Ð°Ð¿ÑÑой), ÑÑи опеÑаÑоÑÑ Ð²ÑполнÑÑÑÑÑ Ð² одной ÑÑанзакÑии, еÑли ÑолÑко ÑÑеди Ð½Ð¸Ñ Ð½ÐµÑ ÑвнÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´ ÑпÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ ÑÑанзакÑиÑми, менÑÑÑÐ¸Ñ ÑÑо поведение. ÐапÑимеÑ, еÑли ÑообÑение ÑодеÑжиÑ
INSERT INTO mytable VALUES(1); SELECT 1/0; INSERT INTO mytable VALUES(2);
, Ñо оÑибка Ð´ÐµÐ»ÐµÐ½Ð¸Ñ Ð½Ð° Ð½Ð¾Ð»Ñ Ð² SELECT пÑиведÑÑ Ðº оÑкаÑÑ ÑезÑлÑÑаÑа пеÑвого INSERT. Ðолее Ñого, вÑледÑÑвие пÑеÑÑÐ²Ð°Ð½Ð¸Ñ Ð¾Ð±ÑабоÑки ÑообÑÐµÐ½Ð¸Ñ Ð½Ð° пеÑвой оÑибке, вÑоÑой INSERT не бÑÐ´ÐµÑ Ð²ÑполнÑÑÑÑÑ Ð²Ð¾Ð²Ñе.
ÐÑли же ÑообÑение ÑодеÑжиÑ:
BEGIN; INSERT INTO mytable VALUES(1); COMMIT; INSERT INTO mytable VALUES(2); SELECT 1/0;
ÑезÑлÑÑÐ°Ñ Ð¿ÐµÑвого INSERT ÑикÑиÑÑеÑÑÑ Ñвной командой COMMIT. ÐÑоÑой INSERT и поÑледÑÑÑий SELECT бÑдÑÑ Ñак же обÑабаÑÑваÑÑÑÑ Ð² одной ÑÑанзакÑии, поÑÑÐ¾Ð¼Ñ Ð¾Ñибка Ð´ÐµÐ»ÐµÐ½Ð¸Ñ Ð½Ð° Ð½Ð¾Ð»Ñ Ð¿ÑиведÑÑ Ðº оÑкаÑÑ Ð²ÑоÑого INSERT, и не заÑÑÐ¾Ð½ÐµÑ Ð¿ÐµÑвÑй.
ÐÐ»Ñ ÑеализаÑии ÑÑого Ð¿Ð¾Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¾Ð¿ÐµÑаÑоÑÑ Ð² ÑоÑÑавном ÑообÑении запÑоÑа вÑполнÑÑÑÑÑ Ð² неÑвном блоке ÑÑанзакÑии, еÑли ÑолÑко в ÑообÑении Ð½ÐµÑ Ñвного блока ÑÑанзакÑии, в коÑоÑом они Ð´Ð¾Ð»Ð¶Ð½Ñ Ð²ÑполнÑÑÑÑÑ. ÐÑновное оÑлиÑие неÑвного блока ÑÑанзакÑии Ð¾Ñ Ð¾Ð±ÑÑного ÑоÑÑÐ¾Ð¸Ñ Ð² Ñом, ÑÑо неÑвнÑй блок авÑомаÑиÑеÑки закÑÑваеÑÑÑ Ð² конÑе ÑообÑÐµÐ½Ð¸Ñ Query â либо неÑвно ÑикÑиÑÑеÑÑÑ Ð¿Ñи оÑÑÑÑÑÑвии оÑибок, либо неÑвно оÑкаÑÑваеÑÑÑ Ð² пÑоÑивном ÑлÑÑае. ÐÐ¾Ð´Ð¾Ð±Ð½Ð°Ñ Ð½ÐµÑÐ²Ð½Ð°Ñ ÑикÑаÑÐ¸Ñ Ð¸Ð»Ð¸ оÑмена ÑÑанзакÑии Ð¸Ð¼ÐµÐµÑ Ð¼ÐµÑÑо, когда опеÑаÑÐ¾Ñ Ð²ÑполнÑеÑÑÑ Ð¾ÑделÑно (вне блока ÑÑанзакÑии).
ÐÑли в ÑамкаÑ
ÑеанÑа Ñже наÑÐ°Ñ Ð±Ð»Ð¾Ðº ÑÑанзакÑии (в ÑезÑлÑÑаÑе вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¾Ð¿ÐµÑаÑоÑа BEGIN из некоÑоÑого пÑедÑдÑÑего ÑообÑениÑ), ÑообÑение Query пÑоÑÑо пÑÐ¾Ð´Ð¾Ð»Ð¶Ð°ÐµÑ ÑÑÐ¾Ñ Ð±Ð»Ð¾Ðº незавиÑимо Ð¾Ñ Ñого, ÑодеÑжиÑÑÑ Ð»Ð¸ в нÑм один опеÑаÑÐ¾Ñ Ð¸Ð»Ð¸ неÑколÑко. Ðднако еÑли ÑообÑение Query ÑодеÑÐ¶Ð¸Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ COMMIT или ROLLBACK, закÑÑваÑÑÑÑ ÑÑÑеÑÑвÑÑÑий блок ÑÑанзакÑий, Ñо вÑе поÑледÑÑÑие ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ Ð² нÑм вÑполнÑÑÑÑÑ Ð² неÑвном блоке ÑÑанзакÑии. РнапÑоÑив, еÑли ÑоÑÑавное ÑообÑение Query ÑодеÑÐ¶Ð¸Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ BEGIN, она наÑÐ¸Ð½Ð°ÐµÑ Ð¾Ð±ÑÑнÑй блок ÑÑанзакÑии, коÑоÑÑй бÑÐ´ÐµÑ Ð·Ð°ÐºÐ¾Ð½Ñен ÑолÑко ÑвнÑми командами COMMIT или ROLLBACK, в каком Ð±Ñ ÑообÑении Query, ÑекÑÑем или поÑледÑÑÑиÑ
, они ни ÑодеÑжалиÑÑ. ÐÑли BEGIN ÑледÑÐµÑ Ð·Ð° опеÑаÑоÑами, коÑоÑÑе вÑполнÑлиÑÑ Ð² неÑвном блоке ÑÑанзакÑии, ÑÑи опеÑаÑоÑÑ Ð½Ðµ ÑикÑиÑÑÑÑÑÑ Ð½ÐµÐ¼ÐµÐ´Ð»ÐµÐ½Ð½Ð¾; они задним ÑиÑлом вклÑÑаÑÑÑÑ Ð² новÑй обÑÑнÑй блок ÑÑанзакÑии.
ÐпеÑаÑоÑÑ COMMIT и ROLLBACK, ÑигÑÑиÑÑÑÑие в неÑвном блоке ÑÑанзакÑии, вÑполнÑÑÑÑÑ ÐºÐ°Ðº обÑÑно, закÑÑÐ²Ð°Ñ Ð½ÐµÑвнÑй блок; однако пÑи ÑÑом бÑÐ´ÐµÑ Ð²Ñдано пÑедÑпÑеждение, Ñак как COMMIT или ROLLBACK без пÑедÑеÑÑвÑÑÑего BEGIN могÑÑ Ð²ÑполнÑÑÑÑÑ Ð¿Ð¾ оÑибке. ÐÑли за ÑÑими опеÑаÑоÑами ÑледÑÑÑ Ð´ÑÑгие, Ð´Ð»Ñ Ð½Ð¸Ñ
бÑÐ´ÐµÑ Ð½Ð°ÑÐ°Ñ Ð½Ð¾Ð²Ñй неÑвнÑй блок ÑÑанзакÑии.
ТоÑки ÑÐ¾Ñ ÑÐ°Ð½ÐµÐ½Ð¸Ñ Ð² неÑвнÑÑ Ð±Ð»Ð¾ÐºÐ°Ñ ÑÑанзакÑий не допÑÑкаÑÑÑÑ, Ñак как они бÑдÑÑ ÐºÐ¾Ð½ÑликÑоваÑÑ Ñ Ð¿Ñавилом авÑомаÑиÑеÑкого закÑÑÑÐ¸Ñ Ð±Ð»Ð¾ÐºÐ° пÑи лÑбой оÑибке.
ÐомниÑе, ÑÑо, вне завиÑимоÑÑи Ð¾Ñ Ð½Ð°Ð»Ð¸ÑÐ¸Ñ Ð»ÑбÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´ ÑпÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ ÑÑанзакÑиÑми, вÑполнение ÑообÑÐµÐ½Ð¸Ñ Query оÑÑанавливаеÑÑÑ Ð¿Ñи пеÑвой же оÑибке. Таким обÑазом, Ñ Ð´Ð°Ð½Ð½Ñми командами:
BEGIN; SELECT 1/0; ROLLBACK;
в одном ÑообÑении Query ÑÐµÐ°Ð½Ñ Ð¾ÑÑанеÑÑÑ Ð²Ð½ÑÑÑи пÑеÑванного обÑÑного блока ÑÑанзакÑии, Ñак как команда ROLLBACK не доÑÑигаеÑÑÑ Ð¿Ð¾Ñле оÑибки Ð´ÐµÐ»ÐµÐ½Ð¸Ñ Ð½Ð° нолÑ. ÐÐ»Ñ Ð¿ÑÐ¸Ð²ÐµÐ´ÐµÐ½Ð¸Ñ ÑеанÑа в поÑÑдок поÑÑебÑеÑÑÑ Ð²ÑполниÑÑ ÐµÑÑ Ð¾Ð´Ð¸Ð½ ROLLBACK.
Также ÑледÑÐµÑ Ð·Ð°Ð¼ÐµÑиÑÑ, ÑÑо пеÑвонаÑалÑнÑй лекÑиÑеÑкий и ÑинÑакÑиÑеÑкий анализ пÑоизводиÑÑÑ Ð´Ð»Ñ Ð²Ñей ÑÑÑоки запÑоÑа, пÑежде Ñем какаÑ-либо ÐµÑ ÑаÑÑÑ Ð±ÑÐ´ÐµÑ Ð²ÑполнÑÑÑÑÑ. Таким обÑазом, пÑоÑÑÑе оÑибки (напÑимеÑ, опеÑаÑка в клÑÑевом Ñлове) в поÑледÑÑÑÐ¸Ñ Ð¾Ð¿ÐµÑаÑоÑÐ°Ñ Ð¼Ð¾Ð³ÑÑ Ð¿ÑивеÑÑи к ÑомÑ, ÑÑо не бÑÐ´ÐµÑ Ð²Ñполнен и ни один из пÑедÑеÑÑвÑÑÑÐ¸Ñ Ð¾Ð¿ÐµÑаÑоÑов. ÐÑо обÑÑно незамеÑно Ð´Ð»Ñ Ð¿Ð¾Ð»ÑзоваÑелей, Ñак как ÑÑи опеÑаÑоÑÑ Ð¾ÑкаÑилиÑÑ Ð±Ñ Ð²ÑÑ Ñавно пÑи вÑполнении в неÑвном блоке ÑÑанзакÑии. Ðднако ÑÑа оÑобенноÑÑÑ Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑоÑвиÑÑÑÑ Ð¿Ñи попÑÑке вÑполниÑÑ Ð½ÐµÑколÑко ÑÑанзакÑий в одном ÑоÑÑавном запÑоÑе. ÐапÑимеÑ, еÑли из-за опеÑаÑки пÑедÑдÑÑий пÑÐ¸Ð¼ÐµÑ Ð¿ÑевÑаÑилÑÑ Ð²:
BEGIN; INSERT INTO mytable VALUES(1); COMMIT; INSERT INTO mytable VALUES(2); SELCT 1/0;
ни один из опеÑаÑоÑов не бÑÐ´ÐµÑ Ð²ÑполнÑÑÑÑÑ, и оÑлиÑие пÑоÑвиÑÑÑ Ð² Ñом, ÑÑо пеÑвÑй INSERT не бÑÐ´ÐµÑ Ð·Ð°ÑикÑиÑован. ÐÑибки, вÑÑвленнÑе на ÑÑадии ÑеманÑиÑеÑкого анализа или позже, напÑимеÑ, опеÑаÑки в имени ÑÐ°Ð±Ð»Ð¸Ñ Ð¸Ð»Ð¸ ÑÑолбÑа, Ñакого влиÑÐ½Ð¸Ñ Ð½Ð° вÑполнение не оказÑваÑÑ.
ÐаконеÑ, обÑаÑиÑе внимание, ÑÑо вÑе опеÑаÑоÑÑ Ð² ÑообÑении Query ÑÑиÑÑваÑÑ Ð¾Ð´Ð½Ð¾ и Ñо же знаÑение ÑÑнкÑии statement_timestamp(), поÑколÑÐºÑ Ð´Ð°Ð½Ð½Ð°Ñ Ð²ÑÐµÐ¼ÐµÐ½Ð½Ð°Ñ Ð¼ÐµÑка обновлÑеÑÑÑ ÑолÑко пÑи полÑÑении ÑообÑÐµÐ½Ð¸Ñ Query. ÐÑо пÑÐ¸Ð²Ð¾Ð´Ð¸Ñ Ðº ÑомÑ, ÑÑо Ñакже ÑÑиÑÑваеÑÑÑ Ð¾Ð´Ð½Ð¾ и Ñо же знаÑение ÑÑнкÑии transaction_timestamp(), за иÑклÑÑением ÑлÑÑаев, когда ÑÑÑока запÑоÑа завеÑÑÐ°ÐµÑ Ñанее наÑаÑÑÑ ÑÑанзакÑÐ¸Ñ Ð¸ наÑÐ¸Ð½Ð°ÐµÑ Ð½Ð¾Ð²ÑÑ.
54.2.3. РаÑÑиÑенное вÑполнение запÑоÑов #
РаÑÑиÑеннÑй пÑоÑокол запÑоÑов ÑÐ°Ð·Ð±Ð¸Ð²Ð°ÐµÑ Ð²ÑÑеопиÑаннÑй пÑоÑÑой пÑоÑокол на неÑколÑко Ñагов. РезÑлÑÑаÑÑ Ð¿Ð¾Ð´Ð³Ð¾ÑовиÑелÑнÑÑ Ñагов можно многокÑаÑно иÑполÑзоваÑÑ Ð¿Ð¾Ð²ÑоÑно Ð´Ð»Ñ ÑлÑÑÑÐµÐ½Ð¸Ñ ÑÑÑекÑивноÑÑи. ÐÑоме Ñого, он оÑкÑÑÐ²Ð°ÐµÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑе возможноÑÑи, в ÑаÑÑноÑÑи, возможноÑÑÑ Ð¿ÐµÑедаваÑÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð´Ð°Ð½Ð½ÑÑ Ð² оÑделÑнÑÑ Ð¿Ð°ÑамеÑÑÐ°Ñ Ð²Ð¼ÐµÑÑо Ñого, ÑÑÐ¾Ð±Ñ Ð²Ð½ÐµÐ´ÑÑÑÑ Ð¸Ñ Ð½ÐµÐ¿Ð¾ÑÑедÑÑвенно в ÑÑÑÐ¾ÐºÑ Ð·Ð°Ð¿ÑоÑа.
Ð ÑаÑÑиÑенном пÑоÑоколе ÐºÐ»Ð¸ÐµÐ½Ñ ÑнаÑала пеÑедаÑÑ ÑообÑение Parse Ñ ÑекÑÑовой ÑÑÑокой запÑоÑа и, возможно, некоÑоÑÑми ÑведениÑми о ÑÐ¸Ð¿Ð°Ñ Ð¿Ð°ÑамеÑÑов и именем Ñелевого обÑекÑа подгоÑовленного опеÑаÑоÑа (еÑли Ð¸Ð¼Ñ Ð¿ÑÑÑое, ÑоздаÑÑÑÑ Ð±ÐµÐ·ÑмÑннÑй подгоÑовленнÑй опеÑаÑоÑ). ÐÑвеÑом на ÑÑо ÑообÑение бÑÐ´ÐµÑ ParseComplete или ErrorResponse. Ð¢Ð¸Ð¿Ñ Ð¿Ð°ÑамеÑÑов ÑказÑваÑÑÑÑ Ð¿Ð¾ OID; пÑи оÑÑÑÑÑÑвии Ñвного ÑÐºÐ°Ð·Ð°Ð½Ð¸Ñ Ð°Ð½Ð°Ð»Ð¸Ð·Ð°ÑÐ¾Ñ Ð·Ð°Ð¿ÑоÑа пÑÑаеÑÑÑ Ð¾Ð¿ÑеделиÑÑ ÑÐ¸Ð¿Ñ Ð´Ð°Ð½Ð½ÑÑ Ñак же, как он делал Ð±Ñ Ð´Ð»Ñ Ð½ÐµÑипизиÑованнÑÑ ÑÑÑоковÑÑ ÐºÐ¾Ð½ÑÑанÑ.
ÐÑимеÑание
Тип даннÑÑ
паÑамеÑÑа можно оÑÑавиÑÑ Ð½ÐµÐ¾Ð¿ÑеделÑннÑм, задав Ð´Ð»Ñ Ð½ÐµÐ³Ð¾ знаÑение нолÑ, либо Ñделав маÑÑив Ñ OID Ñипов паÑамеÑÑов коÑоÑе, Ñем Ð½Ð°Ð±Ð¾Ñ Ñимволов паÑамеÑÑов ($n), иÑполÑзÑемÑÑ
в ÑÑÑоке запÑоÑа. ÐÑÑгой оÑобÑй ÑлÑÑай â пеÑедаÑа Ñипа паÑамеÑÑа как void (Ñо еÑÑÑ Ð¿ÐµÑедаÑа OID пÑевдоÑипа void). ÐÑо пÑедÑÑмоÑÑено Ð´Ð»Ñ Ñого, ÑÑÐ¾Ð±Ñ ÑÐ¸Ð¼Ð²Ð¾Ð»Ñ Ð¿Ð°ÑамеÑÑов можно бÑло иÑполÑзоваÑÑ Ð´Ð»Ñ Ð¿Ð°ÑамеÑÑов ÑÑнкÑий, на Ñамом деле пÑедÑÑавлÑÑÑиÑ
Ñобой паÑамеÑÑÑ OUT. ÐбÑÑно паÑамеÑÑ void нелÑÐ·Ñ Ð¸ÑполÑзоваÑÑ Ð½Ð¸ в каком конÑекÑÑе, но еÑли Ñакой паÑамеÑÑ ÑигÑÑиÑÑÐµÑ Ð² ÑпиÑке паÑамеÑÑов ÑÑнкÑии, он ÑакÑиÑеÑки игноÑиÑÑеÑÑÑ. ÐапÑимеÑ, вÑÐ·Ð¾Ð²Ñ ÑÑнкÑии foo($1,$2,$3,$4) Ð¼Ð¾Ð¶ÐµÑ ÑооÑвеÑÑÑвоваÑÑ ÑÑнкÑÐ¸Ñ Ñ Ð°ÑгÑменÑами IN и двÑÐ¼Ñ OUT, еÑли аÑгÑменÑÑ $3 и $4 обÑÑÐ²Ð»ÐµÐ½Ñ ÐºÐ°Ðº имеÑÑие Ñип void.
ÐÑимеÑание
СÑÑока запÑоÑа, ÑодеÑжаÑаÑÑÑ Ð² ÑообÑении Parse, не Ð¼Ð¾Ð¶ÐµÑ ÑодеÑжаÑÑ Ð±Ð¾Ð»ÑÑе одного опеÑаÑоÑа SQL; инаÑе вÑдаÑÑÑÑ ÑинÑакÑиÑеÑÐºÐ°Ñ Ð¾Ñибка. ÐÑо огÑаниÑение оÑÑÑÑÑÑвÑÐµÑ Ð² пÑоÑÑом пÑоÑоколе запÑоÑов, но пÑиÑÑÑÑÑвÑÐµÑ Ð² ÑаÑÑиÑенном пÑоÑоколе, Ñак как добавление поддеÑжки подгоÑовленнÑÑ Ð¾Ð¿ÐµÑаÑоÑов или поÑÑалов, ÑодеÑжаÑÐ¸Ñ Ð½ÐµÑколÑко команд, неопÑавданно ÑÑложнило Ð±Ñ Ð¿ÑоÑокол.
Ð ÑлÑÑае ÑÑпеÑного ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¸Ð¼ÐµÐ½Ð¾Ð²Ð°Ð½Ð½Ñй подгоÑовленнÑй опеÑаÑÐ¾Ñ Ð¿ÑÐ¾Ð´Ð¾Ð»Ð¶Ð°ÐµÑ ÑÑÑеÑÑвоваÑÑ Ð´Ð¾ завеÑÑÐµÐ½Ð¸Ñ ÑекÑÑего ÑеанÑа, еÑли ÑолÑко он не бÑÐ´ÐµÑ ÑниÑÑожен Ñвно. ÐезÑмÑннÑй подгоÑовленнÑй опеÑаÑÐ¾Ñ ÑоÑ
ÑанÑеÑÑÑ ÑолÑко до ÑледÑÑÑей ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ Parse, в коÑоÑой ÑелевÑм ÑвлÑеÑÑÑ Ð±ÐµÐ·ÑмÑннÑй опеÑаÑоÑ. (ÐамеÑÑÑе, ÑÑо пÑоÑÑое ÑообÑение Query Ñакже ÑниÑÑÐ¾Ð¶Ð°ÐµÑ Ð±ÐµÐ·ÑмÑннÑй опеÑаÑоÑ.) ÐменованнÑе опеÑаÑоÑÑ Ð´Ð¾Ð»Ð¶Ð½Ñ Ñвно закÑÑваÑÑÑÑ, пÑежде Ñем иÑ
можно бÑÐ´ÐµÑ Ð¿ÐµÑеопÑеделиÑÑ Ð´ÑÑгим ÑообÑением Parse, но Ð´Ð»Ñ Ð±ÐµÐ·ÑмÑннÑÑ
опеÑаÑоÑов ÑÑо не ÑÑебÑеÑÑÑ. ÐменованнÑе подгоÑовленнÑе опеÑаÑоÑÑ Ñакже можно ÑоздаваÑÑ Ð¸ вÑзÑваÑÑ Ð½Ð° ÑÑовне команд SQL, иÑполÑзÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ PREPARE и EXECUTE.
Ðогда подгоÑовленнÑй опеÑаÑÐ¾Ñ ÑÑÑеÑÑвÑеÑ, его можно подгоÑовиÑÑ Ðº вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÑообÑением Bind. Ð ÑообÑении Bind задаÑÑÑÑ Ð¸Ð¼Ñ Ð¸ÑÑ
одного подгоÑовленного опеÑаÑоÑа (пÑÑÑÐ°Ñ ÑÑÑока подÑазÑÐ¼ÐµÐ²Ð°ÐµÑ Ð±ÐµÐ·ÑмÑннÑй подгоÑовленнÑй опеÑаÑоÑ), Ð¸Ð¼Ñ Ñелевого поÑÑала (пÑÑÑÐ°Ñ ÑÑÑока подÑазÑÐ¼ÐµÐ²Ð°ÐµÑ Ð±ÐµÐ·ÑмÑннÑй поÑÑал) и знаÑÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð»ÑбÑÑ
Ñаблонов паÑамеÑÑов, пÑедÑÑавленнÑÑ
в подгоÑовленном опеÑаÑоÑе. ÐÐ°Ð±Ð¾Ñ Ð¿ÐµÑедаваемÑÑ
знаÑений должен ÑооÑвеÑÑÑвоваÑÑ Ð½Ð°Ð±Ð¾ÑÑ Ð¿Ð°ÑамеÑÑов, ÑÑебÑÑÑиÑ
ÑÑ Ð´Ð»Ñ Ð¿Ð¾Ð´Ð³Ð¾Ñовленного опеÑаÑоÑа. (ÐÑли Ð²Ñ Ð¾Ð±ÑÑвили паÑамеÑÑÑ void в ÑообÑении Parse, пеÑедайÑе Ð´Ð»Ñ Ð½Ð¸Ñ
знаÑÐµÐ½Ð¸Ñ NULL в ÑообÑении Bind.) Bind Ñакже пÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ñказание ÑоÑмаÑа Ð´Ð»Ñ Ð´Ð°Ð½Ð½ÑÑ
, возвÑаÑаемÑÑ
в ÑезÑлÑÑаÑе запÑоÑа; ÑоÑÐ¼Ð°Ñ Ð¼Ð¾Ð¶Ð½Ð¾ ÑказаÑÑ Ð´Ð»Ñ Ð²ÑеÑ
даннÑÑ
, либо Ð´Ð»Ñ Ð¾ÑделÑнÑÑ
ÑÑолбÑов. ÐÑвеÑом на ÑÑо ÑообÑение бÑÐ´ÐµÑ BindComplete или ErrorResponse.
ÐÑимеÑание
ÐÑÐ±Ð¾Ñ Ð¼ÐµÐ¶Ð´Ñ ÑекÑÑовÑм и двоиÑнÑм ÑоÑмаÑом вÑвода опÑеделÑеÑÑÑ ÐºÐ¾Ð´Ð°Ð¼Ð¸ ÑоÑмаÑа, пеÑедаваемÑми в Bind, вне завиÑимоÑÑи Ð¾Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ SQL. ÐÑи иÑполÑзовании ÑаÑÑиÑенного пÑоÑокола запÑоÑов аÑÑибÑÑ BINARY в обÑÑвлении кÑÑÑоÑов не Ð¸Ð¼ÐµÐµÑ Ð·Ð½Ð°ÑениÑ.
ÐланиÑование запÑоÑа обÑÑно Ð¸Ð¼ÐµÐµÑ Ð¼ÐµÑÑо пÑи обÑабоÑке ÑообÑÐµÐ½Ð¸Ñ Bind. ÐÑли подгоÑовленнÑй опеÑаÑÐ¾Ñ Ð½Ðµ Ð¸Ð¼ÐµÐµÑ Ð¿Ð°ÑамеÑÑов, либо он вÑполнÑеÑÑÑ Ð¼Ð½Ð¾Ð³Ð¾ÐºÑаÑно, ÑеÑÐ²ÐµÑ Ð¼Ð¾Ð¶ÐµÑ ÑÐ¾Ñ ÑаниÑÑ ÑозданнÑй план и иÑполÑзоваÑÑ ÐµÐ³Ð¾ повÑоÑно пÑи поÑледÑÑÑÐ¸Ñ ÑообÑениÑÑ Bind Ð´Ð»Ñ Ñого же подгоÑовленного опеÑаÑоÑа. Ðднако он бÑÐ´ÐµÑ Ð´ÐµÐ»Ð°ÑÑ ÑÑо, ÑолÑко еÑли ÑеÑиÑ, ÑÑо можно полÑÑиÑÑ ÑнивеÑÑалÑнÑй план, коÑоÑÑй не бÑÐ´ÐµÑ Ð·Ð½Ð°ÑиÑелÑно неÑÑÑекÑивнее планов, завиÑÑÑÐ¸Ñ Ð¾Ñ ÐºÐ¾Ð½ÐºÑеÑнÑÑ Ð·Ð½Ð°Ñений паÑамеÑÑов. С ÑоÑки зÑÐµÐ½Ð¸Ñ Ð¿ÑоÑокола ÑÑо пÑоиÑÑ Ð¾Ð´Ð¸Ñ Ð½ÐµÐ·Ð°Ð¼ÐµÑно.
Ð ÑлÑÑае ÑÑпеÑного ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¾Ð±ÑÐµÐºÑ Ð¸Ð¼ÐµÐ½Ð¾Ð²Ð°Ð½Ð½Ð¾Ð³Ð¾ поÑÑала пÑÐ¾Ð´Ð¾Ð»Ð¶Ð°ÐµÑ ÑÑÑеÑÑвование до конÑа ÑекÑÑей ÑÑанзакÑии, еÑли ÑолÑко он не бÑÐ´ÐµÑ ÑниÑÑожен Ñвно. ÐезÑмÑннÑй поÑÑал ÑниÑÑожаеÑÑÑ Ð² конÑе ÑÑанзакÑии или пÑи вÑполнении ÑледÑÑÑей ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ Bind, в коÑоÑой в каÑеÑÑве Ñелевого вÑбиÑаеÑÑÑ Ð±ÐµÐ·ÑмÑннÑй поÑÑал. (ÐамеÑÑÑе, ÑÑо пÑоÑÑое ÑообÑение Query Ñакже ÑниÑÑÐ¾Ð¶Ð°ÐµÑ Ð±ÐµÐ·ÑмÑннÑй поÑÑал.) ÐменованнÑе поÑÑÐ°Ð»Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ Ñвно закÑÑваÑÑÑÑ, пÑежде Ñем иÑ
можно бÑÐ´ÐµÑ Ñвно пеÑеопÑеделиÑÑ Ð´ÑÑгим ÑообÑением Bind, но ÑÑо не ÑÑебÑеÑÑÑ Ð´Ð»Ñ Ð±ÐµÐ·ÑмÑннÑÑ
поÑÑалов. ÐменованнÑе поÑÑÐ°Ð»Ñ Ñакже можно ÑоздаваÑÑ Ð¸ вÑзÑваÑÑ Ð½Ð° ÑÑовне команд SQL, иÑполÑзÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ DECLARE CURSOR и FETCH.
Ðогда поÑÑал ÑÑÑеÑÑвÑеÑ, его можно запÑÑÑиÑÑ Ð½Ð° вÑполнение ÑообÑением Execute. Ð ÑообÑении Execute ÑказÑваеÑÑÑ Ð¸Ð¼Ñ Ð¿Ð¾ÑÑала (пÑÑÑÐ°Ñ ÑÑÑока подÑазÑÐ¼ÐµÐ²Ð°ÐµÑ Ð±ÐµÐ·ÑмÑннÑй поÑÑал) и макÑималÑное ÑиÑло ÑезÑлÑÑиÑÑÑÑÐ¸Ñ ÑÑÑок (Ð½Ð¾Ð»Ñ Ð¾Ð·Ð½Ð°ÑÐ°ÐµÑ Â«Ð²ÑбÑаÑÑ Ð²Ñе ÑÑÑоки»). ЧиÑло ÑезÑлÑÑиÑÑÑÑÐ¸Ñ ÑÑÑок Ð¸Ð¼ÐµÐµÑ Ð·Ð½Ð°Ñение ÑолÑко Ð´Ð»Ñ Ð¿Ð¾ÑÑалов, коÑоÑÑе ÑодеÑÐ¶Ð°Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ, возвÑаÑаÑÑие набоÑÑ ÑÑÑок; в дÑÑÐ³Ð¸Ñ ÑлÑÑаÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð° вÑегда вÑполнÑеÑÑÑ Ð´Ð¾ завеÑÑÐµÐ½Ð¸Ñ Ð¸ ÑиÑло ÑÑÑок игноÑиÑÑеÑÑÑ. РоÑÐ²ÐµÑ Ð½Ð° Execute могÑÑ Ð±ÑÑÑ Ð¿Ð¾Ð»ÑÑÐµÐ½Ñ Ñе же ÑообÑениÑ, ÑÑо опиÑÐ°Ð½Ñ Ð²ÑÑе Ð´Ð»Ñ Ð·Ð°Ð¿ÑоÑов, вÑполнÑемÑÑ ÑеÑез пÑоÑÑой пÑоÑокол, за иÑклÑÑением Ñого, ÑÑо поÑле Execute не вÑдаÑÑÑÑ ÑообÑÐµÐ½Ð¸Ñ ReadyForQuery и RowDescription.
ÐÑли опеÑаÑÐ¸Ñ Execute оканÑиваеÑÑÑ Ð´Ð¾ завеÑÑÐµÐ½Ð¸Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¿Ð¾ÑÑала (из-за доÑÑÐ¸Ð¶ÐµÐ½Ð¸Ñ Ð½ÐµÐ½Ñлевого огÑаниÑÐµÐ½Ð¸Ñ Ð½Ð° ÑиÑло ÑÑÑок), ÑеÑÐ²ÐµÑ Ð¾ÑпÑавлÑÐµÑ ÑообÑение PortalSuspended; поÑвление ÑÑого ÑообÑÐµÐ½Ð¸Ñ Ð³Ð¾Ð²Ð¾ÑÐ¸Ñ ÐºÐ»Ð¸ÐµÐ½ÑÑ Ð¾ Ñом, ÑÑо Ð´Ð»Ñ Ð·Ð°Ð²ÐµÑÑÐµÐ½Ð¸Ñ Ð¾Ð¿ÐµÑаÑии Ñ Ð´Ð°Ð½Ð½Ñм поÑÑалом нÑжно вÑдаÑÑ ÐµÑÑ Ð¾Ð´Ð½Ð¾ ÑообÑение Execute. СообÑение CommandComplete, говоÑÑÑее о завеÑÑении иÑÑ Ð¾Ð´Ð½Ð¾Ð¹ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ SQL, не пеÑедаÑÑÑÑ Ð´Ð¾ завеÑÑÐµÐ½Ð¸Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¿Ð¾ÑÑала. Таким обÑазом, Ñаза Execute вÑегда заканÑиваеÑÑÑ Ð¿Ñи поÑвлении одного из ÑообÑений: CommandComplete, EmptyQueryResponse (еÑли поÑÑал бÑл Ñоздан из пÑÑÑой ÑÑÑоки запÑоÑа), ErrorResponse или PortalSuspended.
РконÑе каждой ÑеÑии ÑообÑений ÑаÑÑиÑенного пÑоÑокола запÑоÑов ÐºÐ»Ð¸ÐµÐ½Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ вÑдаÑÑ ÑообÑение Sync. ÐолÑÑив ÑÑо ÑообÑение без паÑамеÑÑов, ÑеÑÐ²ÐµÑ Ð·Ð°ÐºÑÑÐ²Ð°ÐµÑ ÑекÑÑÑÑ ÑÑанзакÑиÑ, еÑли ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ Ð²ÑполнÑÑÑÑÑ Ð½Ðµ внÑÑÑи блока ÑÑанзакÑии BEGIN/COMMIT (под «закÑÑÑием» понимаеÑÑÑ ÑикÑаÑÐ¸Ñ Ð¿Ñи оÑÑÑÑÑÑвии оÑибок или оÑÐºÐ°Ñ Ð² пÑоÑивном ÑлÑÑае). ÐаÑем он вÑдаÑÑ Ð¾ÑÐ²ÐµÑ ReadyForQuery. ЦелÑÑ ÑообÑÐµÐ½Ð¸Ñ Sync ÑвлÑеÑÑÑ Ð¾Ð±Ð¾Ð·Ð½Ð°Ñение ÑоÑки ÑинÑ
ÑонизаÑии Ð´Ð»Ñ Ð²Ð¾ÑÑÑÐ°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð² ÑлÑÑае оÑибок. ÐÑли пÑи обÑабоÑке ÑообÑений ÑаÑÑиÑенного пÑоÑокола запÑоÑов пÑоиÑÑ
Ð¾Ð´Ð¸Ñ Ð¾Ñибка, ÑеÑÐ²ÐµÑ Ð²ÑдаÑÑ ErrorResponse, заÑем ÑÑиÑÑÐ²Ð°ÐµÑ Ð¸ пÑопÑÑÐºÐ°ÐµÑ ÑообÑÐµÐ½Ð¸Ñ Ð´Ð¾ Sync, поÑле Ñего вÑдаÑÑ ReadyForQuery и возвÑаÑаеÑÑÑ Ðº обÑÑной обÑабоÑке ÑообÑений. (Ðо замеÑÑÑе, ÑÑо он не бÑÐ´ÐµÑ Ð¿ÑопÑÑкаÑÑ ÑледÑÑÑие ÑообÑениÑ, еÑли оÑибка пÑоиÑÑ
Ð¾Ð´Ð¸Ñ Ð² пÑоÑеÑÑе обÑабоÑки Sync â ÑÑо гаÑанÑиÑÑеÑ, ÑÑо Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ Sync бÑÐ´ÐµÑ Ð¿ÐµÑедаваÑÑÑÑ Ð² ÑоÑноÑÑи одно ÑообÑение ReadyForQuery.)
ÐÑимеÑание
СообÑение Sync не пÑÐ¸Ð²Ð¾Ð´Ð¸Ñ Ðº закÑÑÑÐ¸Ñ Ð±Ð»Ð¾ÐºÐ° ÑÑанзакÑии, оÑкÑÑÑого командой BEGIN. ÐÑÑвиÑÑ ÑÑÑ ÑиÑÑаÑÐ¸Ñ Ð¼Ð¾Ð¶Ð½Ð¾, иÑполÑзÑÑ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¾ ÑоÑÑоÑнии ÑÑанзакÑии, ÑодеÑжаÑÑÑÑÑ Ð² ÑообÑении ReadyForQuery.
Рдополнение к ÑÑим ÑÑндаменÑалÑнÑм и обÑзаÑелÑнÑм опеÑаÑиÑм, ÑаÑÑиÑеннÑй пÑоÑокол запÑоÑов позволÑÐµÑ Ð²ÑполниÑÑ Ð¸ неÑколÑко дополниÑелÑнÑÑ Ð¾Ð¿ÐµÑаÑий.
Ð ÑообÑении Describe (в ваÑиаÑии Ð´Ð»Ñ Ð¿Ð¾ÑÑала) задаÑÑÑÑ Ð¸Ð¼Ñ ÑÑÑеÑÑвÑÑÑего поÑÑала (пÑÑÑÐ°Ñ ÑÑÑока обознаÑÐ°ÐµÑ Ð±ÐµÐ·ÑмÑннÑй поÑÑал). РоÑÐ²ÐµÑ Ð¿ÐµÑедаÑÑÑÑ ÑообÑение RowDescription, опиÑÑваÑÑее ÑÑÑоки, коÑоÑÑе бÑдÑÑ Ð²Ð¾Ð·Ð²ÑаÑÐµÐ½Ñ Ð¿Ñи вÑполнении поÑÑала; либо ÑообÑение NoData, еÑли поÑÑал не ÑодеÑÐ¶Ð¸Ñ Ð·Ð°Ð¿ÑоÑа, возвÑаÑаÑÑего ÑÑÑоки; либо ErrorResponse, еÑли Ñакого поÑÑала неÑ.
Ð ÑообÑении Describe (в ваÑиаÑии Ð´Ð»Ñ Ð¾Ð¿ÐµÑаÑоÑа) задаÑÑÑÑ Ð¸Ð¼Ñ ÑÑÑеÑÑвÑÑÑего подгоÑовленного опеÑаÑоÑа (пÑÑÑÐ°Ñ ÑÑÑока обознаÑÐ°ÐµÑ Ð±ÐµÐ·ÑмÑннÑй подгоÑовленнÑй опеÑаÑоÑ). РоÑÐ²ÐµÑ Ð¿ÐµÑедаÑÑÑÑ ÑообÑение ParameterDescription, опиÑÑваÑÑее паÑамеÑÑÑ, ÑÑебÑÑÑиеÑÑ Ð´Ð»Ñ Ð¾Ð¿ÐµÑаÑоÑа, за коÑоÑÑм ÑледÑÐµÑ ÑообÑение RowDescription, опиÑÑваÑÑее ÑÑÑоки, коÑоÑÑе бÑдÑÑ Ð²Ð¾Ð·Ð²ÑаÑенÑ, когда опеÑаÑÐ¾Ñ Ð±ÑÐ´ÐµÑ ÑобÑÑвенно вÑполнен (или ÑообÑение NoData, еÑли опеÑаÑÐ¾Ñ Ð½Ðµ возвÑаÑÐ¸Ñ ÑÑÑоки). ErrorResponse вÑдаÑÑÑÑ, еÑли Ñакой подгоÑовленнÑй опеÑаÑÐ¾Ñ Ð¾ÑÑÑÑÑÑвÑеÑ. ÐамеÑÑÑе, ÑÑо Ñак как команда Bind не вÑполнÑлаÑÑ, ÑеÑÐ²ÐµÑ ÐµÑÑ Ð½Ðµ знаеÑ, в каком ÑоÑмаÑе бÑдÑÑ Ð²Ð¾Ð·Ð²ÑаÑаÑÑÑÑ ÑÑолбÑÑ; в ÑÑом ÑлÑÑае Ð¿Ð¾Ð»Ñ ÐºÐ¾Ð´Ð¾Ð² ÑоÑмаÑа в ÑообÑении RowDescription бÑдÑÑ ÑодеÑжаÑÑ Ð½Ñли.
ÐодÑказка
РболÑÑинÑÑве ÑлÑÑаев ÐºÐ»Ð¸ÐµÐ½Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ вÑдаÑÑ ÑÑ Ð¸Ð»Ð¸ инÑÑ Ð²Ð°ÑиаÑÐ¸Ñ Describe, пÑежде Ñем вÑдаваÑÑ Execute, ÑÑÐ¾Ð±Ñ Ð¿Ð¾Ð½ÑÑÑ, как инÑеÑпÑеÑиÑоваÑÑ ÑезÑлÑÑаÑÑ, коÑоÑÑе он полÑÑиÑ.
СообÑение Close закÑÑÐ²Ð°ÐµÑ ÑÑÑеÑÑвÑÑÑий подгоÑовленнÑй опеÑаÑÐ¾Ñ Ð¸Ð»Ð¸ поÑÑал и оÑÐ²Ð¾Ð±Ð¾Ð¶Ð´Ð°ÐµÑ ÑвÑзаннÑе ÑеÑÑÑÑÑ. ÐÑи попÑÑке вÑполниÑÑ Close Ð´Ð»Ñ Ð¸Ð¼ÐµÐ½Ð¸ неÑÑÑеÑÑвÑÑÑего поÑÑала или опеÑаÑоÑа оÑибки не бÑдеÑ. ÐÑÐ²ÐµÑ Ð½Ð° ÑÑо ÑообÑение обÑÑно CloseComplete, но Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¸ ErrorResponse, еÑли пÑи оÑвобождении ÑеÑÑÑÑов возникаÑÑ Ð¿ÑоблемÑ. ÐамеÑÑÑе, ÑÑо пÑи закÑÑÑии подгоÑовленного опеÑаÑоÑа неÑвно закÑÑваÑÑÑÑ Ð²Ñе оÑкÑÑÑÑе поÑÑалÑ, коÑоÑÑе бÑли полÑÑÐµÐ½Ñ Ð¸Ð· ÑÑого опеÑаÑоÑа.
СообÑение Flush не пÑÐ¸Ð²Ð¾Ð´Ð¸Ñ Ðº генеÑаÑии ÐºÐ°ÐºÐ¸Ñ -либо даннÑÑ , а ÑказÑÐ²Ð°ÐµÑ ÑеÑвеÑÑ Ð¿ÐµÑедаÑÑ Ð²Ñе даннÑе, Ð½Ð°Ñ Ð¾Ð´ÑÑиеÑÑ Ð² оÑеÑеди в его бÑÑеÑÐ°Ñ Ð²Ñвода. СообÑение Flush ÐºÐ»Ð¸ÐµÐ½Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ оÑпÑавлÑÑÑ Ð¿Ð¾Ñле лÑбой ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ ÑаÑÑиÑенного пÑоÑокола запÑоÑов, кÑоме Sync, еÑли он Ð¶ÐµÐ»Ð°ÐµÑ Ð¿ÑоанализиÑоваÑÑ ÑезÑлÑÑаÑÑ ÑÑой командÑ, пÑежде Ñем вÑдаваÑÑ ÑледÑÑÑие командÑ. Ðез Flush ÑообÑениÑ, возвÑаÑаемÑе ÑеÑвеÑом, бÑдÑÑ Ð¾Ð±ÑединÑÑÑÑÑ Ð²Ð¼ÐµÑÑе в минималÑное колиÑеÑÑво пакеÑов Ñ ÑелÑÑ ÑменÑÑÐµÐ½Ð¸Ñ ÑеÑевого ÑÑаÑика.
ÐÑимеÑание
ÐÑоÑÑое ÑообÑение Query пÑимеÑно ÑавнознаÑно поÑледоваÑелÑноÑÑи ÑообÑений Parse, Bind, Describe (Ð´Ð»Ñ Ð¿Ð¾ÑÑала), Execute, Close, Sync, Ñ Ð¸ÑполÑзованием обÑекÑов подгоÑовленного опеÑаÑоÑа и поÑÑала без имÑн и без паÑамеÑÑов. Ðдно из оÑлиÑий ÑоÑÑÐ¾Ð¸Ñ Ð² Ñом, ÑÑо Ñакое ÑообÑение Ð¼Ð¾Ð¶ÐµÑ ÑодеÑжаÑÑ Ð² ÑÑÑоке запÑоÑа неÑколÑко опеÑаÑоÑов SQL, Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ из коÑоÑÑÑ Ð¿Ð¾ оÑеÑеди авÑомаÑиÑеÑки вÑполнÑеÑÑÑ Ð¿Ð¾ÑледоваÑелÑноÑÑÑ Bind/Describe/Execute. ÐÑÑгое оÑлиÑие заклÑÑаеÑÑÑ Ð² Ñом, ÑÑо в оÑÐ²ÐµÑ Ð½Ð° него не пÑÐ¸Ñ Ð¾Ð´ÑÑ ÑообÑÐµÐ½Ð¸Ñ ParseComplete, BindComplete, CloseComplete или NoData.
54.2.4. ÐонвейеÑизаÑÐ¸Ñ #
РаÑÑиÑеннÑй пÑоÑокол запÑоÑов позволÑÐµÑ Ð¸ÑполÑзоваÑÑ ÐºÐ¾Ð½Ð²ÐµÐ¹ÐµÑизаÑиÑ, Ñо еÑÑÑ Ð¾ÑпÑавлÑÑÑ ÑеÑÐ¸Ñ Ð·Ð°Ð¿ÑоÑов, не Ð¾Ð¶Ð¸Ð´Ð°Ñ Ð·Ð°Ð²ÐµÑÑÐµÐ½Ð¸Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ пÑедÑдÑÑего. ÐÑи ÑÑом ÑменÑÑаеÑÑÑ ÐºÐ¾Ð»Ð¸ÑеÑÑво ÑеÑевÑÑ Ð¾Ð¿ÐµÑаÑий, Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼ÑÑ Ð´Ð»Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð´Ð°Ð½Ð½Ð¾Ð¹ поÑледоваÑелÑноÑÑи запÑоÑов. Ðднако полÑзоваÑÐµÐ»Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ ÑÑаÑелÑно пÑодÑмÑваÑÑ Ð¿Ð¾Ð²ÐµÐ´ÐµÐ½Ð¸Ðµ в ÑлÑÑае ÑÐ±Ð¾Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ из Ñагов, поÑколÑÐºÑ Ð¿Ð¾ÑледÑÑÑие запÑоÑÑ Ñже бÑдÑÑ Ð¾ÑпÑÐ°Ð²Ð»ÐµÐ½Ñ Ð½Ð° ÑеÑвеÑ.
ÐапÑимеÑ, можно обÑединиÑÑ Ð²ÑÑ Ð¿Ð¾ÑледоваÑелÑноÑÑÑ Ð·Ð°Ð¿ÑоÑов в Ð¾Ð´Ð½Ñ ÑÑанзакÑиÑ, заклÑÑив ÐµÑ Ð² BEGIN ... COMMIT. Ðднако еÑли какие-Ñо ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð²ÑполнÑÑÑÑÑ Ð½ÐµÐ·Ð°Ð²Ð¸Ñимо Ð¾Ñ Ð¾ÑÑалÑнÑÑ
, ÑÑÐ¾Ñ ÑпоÑоб не подÑ
одиÑ.
РаÑÑиÑеннÑй пÑоÑокол запÑоÑов позволÑÐµÑ ÑеализоваÑÑ Ð¿Ð¾Ð²ÐµÐ´ÐµÐ½Ð¸Ðµ в ÑлÑÑае оÑибки по-дÑÑгомÑ, иÑклÑÑив пеÑедаÑÑ ÑообÑений Sync Ð¼ÐµÐ¶Ð´Ñ Ð·Ð°Ð²Ð¸ÑимÑми Ñагами. ÐоÑколÑÐºÑ Ð¿Ð¾Ñле оÑибки ÑеÑÐ²ÐµÑ Ð¿ÑопÑÑÐºÐ°ÐµÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð½Ñе ÑообÑÐµÐ½Ð¸Ñ Ð´Ð¾ ÑеÑ
поÑ, пока не полÑÑÐ¸Ñ Sync, более поздние ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ Ð² конвейеÑе авÑомаÑиÑеÑки пÑопÑÑкаÑÑÑÑ Ð¿Ñи Ñбое более Ñанней, пÑи ÑÑом клиенÑÑ Ð½Ðµ нÑжно Ñвно ÑпÑавлÑÑÑ ÑÑим Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ BEGIN и COMMIT. СегменÑÑ ÐºÐ¾Ð½Ð²ÐµÐ¹ÐµÑа, ÑикÑиÑÑемÑе незавиÑимо, можно ÑазделÑÑÑ ÑообÑениÑми Sync.
ÐÑли ÐºÐ»Ð¸ÐµÐ½Ñ Ð½Ðµ пеÑедаÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ BEGIN Ñвно, Ñо каждое ÑообÑение Sync обÑÑно вÑзÑÐ²Ð°ÐµÑ Ð½ÐµÑвное вÑполнение COMMIT в ÑлÑÑае ÑÑпеÑного завеÑÑÐµÐ½Ð¸Ñ Ð¿ÑедÑдÑÑиÑ
Ñагов или ROLLBACK в ÑлÑÑае ÑбоÑ. Ðднако еÑÑÑ Ð½ÐµÑколÑко команд DDL (напÑимеÑ, CREATE DATABASE), коÑоÑÑе нелÑÐ·Ñ Ð²ÑполниÑÑ Ð²Ð½ÑÑÑи блока ÑÑанзакÑии. ÐÑли ÑÐ°ÐºÐ°Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð° вÑполнÑеÑÑÑ Ð² конвейеÑе, она ÑÑпеÑно вÑполниÑÑÑ, ÑолÑко еÑли бÑÐ´ÐµÑ Ð¿ÐµÑвой. ÐÑоме Ñого, в ÑлÑÑае ÑÑпеÑного вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¾Ð½Ð° вÑÐ·Ð¾Ð²ÐµÑ Ð½ÐµÐ¼ÐµÐ´Ð»ÐµÐ½Ð½ÑÑ ÑикÑаÑÐ¸Ñ Ð´Ð»Ñ ÑоÑ
ÑÐ°Ð½ÐµÐ½Ð¸Ñ ÑоглаÑованноÑÑи Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
. Таким обÑазом, еÑли ÑÑÐ°Ð·Ñ Ð·Ð° ней оÑпÑавиÑÑ Sync, никакиÑ
дополниÑелÑнÑÑ
дейÑÑвий ÑÑо ÑообÑение не вÑзовеÑ, кÑоме оÑвеÑа ReadyForQuery.
ÐÑименÑÑ ÑÑÐ¾Ñ Ð¼ÐµÑод, ÑÐ°ÐºÑ Ð·Ð°Ð²ÐµÑÑÐµÐ½Ð¸Ñ ÐºÐ¾Ð½Ð²ÐµÐ¹ÐµÑа нÑжно опÑеделÑÑÑ, подÑÑиÑÑÐ²Ð°Ñ ÑообÑÐµÐ½Ð¸Ñ ReadyForQuery и Ð¾Ð¶Ð¸Ð´Ð°Ñ Ð´Ð¾ÑÑÐ¸Ð¶ÐµÐ½Ð¸Ñ ÐºÐ¾Ð»Ð¸ÑеÑÑва оÑпÑавленнÑÑ ÑообÑений Sync. ÐаÑÐ¸Ð°Ð½Ñ Ñ Ð¿Ð¾Ð´ÑÑÑÑом ÑообÑений о завеÑÑении команд ненадÑжен, Ñак как некоÑоÑÑе ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ Ð¼Ð¾Ð³ÑÑ Ð¿ÑопÑÑкаÑÑÑÑ, Ñак ÑÑо Ñакие ÑообÑÐµÐ½Ð¸Ñ Ð²ÑдаваÑÑÑÑ Ð½Ðµ бÑдÑÑ.
54.2.5. ÐÑзов ÑÑнкÑий #
Раздел пÑоÑокола «ÐÑзов ÑÑнкÑий» позволÑÐµÑ ÐºÐ»Ð¸ÐµÐ½ÑÑ Ð·Ð°Ð¿ÑоÑиÑÑ Ð½ÐµÐ¿Ð¾ÑÑедÑÑвеннÑй вÑзов лÑбой ÑÑнкÑии, ÑÑÑеÑÑвÑÑÑей в ÑиÑÑемном каÑалоге pg_proc. ÐÑи ÑÑом ÐºÐ»Ð¸ÐµÐ½Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ имеÑÑ Ð¿Ñаво на вÑполнение ÑÑой ÑÑнкÑии.
ÐÑимеÑание
ÐÑÐ¾Ñ Ñаздел пÑоÑокола ÑÑиÑаеÑÑÑ ÑÑÑаÑевÑим и в новом коде иÑполÑзоваÑÑ ÐµÐ³Ð¾ не ÑледÑеÑ. ÐÑимеÑно ÑÐ¾Ñ Ð¶Ðµ ÑезÑлÑÑÐ°Ñ Ð¼Ð¾Ð¶Ð½Ð¾ полÑÑиÑÑ, подгоÑовив опеÑаÑÐ¾Ñ Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¾Ð¹ SELECT function($1, ...). ÐÑи Ñаком подÑ
оде Ñикл вÑзова ÑÑнкÑии заменÑеÑÑÑ Ð¿Ð¾ÑледоваÑелÑноÑÑÑÑ Bind/Execute.
Цикл вÑзова ÑÑнкÑии наÑÐ¸Ð½Ð°ÐµÑ ÐºÐ»Ð¸ÐµÐ½Ñ, пеÑÐµÐ´Ð°Ð²Ð°Ñ ÑеÑвеÑÑ ÑообÑение FunctionCall. СеÑÐ²ÐµÑ Ð²Ð¾Ð·Ð²ÑаÑÐ°ÐµÑ Ð¾Ð´Ð½Ð¾ или неÑколÑко ÑообÑений оÑвеÑа, в завиÑимоÑÑи Ð¾Ñ ÑезÑлÑÑаÑа вÑзова ÑÑнкÑии, и завеÑÑаÑÑее ÑообÑение ReadyForQuery. ReadyForQuery говоÑÐ¸Ñ ÐºÐ»Ð¸ÐµÐ½ÑÑ, ÑÑо он Ð¼Ð¾Ð¶ÐµÑ Ñвободно пеÑедаваÑÑ Ð½Ð¾Ð²Ñй запÑÐ¾Ñ Ð¸Ð»Ð¸ вÑзов ÑÑнкÑии.
СеÑÐ²ÐµÑ Ð¼Ð¾Ð¶ÐµÑ Ð¿ÐµÑедаваÑÑ Ð² ÑÑой Ñазе ÑледÑÑÑие оÑвеÑнÑе ÑообÑениÑ:
- ErrorResponse (ÐÑибоÑнÑй оÑвеÑ)
ÐÑоизоÑла оÑибка.
- FunctionCallResponse (ÐÑÐ²ÐµÑ Ð½Ð° вÑзов ÑÑнкÑии)
ÐÑзов ÑÑнкÑии завеÑÑÑн и в ÑÑом ÑообÑении пеÑедаÑÑÑÑ ÐµÑ ÑезÑлÑÑаÑ. (ÐамеÑÑÑе, ÑÑо пÑоÑокол вÑзова ÑÑнкÑий позволÑÐµÑ Ð²ÑдаÑÑ ÑолÑко один ÑкалÑÑнÑй ÑезÑлÑÑаÑ, но не коÑÑеж или Ð½Ð°Ð±Ð¾Ñ ÑезÑлÑÑаÑов.)
- ReadyForQuery (ÐоÑов к запÑоÑам)
ÐбÑабоÑка вÑзова ÑÑнкÑии завеÑÑена. РоÑÐ²ÐµÑ Ð²Ñегда пеÑедаÑÑÑÑ ReadyForQuery, незавиÑимо Ð¾Ñ Ñого, бÑла ли ÑÑнкÑÐ¸Ñ Ð²Ñполнена ÑÑпеÑно или Ñ Ð¾Ñибкой.
- NoticeResponse (ÐÑÐ²ÐµÑ Ñ Ð·Ð°Ð¼ÐµÑанием)
ÐÑдаÑÑÑÑ Ð¿ÑедÑпÑеждение, ÑвÑзанное Ñ Ð²Ñзовом ÑÑнкÑии. ÐÑи замеÑÐ°Ð½Ð¸Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½ÑÑÑ Ð´ÑÑгие оÑвеÑÑ, Ñо еÑÑÑ ÑеÑвеÑ, вÑÐ´Ð°Ð²Ð°Ñ Ð¸Ñ , пÑÐ¾Ð´Ð¾Ð»Ð¶Ð°ÐµÑ Ð¾Ð±ÑабаÑÑваÑÑ Ð²Ñзов.
54.2.6. ÐпеÑаÑии COPY #
Ðоманда COPY позволÑÐµÑ Ð¾Ð±ÐµÑпеÑиÑÑ ÑкоÑоÑÑнÑÑ Ð¿ÐµÑедаÑÑ Ð´Ð°Ð½Ð½ÑÑ
на ÑеÑÐ²ÐµÑ Ð¸Ð»Ð¸ Ñ ÑеÑвеÑа. ÐпеÑаÑии вÑ
одÑÑего и иÑÑ
одÑÑего копиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¿ÐµÑеклÑÑаÑÑ Ñоединение на иÑполÑзование оÑделÑного Ñаздела пÑоÑокола, коÑоÑое завеÑÑаеÑÑÑ ÑолÑко в конÑе опеÑаÑии.
Режим вÑ
одÑÑего копиÑÐ¾Ð²Ð°Ð½Ð¸Ñ (пеÑедаÑа даннÑÑ
на ÑеÑвеÑ) вклÑÑаеÑÑÑ, когда ÐºÐ»Ð¸ÐµÐ½Ñ Ð²ÑполнÑÐµÑ SQL-опеÑаÑÐ¾Ñ COPY FROM STDIN. ÐеÑеÑ
Ð¾Ð´Ñ Ð² ÑÑÐ¾Ñ Ñежим, ÑеÑÐ²ÐµÑ Ð¿ÐµÑедаÑÑ ÐºÐ»Ð¸ÐµÐ½ÑÑ ÑообÑение CopyInResponse. ÐоÑле ÑÑого ÐºÐ»Ð¸ÐµÐ½Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ пеÑедаÑÑ Ð½Ð¾Ð»Ñ Ð¸Ð»Ð¸ более ÑообÑений CopyData, обÑазÑÑÑиÑ
поÑок вÑ
однÑÑ
даннÑÑ
. (ÐÑи ÑÑом гÑаниÑÑ ÑообÑений не обÑзаÑелÑно Ð´Ð¾Ð»Ð¶Ð½Ñ ÑовпадаÑÑ Ñ Ð³ÑаниÑами ÑÑÑок даннÑÑ
, Ñ
оÑÑ ÑаÑÑо Ð¸Ð¼ÐµÐµÑ ÑмÑÑл вÑÑовнÑÑÑ Ð¸Ñ
.) ÐÐ»Ð¸ÐµÐ½Ñ Ð¼Ð¾Ð¶ÐµÑ Ð·Ð°Ð²ÐµÑÑиÑÑ Ñежим вÑ
одÑÑего копиÑованиÑ, пеÑедав либо ÑообÑение CopyDone (говоÑÑÑее об ÑÑпеÑном завеÑÑении), либо CopyFail (коÑоÑое пÑиведÑÑ Ðº завеÑÑÐµÐ½Ð¸Ñ SQL-опеÑаÑоÑа COPY Ñ Ð¾Ñибкой). ÐÑи ÑÑом ÑеÑÐ²ÐµÑ Ð²ÐµÑнÑÑÑÑ Ð² обÑÑнÑй Ñежим обÑабоÑки, в коÑоÑом он наÑ
одилÑÑ Ð´Ð¾ вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ COPY (ÑÑо Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿ÑоÑÑой или ÑаÑÑиÑеннÑй пÑоÑокол запÑоÑов). ÐаÑем он оÑпÑÐ°Ð²Ð¸Ñ ÑообÑение CommandComplete (в ÑлÑÑае ÑÑпеÑного завеÑÑениÑ) или ErrorResponse (в пÑоÑивном ÑлÑÑае).
Ð ÑлÑÑае Ð²Ð¾Ð·Ð½Ð¸ÐºÐ½Ð¾Ð²ÐµÐ½Ð¸Ñ Ð¾Ñибки в Ñежиме вÑ
одÑÑего копиÑÐ¾Ð²Ð°Ð½Ð¸Ñ (вклÑÑÐ°Ñ Ð¿Ð¾Ð»ÑÑение ÑообÑÐµÐ½Ð¸Ñ CopyFail), ÑеÑÐ²ÐµÑ Ð²ÑдаÑÑ ÑообÑение ErrorResponse. ÐÑли команда COPY бÑла полÑÑена в ÑообÑении ÑаÑÑиÑенного запÑоÑа, ÑеÑÐ²ÐµÑ Ð½Ðµ бÑÐ´ÐµÑ Ð¾Ð±ÑабаÑÑваÑÑ Ð¿Ð¾ÑледÑÑÑие ÑообÑÐµÐ½Ð¸Ñ ÐºÐ»Ð¸ÐµÐ½Ñа, пока не полÑÑÐ¸Ñ ÑообÑение Sync, поÑле коÑоÑого он вÑдаÑÑ ReadyForQuery и веÑнÑÑÑÑ Ð² обÑÑнÑй Ñежим ÑабоÑÑ. ÐÑли команда COPY бÑла полÑÑена в ÑообÑении пÑоÑÑого запÑоÑа, оÑÑалÑÐ½Ð°Ñ ÑаÑÑÑ ÑообÑÐµÐ½Ð¸Ñ Ð¸Ð³Ð½Ð¾ÑиÑÑеÑÑÑ Ð¸ ÑÑÐ°Ð·Ñ Ð²ÑдаÑÑÑÑ ReadyForQuery. РлÑбом ÑлÑÑае вÑе поÑледÑÑÑие ÑообÑÐµÐ½Ð¸Ñ CopyData, CopyDone или CopyFail, поÑÑÑпаÑÑие Ð¾Ñ ÐºÐ»Ð¸ÐµÐ½Ñа, бÑдÑÑ Ð¿ÑоÑÑо игноÑиÑоваÑÑÑÑ.
Ð Ñежиме вÑ
одÑÑего копиÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÑеÑÐ²ÐµÑ Ð¸Ð³Ð½Ð¾ÑиÑÑÐµÑ Ð¿Ð¾ÑÑÑпаÑÑие ÑообÑÐµÐ½Ð¸Ñ Flush и Sync. ÐÑи поÑÑÑплении ÑообÑений лÑбого дÑÑгого Ñипа, не ÑвÑзанного Ñ ÐºÐ¾Ð¿Ð¸Ñованием, Ð²Ð¾Ð·Ð½Ð¸ÐºÐ°ÐµÑ Ð¾Ñибка, пÑиводÑÑÐ°Ñ Ðº пÑеÑÑÐ²Ð°Ð½Ð¸Ñ Ñежима вÑ
одÑÑего копиÑованиÑ, как опиÑано вÑÑе. (ÐÑклÑÑение Ð´Ð»Ñ ÑообÑений Flush и Sync Ñделано Ð´Ð»Ñ ÑдобÑÑва клиенÑÑкиÑ
библиоÑек, коÑоÑÑе вÑегда пеÑедаÑÑ Flush или Sync поÑле ÑообÑÐµÐ½Ð¸Ñ Execute, не пÑовеÑÑÑ, не запÑÑкаеÑÑÑ Ð»Ð¸ в нÑм команда COPY FROM STDIN.)
Режим иÑÑ
одÑÑего копиÑÐ¾Ð²Ð°Ð½Ð¸Ñ (пеÑедаÑа даннÑÑ
Ñ ÑеÑвеÑа) вклÑÑаеÑÑÑ, когда ÐºÐ»Ð¸ÐµÐ½Ñ Ð²ÑполнÑÐµÑ SQL-опеÑаÑÐ¾Ñ COPY TO STDOUT. ÐеÑеÑ
Ð¾Ð´Ñ Ð² ÑÑÐ¾Ñ Ñежим, ÑеÑÐ²ÐµÑ Ð¿ÐµÑедаÑÑ ÐºÐ»Ð¸ÐµÐ½ÑÑ ÑообÑение CopyOutResponse, за ним Ð½Ð¾Ð»Ñ Ð¸Ð»Ð¸ более ÑообÑений CopyData (вÑегда одно ÑообÑение Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ ÑÑÑоки) и в завеÑÑение CopyDone. ÐаÑем ÑеÑÐ²ÐµÑ Ð²Ð¾Ð·Ð²ÑаÑаеÑÑÑ Ð² обÑÑнÑй Ñежим обÑабоÑки, в коÑоÑом он наÑ
одилÑÑ Ð´Ð¾ вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ COPY, и пеÑедаÑÑ CommandComplete. ÐÐ»Ð¸ÐµÐ½Ñ Ð½Ðµ Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑеÑваÑÑ Ð¿ÐµÑедаÑÑ (кÑоме как закÑÑв Ñоединение или вÑдав запÑÐ¾Ñ Cancel), но он Ð¼Ð¾Ð¶ÐµÑ Ð¸Ð³Ð½Ð¾ÑиÑоваÑÑ Ð½ÐµÐ½ÑжнÑе ÐµÐ¼Ñ ÑообÑÐµÐ½Ð¸Ñ CopyData и CopyDone.
Ð ÑлÑÑае обнаÑÑÐ¶ÐµÐ½Ð¸Ñ Ð¾Ñибки в Ñежиме иÑÑ Ð¾Ð´ÑÑего копиÑованиÑ, ÑеÑÐ²ÐµÑ Ð²ÑдаÑÑ ÑообÑение ErrorResponse и возвÑаÑаеÑÑÑ Ðº обÑÑной обÑабоÑке. ÐÐ»Ð¸ÐµÐ½Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ воÑпÑинимаÑÑ Ð¿Ð¾ÑÑÑпление ErrorResponse как завеÑÑение Ñежима иÑÑ Ð¾Ð´ÑÑего копиÑованиÑ.
ÐÐµÐ¶Ð´Ñ ÑообÑениÑми CopyData могÑÑ Ð¿Ð¾ÑÑÑпаÑÑ ÑообÑÐµÐ½Ð¸Ñ NoticeResponse и ParameterStatus; клиенÑÑ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¾Ð±ÑабаÑÑваÑÑ Ð¸Ñ Ð¸ бÑÑÑ Ð³Ð¾ÑÐ¾Ð²Ñ Ð¿ÑинимаÑÑ Ð¸ дÑÑгие ÑÐ¸Ð¿Ñ Ð°ÑÐ¸Ð½Ñ ÑоннÑÑ ÑообÑений (Ñм. ÐодÑаздел 54.2.7). РоÑÑалÑном, ÑообÑÐµÐ½Ð¸Ñ Ð»ÑбÑÑ Ñипов, кÑоме CopyData и CopyDone, могÑÑ Ð²Ð¾ÑпÑинимаÑÑÑÑ ÐºÐ°Ðº завеÑÑаÑÑие Ñежим иÑÑ Ð¾Ð´ÑÑего копиÑованиÑ.
ÐÑÑÑ ÐµÑÑ Ð¾Ð´Ð¸Ð½ Ñежим копиÑованиÑ, назÑваемÑй двÑÑÑоÑонним копиÑованием и обеÑпеÑиваÑÑий вÑÑокоÑкоÑоÑÑнÑÑ Ð¿ÐµÑедаÑÑ Ð´Ð°Ð½Ð½ÑÑ
на и Ñ ÑеÑвеÑа. ÐвÑÑÑоÑоннее копиÑование запÑÑкаеÑÑÑ, когда ÐºÐ»Ð¸ÐµÐ½Ñ Ð² Ñежиме walsender вÑполнÑÐµÑ Ð¾Ð¿ÐµÑаÑÐ¾Ñ START_REPLICATION. РоÑÐ²ÐµÑ ÑеÑÐ²ÐµÑ Ð¿ÐµÑедаÑÑ ÐºÐ»Ð¸ÐµÐ½ÑÑ ÑообÑение CopyBothResponse. ÐаÑем и ÑеÑвеÑ, и ÐºÐ»Ð¸ÐµÐ½Ñ Ð¼Ð¾Ð³ÑÑ Ð¿ÐµÑедаваÑÑ Ð´ÑÑг дÑÑÐ³Ñ ÑообÑÐµÐ½Ð¸Ñ CopyData, пока кÑо-Ñо из ниÑ
не завеÑÑÐ¸Ñ Ð¿ÐµÑедаÑÑ ÑообÑением CopyDone. Ðогда ÑообÑение CopyDone пеÑедаÑÑ ÐºÐ»Ð¸ÐµÐ½Ñ, Ñоединение пеÑеÑ
Ð¾Ð´Ð¸Ñ Ð¸Ð· Ñежима двÑÑÑоÑоннего в Ñежим иÑÑ
одÑÑего копиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¸ ÐºÐ»Ð¸ÐµÐ½Ñ Ð±Ð¾Ð»ÑÑе не Ð¼Ð¾Ð¶ÐµÑ Ð¿ÐµÑедаваÑÑ ÑообÑÐµÐ½Ð¸Ñ CopyData. ÐналогиÑно, когда ÑообÑение CopyDone пеÑедаÑÑ ÑеÑвеÑ, Ñоединение пеÑеÑ
Ð¾Ð´Ð¸Ñ Ð² Ñежим вÑ
одÑÑего копиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¸ ÑеÑÐ²ÐµÑ Ð±Ð¾Ð»ÑÑе не Ð¼Ð¾Ð¶ÐµÑ Ð¿ÐµÑедаваÑÑ ÑообÑÐµÐ½Ð¸Ñ CopyData. Ðогда ÑообÑÐµÐ½Ð¸Ñ CopyDone пеÑÐµÐ´Ð°Ð½Ñ Ð¾Ð±ÐµÐ¸Ð¼Ð¸ ÑÑоÑонами, Ñежим копиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð·Ð°Ð²ÐµÑÑаеÑÑÑ Ð¸ ÑеÑÐ²ÐµÑ Ð²Ð¾Ð·Ð²ÑаÑаеÑÑÑ Ð² Ñежим обÑабоÑки команд. Ð ÑлÑÑае обнаÑÑÐ¶ÐµÐ½Ð¸Ñ Ð¾Ñибки на ÑÑоÑоне ÑеÑвеÑа в Ñежиме двÑÑÑоÑоннего копиÑованиÑ, ÑеÑÐ²ÐµÑ Ð²ÑдаÑÑ ÑообÑение ErrorResponse, пÑопÑÑÐºÐ°ÐµÑ ÑледÑÑÑие ÑообÑÐµÐ½Ð¸Ñ ÐºÐ»Ð¸ÐµÐ½Ñа, пока не бÑÐ´ÐµÑ Ð¿Ð¾Ð»ÑÑено ÑообÑение Sync, а заÑем вÑдаÑÑ ReadyForQuery и возвÑаÑаеÑÑÑ Ðº обÑÑной обÑабоÑке. ÐÐ»Ð¸ÐµÐ½Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ воÑпÑинимаÑÑ Ð¿Ð¾Ð»ÑÑение ErrorResponse как завеÑÑение двÑÑÑоÑоннего копиÑованиÑ; в ÑÑом ÑлÑÑае ÑообÑение CopyDone поÑÑлаÑÑÑÑ Ð½Ðµ должно. Ðа дополниÑелÑной инÑоÑмаÑией о Ñазделе пÑоÑокола, ÑпÑавлÑÑÑем двÑÑÑоÑонним копиÑованием, обÑаÑиÑеÑÑ Ðº РазделÑ 54.4.
СообÑÐµÐ½Ð¸Ñ CopyInResponse, CopyOutResponse и CopyBothResponse ÑодеÑÐ¶Ð°Ñ Ð¿Ð¾Ð»Ñ, из коÑоÑÑÑ
ÐºÐ»Ð¸ÐµÐ½Ñ Ð¼Ð¾Ð¶ÐµÑ ÑзнаÑÑ ÐºÐ¾Ð»Ð¸ÑеÑÑво ÑÑолбÑов в ÑÑÑоке и код ÑоÑмаÑа Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ ÑÑолбÑа. (Ð ÑекÑÑей ÑеализаÑии Ð´Ð»Ñ Ð²ÑеÑ
ÑÑолбÑов в заданной опеÑаÑии COPY ÑÑÑанавливаеÑÑÑ Ð¾Ð´Ð¸Ð½ ÑоÑмаÑ, но в конÑÑÑÑкÑии ÑообÑÐµÐ½Ð¸Ñ ÑÑо не заложено.)
54.2.7. ÐÑÐ¸Ð½Ñ ÑоннÑе опеÑаÑии #
ÐÐ¾Ð·Ð¼Ð¾Ð¶Ð½Ñ ÑиÑÑаÑии, в коÑоÑÑÑ ÑеÑÐ²ÐµÑ Ð±ÑÐ´ÐµÑ Ð¾ÑпÑавлÑÑÑ ÐºÐ»Ð¸ÐµÐ½ÑÑ ÑообÑениÑ, не пÑедполагаемÑе поÑоком команд в ÑекÑÑем Ñежиме. ÐлиенÑÑ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ Ð³Ð¾ÑÐ¾Ð²Ñ Ð¿ÑинÑÑÑ ÑÑи ÑообÑÐµÐ½Ð¸Ñ Ð² лÑбой моменÑ, даже не в пÑоÑеÑÑе вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿ÑоÑа. Ðак минимÑм, ÑледÑÐµÑ Ð¿ÑовеÑÑÑÑ Ñакие ÑообÑениÑ, пÑежде Ñем наÑинаÑÑ ÑиÑаÑÑ Ð¾ÑÐ²ÐµÑ Ð½Ð° запÑоÑ.
СообÑÐµÐ½Ð¸Ñ NoticeResponse могÑÑ Ð²ÑдаваÑÑÑÑ Ð²ÑледÑÑвие внеÑней акÑивноÑÑи; напÑимеÑ, еÑли админиÑÑÑаÑÐ¾Ñ Ð¸Ð½Ð¸ÑииÑÑÐµÑ Â«Ð±ÑÑÑÑое» оÑклÑÑение баз даннÑÑ , ÑеÑÐ²ÐµÑ Ð¾ÑпÑÐ°Ð²Ð¸Ñ NoticeResponse, ÑигнализиÑÑÑÑее об ÑÑом ÑакÑе, пÑежде Ñем закÑÑваÑÑ Ñоединение. СооÑвеÑÑÑвенно, клиенÑÑ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ Ð³Ð¾ÑÐ¾Ð²Ñ Ð²Ñегда пÑинÑÑÑ Ð¸ вÑвеÑÑи ÑообÑÐµÐ½Ð¸Ñ NoticeResponse, даже когда Ñоединение ÑакÑиÑеÑки пÑоÑÑаиваеÑ.
СообÑÐµÐ½Ð¸Ñ ParameterStatus бÑдÑÑ Ð²ÑдаваÑÑÑÑ Ð²ÑÑкий Ñаз, когда менÑеÑÑÑ Ð´ÐµÐ¹ÑÑвÑÑÑее знаÑение одного из паÑамеÑÑов, об изменении коÑоÑÑÑ
, по Ð¼Ð½ÐµÐ½Ð¸Ñ ÑеÑвеÑа, должен знаÑÑ ÐºÐ»Ð¸ÐµÐ½Ñ. ЧаÑе вÑего ÑÑо пÑоиÑÑ
Ð¾Ð´Ð¸Ñ Ð² оÑÐ²ÐµÑ Ð½Ð° SQL-ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ SET, вÑполнÑемÑÑ ÐºÐ»Ð¸ÐµÐ½Ñом и в Ñаком ÑлÑÑае ÑÑо ÑообÑение по ÑÑÑи ÑинÑ
Ñонно â но ÑоÑÑоÑние паÑамеÑÑов Ð¼Ð¾Ð¶ÐµÑ Ð¼ÐµÐ½ÑÑÑÑÑ Ð¸ когда админиÑÑÑаÑÐ¾Ñ Ð¸Ð·Ð¼ÐµÐ½ÑÐµÑ Ñайл конÑигÑÑаÑии, а заÑем поÑÑÐ»Ð°ÐµÑ ÑеÑвеÑÑ Ñигнал SIGHUP. Также, еÑли дейÑÑвие ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ SET оÑменÑеÑÑÑ, клиенÑÑ Ð¿ÐµÑедаÑÑÑÑ ÑообÑение ParameterStatus, в коÑоÑом оÑÑажаеÑÑÑ ÑекÑÑее знаÑение паÑамеÑÑа.
РнаÑÑоÑÑее вÑÐµÐ¼Ñ ÐµÑÑÑ Ð¶ÑÑÑко заÑикÑиÑованнÑй Ð½Ð°Ð±Ð¾Ñ Ð¿Ð°ÑамеÑÑов, пÑи изменении коÑоÑÑÑ Ð²ÑдаÑÑÑÑ ParameterStatus:
application_name | is_superuser |
client_encoding | scram_iterations |
DateStyle | server_encoding |
default_transaction_read_only | server_version |
in_hot_standby | session_authorization |
integer_datetimes | standard_conforming_strings |
IntervalStyle | TimeZone |
(server_encoding, TimeZone и integer_datetimes не оÑÑлеживалиÑÑ Ð´Ð¾ веÑÑии 8.0; standard_conforming_strings не оÑÑлеживалÑÑ Ð´Ð¾ 8.1; IntervalStyle â до веÑÑии 8.4; application_name â до веÑÑии 9.0; default_transaction_read_only и in_hot_standby â до веÑÑии 14; scram_iterations â до веÑÑии 16.) ÐамеÑÑÑе, ÑÑо server_version, server_encoding и integer_datetimes â ÑÑо пÑевдопаÑамеÑÑÑ, коÑоÑÑе не могÑÑ Ð¼ÐµÐ½ÑÑÑÑÑ Ð¿Ð¾Ñле запÑÑка ÑеÑвеÑа. ÐÑÐ¾Ñ Ð½Ð°Ð±Ð¾Ñ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¸Ð·Ð¼ÐµÐ½Ñн в бÑдÑÑем или даже бÑÐ´ÐµÑ Ð½Ð°ÑÑÑаиваемÑм. СооÑвеÑÑÑвенно, ÐºÐ»Ð¸ÐµÐ½Ñ Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑоÑÑо игноÑиÑоваÑÑ ÑообÑÐµÐ½Ð¸Ñ ParameterStatus Ð´Ð»Ñ Ð¿Ð°ÑамеÑÑов, коÑоÑÑе ÐµÐ¼Ñ Ð½ÐµÐ¸Ð·Ð²ÐµÑÑÐ½Ñ Ð¸Ð»Ð¸ не пÑедÑÑавлÑÑÑ Ð¸Ð½ÑеÑеÑа.
ÐÑли ÐºÐ»Ð¸ÐµÐ½Ñ Ð²ÑполнÑÐµÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ LISTEN, ÑеÑÐ²ÐµÑ Ð±ÑÐ´ÐµÑ Ð¿ÐµÑедаваÑÑ ÐµÐ¼Ñ ÑообÑÐµÐ½Ð¸Ñ NotificationResponse (не пÑÑайÑе Ñ NoticeResponse!), когда Ð´Ð»Ñ ÐºÐ°Ð½Ð°Ð»Ð° Ñ Ñем же именем заÑем бÑÐ´ÐµÑ Ð²ÑполнÑÑÑÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð° NOTIFY.
ÐÑимеÑание
РнаÑÑоÑÑее вÑемÑ, ÑообÑение NotificationResponse Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿ÐµÑедано ÑолÑко вне ÑÑанзакÑии, Ñак ÑÑо оно не Ð¼Ð¾Ð¶ÐµÑ Ð¾ÐºÐ°Ð·Ð°ÑÑÑÑ Ð² ÑеÑедине ÑеÑии оÑвеÑов на командÑ, Ñ Ð¾ÑÑ Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾ÑÑÑпиÑÑ ÑÑÐ°Ð·Ñ Ð¿Ð¾Ñле ReadyForQuery. Ðднако полагаÑÑÑÑ Ð½Ð° ÑÑо пÑи пÑоекÑиÑовании логики клиенÑа неÑазÑмно. ÐÑÑÑе ÑазÑабоÑаÑÑ ÐºÐ¾Ð´ Ñак, ÑÑÐ¾Ð±Ñ NotificationResponse могло бÑÑÑ Ð¿ÑинÑÑо в лÑбой Ñазе пÑоÑокола.
54.2.8. ÐÑмена вÑполнÑÑÑÐ¸Ñ ÑÑ Ð·Ð°Ð¿ÑоÑов #
РпÑоÑеÑÑе обÑабоÑки запÑоÑа ÐºÐ»Ð¸ÐµÐ½Ñ Ð¼Ð¾Ð¶ÐµÑ Ð·Ð°Ð¿ÑоÑиÑÑ Ð¾ÑÐ¼ÐµÐ½Ñ ÑÑого запÑоÑа. ÐапÑÐ¾Ñ Ð¾ÑÐ¼ÐµÐ½Ñ Ð½Ðµ пеÑедаÑÑÑÑ ÑеÑвеÑÑ Ð½ÐµÐ¿Ð¾ÑÑедÑÑвенно ÑеÑез оÑкÑÑÑое Ñоединение из ÑообÑажений ÑÑÑекÑивноÑÑи: Ð¼Ñ Ð½Ðµ Ñ Ð¾Ñим, ÑÑÐ¾Ð±Ñ ÑеÑÐ²ÐµÑ Ð¿Ð¾ÑÑоÑнно пÑовеÑÑл поÑÑÑпаÑÑие Ð¾Ñ ÐºÐ»Ð¸ÐµÐ½Ñа ÑообÑÐµÐ½Ð¸Ñ Ð² пÑоÑеÑÑе вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿ÑоÑа. ÐапÑоÑÑ Ð¾ÑÐ¼ÐµÐ½Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ Ð¾ÑноÑиÑелÑно Ñедкими, поÑÑÐ¾Ð¼Ñ Ð¼Ñ Ð²ÑбÑали Ð´Ð»Ñ Ð½Ð¸Ñ Ð½Ðµ ÑамÑй пÑоÑÑой пÑÑÑ Ð²Ð¾ избежание негаÑивного влиÑÐ½Ð¸Ñ Ð½Ð° обÑÑнÑй Ñежим ÑабоÑÑ.
ЧÑÐ¾Ð±Ñ Ð·Ð°Ð¿ÑоÑиÑÑ Ð¾ÑÐ¼ÐµÐ½Ñ Ð·Ð°Ð¿ÑоÑа, ÐºÐ»Ð¸ÐµÐ½Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ ÑÑÑановиÑÑ Ð½Ð¾Ð²Ð¾Ðµ подклÑÑение к ÑеÑвеÑÑ Ð¸ оÑпÑавиÑÑ ÐµÐ¼Ñ ÑообÑение CancelRequest, вмеÑÑо StartupMessage, обÑÑно пеÑедаваемого пÑи ÑÑÑановлении нового подклÑÑениÑ. СеÑÐ²ÐµÑ Ð¾Ð±ÑабоÑÐ°ÐµÑ Ð¿Ð¾Ð»ÑÑеннÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ Ð¸ закÑÐ¾ÐµÑ ÑÑо подклÑÑение. Ðо ÑообÑажениÑм безопаÑноÑÑи ÑеÑÐ²ÐµÑ Ð½Ðµ оÑвеÑÐ°ÐµÑ Ð½ÐµÐ¿Ð¾ÑÑедÑÑвенно на ÑообÑение Ñ Ð·Ð°Ð¿ÑоÑом оÑменÑ.
СообÑение CancelRequest обÑабаÑÑваеÑÑÑ, ÑолÑко еÑли оно ÑодеÑÐ¶Ð¸Ñ Ñе же клÑÑевÑе даннÑе (PID и ÑекÑеÑнÑй клÑÑ), ÑÑо бÑли пеÑÐµÐ´Ð°Ð½Ñ ÐºÐ»Ð¸ÐµÐ½ÑÑ Ð¿Ñи запÑÑке. ÐÑли PID и ÑекÑеÑнÑй клÑÑ Ð² запÑоÑе ÑооÑвеÑÑÑвÑÑÑ Ð´Ð°Ð½Ð½Ñм вÑполнÑÑÑегоÑÑ Ð² даннÑй Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð¾Ð±ÑлÑживаÑÑего пÑоÑеÑÑа, обÑабоÑка ÑекÑÑего запÑоÑа в нÑм пÑеÑÑваеÑÑÑ. (Ð ÑÑÑеÑÑвÑÑÑей ÑеализаÑии ÑÑо оÑÑÑеÑÑвлÑеÑÑÑ Ð¿ÑÑÑм пеÑедаÑи ÑпеÑиалÑного Ñигнала Ð´Ð°Ð½Ð½Ð¾Ð¼Ñ Ð¾Ð±ÑлÑживаÑÑÐµÐ¼Ñ Ð¿ÑоÑеÑÑÑ.)
Сигнал оÑÐ¼ÐµÐ½Ñ Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾Ð´ÐµÐ¹ÑÑвоваÑÑ, а Ð¼Ð¾Ð¶ÐµÑ Ð¸ не подейÑÑвоваÑÑ (напÑимеÑ, еÑли он поÑÑÑÐ¿Ð¸Ñ Ð¿Ð¾Ñле Ñого, как ÑеÑÐ²ÐµÑ Ð·Ð°Ð²ÐµÑÑÐ¸Ñ Ð¾Ð±ÑабоÑÐºÑ Ð·Ð°Ð¿ÑоÑа). ÐÑли оÑмена дейÑÑвиÑелÑно пÑоиÑÑ Ð¾Ð´Ð¸Ñ, ÑекÑÑÐ°Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð° пÑеÑÑваеÑÑÑ Ð´Ð¾ÑÑоÑно Ñ ÑообÑением об оÑибке.
ÐÑледÑÑвие Ñакой оÑганизаÑии, обÑÑÑнÑемой ÑообÑажениÑми безопаÑноÑÑи и ÑÑÑекÑивноÑÑи, ÐºÐ»Ð¸ÐµÐ½Ñ Ð½Ðµ Ð¼Ð¾Ð¶ÐµÑ Ð½ÐµÐ¿Ð¾ÑÑедÑÑвенно опÑеделиÑÑ, бÑл ли запÑÐ¾Ñ Ð¾ÑÐ¼ÐµÐ½Ñ ÑÑпеÑен. Ðн должен пÑодолжаÑÑ Ð¾Ð¶Ð¸Ð´Ð°ÑÑ Ð¾ÑвеÑа ÑеÑвеÑа на иÑÑ Ð¾Ð´Ð½Ñй запÑоÑ. ÐапÑÐ¾Ñ Ð¾ÑÐ¼ÐµÐ½Ñ Ð¿ÑоÑÑо ÑвелиÑÐ¸Ð²Ð°ÐµÑ Ð²ÐµÑоÑÑноÑÑÑ Ñого, ÑÑо ÑекÑÑий запÑÐ¾Ñ Ð·Ð°Ð²ÐµÑÑиÑÑÑ Ð±ÑÑÑÑее, как и веÑоÑÑноÑÑÑ Ñого, ÑÑо он бÑÐ´ÐµÑ Ð·Ð°Ð²ÐµÑÑÑн не ÑÑпеÑно, а Ñ Ð¾Ñибкой.
Так как запÑÐ¾Ñ Ð¾ÑÐ¼ÐµÐ½Ñ Ð¿ÐµÑедаÑÑÑÑ ÑеÑвеÑÑ ÑеÑез новое подклÑÑение к ÑеÑвеÑÑ, а не ÑеÑез обÑÑнÑй канал ÑвÑзи клиенÑ-ÑеÑвеÑ, Ñакие запÑоÑÑ Ð¼Ð¾Ð³ÑÑ Ð²ÑдаваÑÑ Ð»ÑбÑе пÑоÑеÑÑÑ, а не ÑолÑко клиенÑÑкий пÑоÑеÑÑ, запÑÐ¾Ñ ÐºÐ¾ÑоÑого ÑÑебÑеÑÑÑ Ð¾ÑмениÑÑ. ÐÑо Ð¼Ð¾Ð¶ÐµÑ Ð´Ð°ÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑÑ Ð³Ð¸Ð±ÐºÐ¾ÑÑÑ Ð¿Ñи поÑÑÑоении многопÑоÑеÑÑнÑÑ Ð¿Ñиложений. ÐÑо Ñакже пÑедÑÑавлÑÐµÑ Ñобой ÑгÑÐ¾Ð·Ñ Ð±ÐµÐ·Ð¾Ð¿Ð°ÑноÑÑи, Ñак как попÑÑаÑÑÑÑ Ð¾ÑмениÑÑ Ð·Ð°Ð¿ÑоÑÑ Ð¼Ð¾Ð³ÑÑ Ð¸ неавÑоÑизованнÑе полÑзоваÑели. ÐÐ»Ñ Ð»Ð¸ÐºÐ²Ð¸Ð´Ð°Ñии ÑÑой ÑгÑÐ¾Ð·Ñ Ð² запÑоÑÐ°Ñ Ð¾ÑÐ¼ÐµÐ½Ñ ÑÑебÑеÑÑÑ Ð¿ÐµÑедаваÑÑ Ð´Ð¸Ð½Ð°Ð¼Ð¸ÑеÑки генеÑиÑÑемÑй ÑекÑеÑнÑй клÑÑ.
54.2.9. ÐавеÑÑение #
ÐбÑÑÐ½Ð°Ñ Ð¿ÑоÑедÑÑа мÑгкого завеÑÑÐµÐ½Ð¸Ñ Ð·Ð°ÐºÐ»ÑÑаеÑÑÑ Ð² Ñом, ÑÑо ÐºÐ»Ð¸ÐµÐ½Ñ Ð¾ÑпÑавлÑÐµÑ ÑообÑение Terminate и немедленно закÑÑÐ²Ð°ÐµÑ Ñоединение. ÐолÑÑÐ°Ñ ÑÑо ÑообÑение, обÑлÑживаÑÑий пÑоÑеÑÑ Ð·Ð°ÐºÑÑÐ²Ð°ÐµÑ Ñоединение и завеÑÑаеÑÑÑ.
Ð ÑÐµÐ´ÐºÐ¸Ñ ÑлÑÑаÑÑ (напÑимеÑ, пÑи оÑклÑÑении Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ Ð¿Ð¾ команде админиÑÑÑаÑоÑа) обÑлÑживаÑÑий пÑоÑеÑÑ Ð¼Ð¾Ð¶ÐµÑ Ð¾ÑклÑÑиÑÑÑÑ, даже еÑли ÐºÐ»Ð¸ÐµÐ½Ñ Ð½Ðµ запÑаÑÐ¸Ð²Ð°ÐµÑ ÑÑого. Ð ÑÐ°ÐºÐ¸Ñ ÑлÑÑаÑÑ , пеÑед Ñем, как закÑÑÑÑ Ñоединение, ÑÑÐ¾Ñ Ð¿ÑоÑеÑÑ Ð¿ÑÑаеÑÑÑ Ð¿ÐµÑедаÑÑ ÑообÑение Ñ Ð¾Ñибкой или Ñведомлением, в коÑоÑом бÑÐ´ÐµÑ Ñказана пÑиÑина оÑклÑÑениÑ.
ÐÑÑгие ÑÑенаÑии завеÑÑÐµÐ½Ð¸Ñ Ð²Ð¾Ð·Ð½Ð¸ÐºÐ°ÑÑ Ñ ÑазлиÑнÑми ваÑианÑами оÑказа, напÑимеÑ, пÑи кÑиÑиÑеÑком Ñбое Ñ Ð´Ð°Ð¼Ð¿Ð¾Ð¼ памÑÑи на одной или дÑÑгой ÑÑоÑоне, пÑи поÑеÑе канала ÑоединениÑ, поÑеÑе ÑÐ¸Ð½Ñ ÑонизаÑии по гÑаниÑам ÑообÑений и Ñ. д. ÐÑли ÐºÐ»Ð¸ÐµÐ½Ñ Ð¸Ð»Ð¸ ÑеÑÐ²ÐµÑ Ð¾Ð±Ð½Ð°ÑÑживаеÑ, ÑÑо Ñоединение бÑло неожиданно закÑÑÑо, он должен оÑиÑÑиÑÑ ÑеÑÑÑÑÑ Ð¸ завеÑÑиÑÑÑÑ. ÐÐ»Ð¸ÐµÐ½Ñ Ð¿Ñи ÑÑом Ð¼Ð¾Ð¶ÐµÑ Ð·Ð°Ð¿ÑÑÑиÑÑ Ð½Ð¾Ð²Ñй обÑлÑживаÑÑий пÑоÑеÑÑ, пеÑеподклÑÑивÑиÑÑ Ðº ÑеÑвеÑÑ, еÑли он Ñам Ñ Ð¾ÑÐµÑ Ð¿ÑодолжаÑÑ ÑабоÑÑ. ÐакÑÑваÑÑ Ñоединение Ñакже ÑекомендÑеÑÑÑ Ð¿Ñи полÑÑении ÑообÑений неÑаÑпознанного Ñипа, Ñак как ÑÑо Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿Ñизнаком поÑеÑи ÑÐ¸Ð½Ñ ÑонизаÑии по гÑаниÑам ÑообÑений.
ÐÑи ÑÑаÑном или неÑÑаÑном завеÑÑении ÑеанÑа лÑÐ±Ð°Ñ Ð¾ÑкÑÑÑÐ°Ñ ÑÑанзакÑÐ¸Ñ Ð¾ÑкаÑÑваеÑÑÑ, а не ÑикÑиÑÑеÑÑÑ. Ðднако ÑледÑÐµÑ Ð·Ð°Ð¼ÐµÑиÑÑ, ÑÑо пÑи оÑклÑÑении клиенÑа в пÑоÑеÑÑе обÑабоÑки запÑоÑа, оÑлиÑного Ð¾Ñ SELECT, обÑлÑживаÑÑий пÑоÑеÑÑ Ð²ÐµÑоÑÑнее вÑего завеÑÑÐ¸Ñ Ð·Ð°Ð¿ÑоÑ, пÑежде Ñем замеÑÐ¸Ñ Ð¾ÑклÑÑение. ÐÑли запÑÐ¾Ñ Ð²ÑполнÑеÑÑÑ Ð½Ðµ в блоке ÑÑанзакÑии (вне поÑледоваÑелÑноÑÑи BEGIN ... COMMIT), его ÑезÑлÑÑаÑÑ Ð¼Ð¾Ð³ÑÑ Ð±ÑÑÑ Ð·Ð°ÑикÑиÑÐ¾Ð²Ð°Ð½Ñ Ð´Ð¾ Ñого, как бÑÐ´ÐµÑ Ð¾Ð±Ð½Ð°ÑÑжено оÑклÑÑение.
54.2.10. ÐаÑиÑа ÑеанÑа Ñ SSL #
ÐÑли Postgres Pro бÑл ÑобÑан Ñ Ð¿Ð¾Ð´Ð´ÐµÑжкой SSL, взаимодейÑÑвие клиенÑа Ñ ÑеÑвеÑом Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð·Ð°ÑиÑÑовано Ñ Ð¿Ñименением SSL. ÐÑо обеÑпеÑÐ¸Ð²Ð°ÐµÑ Ð·Ð°ÑиÑÑ Ð½Ð° ÑÑовне канала в ÑÑеде, где злоÑмÑÑленники могÑÑ Ð¿ÐµÑÐµÑ Ð²Ð°ÑиÑÑ ÑÑаÑик ÑеанÑа. Ðа дополниÑелÑнÑми ÑведениÑми о ÑиÑÑовании ÑÑаÑика ÑеанÑов Postgres Pro Ñ Ð¸ÑполÑзованием SSL обÑаÑиÑеÑÑ Ðº РазделÑ 17.9.
ЧÑÐ¾Ð±Ñ Ð½Ð°ÑаÑÑ ÑÐµÐ°Ð½Ñ Ñ SSL-ÑиÑÑованием, ÐºÐ»Ð¸ÐµÐ½Ñ Ð¿ÐµÑедаÑÑ ÑеÑвеÑÑ Ð²Ð¼ÐµÑÑо StartupMessage ÑообÑение SSLRequest. РоÑÐ²ÐµÑ ÑеÑÐ²ÐµÑ Ð¿ÐµÑедаÑÑ Ð¾Ð´Ð¸Ð½ байÑ, ÑодеÑжаÑий Ñимвол S или N, показÑваÑÑий, ÑÑо он желаеÑ, либо не Ð¶ÐµÐ»Ð°ÐµÑ Ð²ÐºÐ»ÑÑаÑÑ SSL, ÑооÑвеÑÑÑвенно. ÐÑли ÐºÐ»Ð¸ÐµÐ½Ñ Ð½Ðµ ÑдовлеÑвоÑÑн оÑвеÑом, он Ð¼Ð¾Ð¶ÐµÑ Ð·Ð°ÐºÑÑÑÑ Ñоединение на ÑÑом ÑÑапе. ЧÑÐ¾Ð±Ñ Ð¿ÑодолжиÑÑ ÑÑÑановление ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð¿Ð¾Ñле полÑÑÐµÐ½Ð¸Ñ S, он вÑполнÑÐµÑ Ð½Ð°ÑалÑное ÑоглаÑование SSL Ñ ÑеÑвеÑом (не опиÑÑваеÑÑÑ Ð·Ð´ÐµÑÑ, Ñак как оÑноÑиÑÑÑ Ðº пÑоÑÐ¾ÐºÐ¾Ð»Ñ SSL). ÐÑли ÑÑа пÑоÑедÑÑа вÑполнÑеÑÑÑ ÑÑпеÑно, он пÑÐ¾Ð´Ð¾Ð»Ð¶Ð°ÐµÑ Ñоединение, пеÑÐµÐ´Ð°Ð²Ð°Ñ Ð¾Ð±ÑÑное ÑообÑение StartupMessage. ÐÑи ÑÑом StartupMessage и вÑе поÑледÑÑÑие даннÑе бÑдÑÑ Ð·Ð°ÑиÑÐµÐ½Ñ SSL-ÑиÑÑованием. ЧÑÐ¾Ð±Ñ Ð¿ÑодолжиÑÑ Ð¿Ð¾Ñле полÑÑÐµÐ½Ð¸Ñ N, ÐºÐ»Ð¸ÐµÐ½Ñ Ð¼Ð¾Ð¶ÐµÑ Ð¿ÐµÑедаÑÑ Ð¾Ð±ÑÑное ÑообÑение StartupMessage и далÑÑе взаимодейÑÑвоваÑÑ Ñ ÑеÑвеÑом без ÑиÑÑованиÑ. (ÐÐ»Ð¸ÐµÐ½Ñ Ñакже Ð¼Ð¾Ð¶ÐµÑ Ð²ÑдаÑÑ ÑообÑение GSSENCRequest поÑле полÑÑÐµÐ½Ð¸Ñ N и попÑÑаÑÑÑÑ Ð¸ÑполÑзоваÑÑ ÑиÑÑование GSSAPI вмеÑÑо SSL.)
ÐÐ»Ð¸ÐµÐ½Ñ Ñакже должен бÑÑÑ Ð³Ð¾Ñов обÑабоÑаÑÑ ÑообÑение ErrorMessage, полÑÑенное Ð¾Ñ ÑеÑвеÑа в оÑÐ²ÐµÑ Ð½Ð° SSLRequest. ÐÐ»Ð¸ÐµÐ½Ñ Ð½Ðµ должен показÑваÑÑ ÑÑÑ Ð¾ÑÐ¸Ð±ÐºÑ Ð¿Ð¾Ð»ÑзоваÑелÑ/в пÑиложении, поÑколÑÐºÑ ÑеÑÐ²ÐµÑ Ð½Ðµ бÑл аÑÑенÑиÑиÑиÑован (CVE-2024-10977). Ð ÑÑом ÑлÑÑае Ñоединение должно бÑÑÑ Ð·Ð°ÐºÑÑÑо, но ÐºÐ»Ð¸ÐµÐ½Ñ Ð¼Ð¾Ð¶ÐµÑ ÑеÑиÑÑ Ð¾ÑкÑÑÑÑ Ð½Ð¾Ð²Ð¾Ðµ Ñоединение, не запÑаÑÐ¸Ð²Ð°Ñ SSL.
Ðогда SSL-ÑиÑÑование Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð²ÐºÐ»ÑÑено, ожидаеÑÑÑ, ÑÑо ÑеÑÐ²ÐµÑ Ð¿ÐµÑедаÑÑ ÑолÑко один байÑ, ÑодеÑжаÑий Ñимвол S, а заÑем бÑÐ´ÐµÑ Ð¾Ð¶Ð¸Ð´Ð°ÑÑ Ð¾Ñ ÐºÐ»Ð¸ÐµÐ½Ñа наÑала ÑоглаÑÐ¾Ð²Ð°Ð½Ð¸Ñ SSL. ÐÑли на ÑÑом ÑÑапе доÑÑÑÐ¿Ð½Ñ Ð´Ð»Ñ ÑÑÐµÐ½Ð¸Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑе байÑÑ, ÑÑо Ð¼Ð¾Ð¶ÐµÑ Ð¾Ð·Ð½Ð°ÑаÑÑ, ÑÑо злоÑмÑÑленник пÑÑаеÑÑÑ Ð²ÑполниÑÑ Ð°ÑÐ°ÐºÑ Ñ Ð¿ÐµÑеполнением бÑÑеÑа (CVE-2021-23222). Ðод на ÑÑоÑоне клиенÑа должен либо пÑоÑиÑаÑÑ Ñовно один байÑ, а заÑем пеÑедаÑÑ ÑÐ¾ÐºÐµÑ Ð±Ð¸Ð±Ð»Ð¸Ð¾Ñеке SSL, либо, еÑли бÑли пÑоÑиÑÐ°Ð½Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑе байÑÑ, ÑÑиÑаÑÑ ÑÑо наÑÑÑением пÑоÑокола.
ÐаÑалÑнÑй запÑÐ¾Ñ SSLRequest Ð¼Ð¾Ð¶ÐµÑ Ñакже пеÑедаваÑÑÑÑ Ð¿Ñи ÑÑÑановлении ÑоединениÑ, оÑкÑÑваемого Ð´Ð»Ñ Ð¿ÐµÑедаÑи ÑообÑÐµÐ½Ð¸Ñ CancelRequest.
Так как в Ñамом пÑоÑоколе не пÑедÑÑмоÑÑено пÑинÑдиÑелÑное вклÑÑение SSL-ÑиÑÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÑеÑвеÑом, админиÑÑÑаÑÐ¾Ñ Ð¼Ð¾Ð¶ÐµÑ Ð½Ð°ÑÑÑоиÑÑ ÑеÑÐ²ÐµÑ Ñак, ÑÑÐ¾Ð±Ñ Ð² каÑеÑÑве дополниÑелÑного ÑÑÐ»Ð¾Ð²Ð¸Ñ Ð¿Ñи пÑовеÑке подлинноÑÑи клиенÑа он не пÑинимал незаÑиÑÑованнÑе ÑеанÑÑ.
54.2.11. ÐаÑиÑа ÑеанÑа Ñ GSSAPI #
ÐÑли Postgres Pro бÑл ÑобÑан Ñ Ð¿Ð¾Ð´Ð´ÐµÑжкой GSSAPI, взаимодейÑÑвие клиенÑа Ñ ÑеÑвеÑом Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð·Ð°ÑиÑÑовано Ñ Ð¿Ñименением GSSAPI. ÐÑо обеÑпеÑÐ¸Ð²Ð°ÐµÑ Ð·Ð°ÑиÑÑ Ð½Ð° ÑÑовне канала в ÑÑеде, где злоÑмÑÑленники могÑÑ Ð¿ÐµÑÐµÑ Ð²Ð°ÑиÑÑ ÑÑаÑик ÑеанÑа. Ðа дополниÑелÑнÑми ÑведениÑми о ÑиÑÑовании ÑÑаÑика ÑеанÑов Postgres Pro Ñ Ð¸ÑполÑзованием GSSAPI обÑаÑиÑеÑÑ Ðº РазделÑ 17.10.
ЧÑÐ¾Ð±Ñ ÑÑÑановиÑÑ Ñоединение, заÑиÑÑованное GSSAPI, ÐºÐ»Ð¸ÐµÐ½Ñ Ð²Ð½Ð°Ñале поÑÑÐ»Ð°ÐµÑ ÑообÑение GSSENCRequest, а не StartupMessage. СеÑÐ²ÐµÑ Ð² оÑÐ²ÐµÑ Ð¿ÐµÑедаÑÑ Ð¾Ð´Ð¸Ð½ Ð±Ð°Ð¹Ñ Ñ Ð±Ñквой G или N, показÑваÑÑей ÑооÑвеÑÑÑвенно, Ð¶ÐµÐ»Ð°ÐµÑ Ð»Ð¸ он иÑполÑзоваÑÑ ÑиÑÑование GSSAPI или неÑ. ÐÐ»Ð¸ÐµÐ½Ñ Ð¼Ð¾Ð¶ÐµÑ Ð·Ð°ÐºÑÑÑÑ Ñоединение в ÑÑÐ¾Ñ Ð¼Ð¾Ð¼ÐµÐ½Ñ, еÑли оÑÐ²ÐµÑ ÐµÐ³Ð¾ не ÑÑÑÑаиваеÑ. ЧÑÐ¾Ð±Ñ Ð¿ÑодолжиÑÑ Ð¿Ð¾Ñле ваÑианÑа G, иÑполÑзÑÑ GSSAPI на ÑÑовне C в ÑооÑвеÑÑÑвии Ñо ÑÑандаÑÑом RFC 2744 или ÑавнознаÑнÑм, вÑполниÑе иниÑиализаÑÐ¸Ñ GSSAPI, вÑзÑÐ²Ð°Ñ gss_init_sec_context() в Ñикле и оÑпÑавлÑÑ ÑезÑлÑÑÐ°Ñ Ð½Ð° ÑеÑвеÑ, ÑнаÑала без вÑ
однÑÑ
даннÑÑ
, а заÑем Ð´Ð»Ñ Ð²ÑеÑ
поÑÑÑпаÑÑиÑ
Ð¾Ñ ÑеÑвеÑа даннÑÑ
, пока они не законÑаÑÑÑ. ÐеÑÐµÐ´Ð°Ð²Ð°Ñ ÑезÑлÑÑаÑÑ gss_init_sec_context() ÑеÑвеÑÑ, добавÑÑе пеÑед ÑообÑением его Ð´Ð»Ð¸Ð½Ñ Ð² виде ÑеÑÑÑÑÑ
байÑового Ñелого в ÑеÑевом поÑÑдке байÑов. ЧÑÐ¾Ð±Ñ Ð¿ÑодолжиÑÑ Ð¿Ð¾Ñле полÑÑÐµÐ½Ð¸Ñ N, ÐºÐ»Ð¸ÐµÐ½Ñ Ð¼Ð¾Ð¶ÐµÑ Ð¿ÐµÑедаÑÑ Ð¾Ð±ÑÑное ÑообÑение StartupMessage и далÑÑе не иÑполÑзоваÑÑ ÑиÑÑование. (ÐÐ»Ð¸ÐµÐ½Ñ Ñакже Ð¼Ð¾Ð¶ÐµÑ Ð²ÑдаÑÑ ÑообÑение SSLRequest поÑле полÑÑÐµÐ½Ð¸Ñ N и попÑÑаÑÑÑÑ Ð¸ÑполÑзоваÑÑ ÑиÑÑование SSL вмеÑÑо GSSAPI.)
ÐÐ»Ð¸ÐµÐ½Ñ Ñакже должен бÑÑÑ Ð³Ð¾Ñов обÑабоÑаÑÑ ÑообÑение ErrorMessage, полÑÑенное Ð¾Ñ ÑеÑвеÑа в оÑÐ²ÐµÑ Ð½Ð° GSSENCRequest. ÐÐ»Ð¸ÐµÐ½Ñ Ð½Ðµ должен показÑваÑÑ ÑÑÑ Ð¾ÑÐ¸Ð±ÐºÑ Ð¿Ð¾Ð»ÑзоваÑелÑ/в пÑиложении, поÑколÑÐºÑ ÑеÑÐ²ÐµÑ Ð½Ðµ бÑл аÑÑенÑиÑиÑиÑован (CVE-2024-10977). Ð ÑÑом ÑлÑÑае Ñоединение должно бÑÑÑ Ð·Ð°ÐºÑÑÑо, но ÐºÐ»Ð¸ÐµÐ½Ñ Ð¼Ð¾Ð¶ÐµÑ ÑеÑиÑÑ Ð¾ÑкÑÑÑÑ Ð½Ð¾Ð²Ð¾Ðµ Ñоединение, не запÑаÑÐ¸Ð²Ð°Ñ ÑиÑÑование GSSAPI.
Ðогда GSSAPI-ÑиÑÑование Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð²ÐºÐ»ÑÑено, ожидаеÑÑÑ, ÑÑо ÑеÑÐ²ÐµÑ Ð¿ÐµÑедаÑÑ ÑолÑко один байÑ, ÑодеÑжаÑий Ñимвол G, а заÑем бÑÐ´ÐµÑ Ð¾Ð¶Ð¸Ð´Ð°ÑÑ Ð¾Ñ ÐºÐ»Ð¸ÐµÐ½Ñа ÑоглаÑование GSSAPI. ÐÑли на ÑÑом ÑÑапе доÑÑÑÐ¿Ð½Ñ Ð´Ð»Ñ ÑÑÐµÐ½Ð¸Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑе байÑÑ, ÑÑо Ð¼Ð¾Ð¶ÐµÑ Ð¾Ð·Ð½Ð°ÑаÑÑ, ÑÑо злоÑмÑÑленник пÑÑаеÑÑÑ Ð²ÑполниÑÑ Ð°ÑÐ°ÐºÑ Ñ Ð¿ÐµÑеполнением бÑÑеÑа (CVE-2021-23222). Ðод на ÑÑоÑоне клиенÑа должен либо пÑоÑиÑаÑÑ Ñовно один байÑ, а заÑем пеÑедаÑÑ ÑÐ¾ÐºÐµÑ Ð±Ð¸Ð±Ð»Ð¸Ð¾Ñеке GSSAPI, либо, еÑли бÑли пÑоÑиÑÐ°Ð½Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑе байÑÑ, ÑÑиÑаÑÑ ÑÑо наÑÑÑением пÑоÑокола.
ÐаÑалÑнÑй запÑÐ¾Ñ GSSENCRequest Ð¼Ð¾Ð¶ÐµÑ Ñакже пеÑедаваÑÑÑÑ Ð¿Ñи ÑÑÑановлении ÑоединениÑ, оÑкÑÑваемого Ð´Ð»Ñ Ð¿ÐµÑедаÑи ÑообÑÐµÐ½Ð¸Ñ CancelRequest.
Ðогда ÑиÑÑование GSSAPI ÑÑÑановлено, иÑполÑзÑйÑе gss_wrap() Ð´Ð»Ñ ÑиÑÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¾Ð±ÑÑного ÑообÑÐµÐ½Ð¸Ñ StartupMessage и вÑеÑ
поÑледÑÑÑиÑ
даннÑÑ
. ÐеÑед ÑобÑÑвенно заÑиÑÑованнÑм ÑезÑлÑÑаÑом добавÑÑе его Ð´Ð»Ð¸Ð½Ñ Ð² виде ÑеÑÑÑÑÑ
байÑового Ñелого в ÑеÑевом поÑÑдке байÑов. УÑÑиÑе, ÑÑо ÑеÑÐ²ÐµÑ Ð±ÑÐ´ÐµÑ Ð¿ÑинимаÑÑ Ð¾Ñ ÐºÐ»Ð¸ÐµÐ½Ñа заÑиÑÑованнÑе пакеÑÑ, ÑолÑко еÑли они менÑÑе 16 ÐÐ; ÑÑÐ¾Ð±Ñ Ð¾Ð¿ÑеделиÑÑ, ÑкладÑваеÑÑÑ Ð»Ð¸ заÑиÑÑованное ÑообÑение в ÑÑо огÑаниÑение, клиенÑÑ ÑледÑÐµÑ Ð¸ÑполÑзоваÑÑ ÑÑнкÑÐ¸Ñ gss_wrap_size_limit(), а ÑÑÐ¾Ð±Ñ ÑазбиÑÑ Ð±Ð¾Ð»ÑÑие ÑообÑÐµÐ½Ð¸Ñ Ð½Ð° ÑаÑÑи â поÑледоваÑелÑно вÑзÑваÑÑ gss_wrap(). СегменÑÑ Ð½ÐµÐ·Ð°ÑиÑÑованнÑÑ
даннÑÑ
обÑÑно имеÑÑ ÑÐ°Ð·Ð¼ÐµÑ 8 ÐÐ, поÑÑÐ¾Ð¼Ñ Ð·Ð°ÑиÑÑованнÑе пакеÑÑ Ð¾ÐºÐ°Ð·ÑваÑÑÑÑ Ð½ÐµÐ¼Ð½Ð¾Ð³Ð¾ болÑÑе 8 ÐÐ, но вполне ÑмеÑаÑÑÑÑ Ð² 16 ÐÐ. Ðожно ожидаÑÑ, ÑÑо ÑеÑÐ²ÐµÑ Ñакже не бÑÐ´ÐµÑ Ð¿ÐµÑедаваÑÑ ÐºÐ»Ð¸ÐµÐ½ÑÑ Ð·Ð°ÑиÑÑованнÑе пакеÑÑ ÑазмеÑом болÑÑе 16 ÐÐ.
Так как в Ñамом пÑоÑоколе не пÑедÑÑмоÑÑено пÑинÑдиÑелÑное вклÑÑение GSSAPI-ÑиÑÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÑеÑвеÑом, админиÑÑÑаÑÐ¾Ñ Ð¼Ð¾Ð¶ÐµÑ Ð½Ð°ÑÑÑоиÑÑ ÑеÑÐ²ÐµÑ Ñак, ÑÑÐ¾Ð±Ñ Ð² каÑеÑÑве дополниÑелÑного ÑÑÐ»Ð¾Ð²Ð¸Ñ Ð¿Ñи пÑовеÑке подлинноÑÑи клиенÑа он не пÑинимал незаÑиÑÑованнÑе ÑеанÑÑ.