8.18. ÐденÑиÑикаÑоÑÑ Ð¾Ð±ÑекÑов
ÐденÑиÑикаÑÐ¾Ñ Ð¾Ð±ÑекÑа (Object Identifier, OID) иÑполÑзÑеÑÑÑ Ð²Ð½ÑÑÑи Postgres Pro в каÑеÑÑве пеÑвиÑного клÑÑа ÑазлиÑнÑÑ
ÑиÑÑемнÑÑ
ÑаблиÑ. РполÑзоваÑелÑÑкие ÑаблиÑÑ ÑÑÐ¾Ð»Ð±ÐµÑ OID добавлÑеÑÑÑ, ÑолÑко еÑли пÑи Ñоздании ÑаблиÑÑ ÑказÑваеÑÑÑ WITH OIDS или вклÑÑÑн паÑамеÑÑ ÐºÐ¾Ð½ÑигÑÑаÑии default_with_oids. ÐденÑиÑикаÑÐ¾Ñ Ð¾Ð±ÑекÑа пÑедÑÑавлÑеÑÑÑ Ð² Ñипе oid. Также Ð´Ð»Ñ Ñипа oid опÑÐµÐ´ÐµÐ»ÐµÐ½Ñ ÑледÑÑÑие пÑевдонимÑ: regproc, regprocedure, regoper, regoperator, regclass, regtype, regrole, regnamespace, regconfig и regdictionary. ÐÐ±Ð·Ð¾Ñ ÑÑиÑ
Ñипов пÑиведÑн в ТаблиÑе 8.24.
РнаÑÑоÑÑее вÑÐµÐ¼Ñ Ñип oid Ñеализован как ÑеÑÑÑÑÑ
байÑное Ñелое. Таким обÑазом, знаÑение ÑÑого Ñипа Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð½ÐµÐ´Ð¾ÑÑаÑоÑно болÑÑим Ð´Ð»Ñ Ð¾Ð±ÐµÑпеÑÐµÐ½Ð¸Ñ ÑникалÑноÑÑи в базе даннÑÑ
или даже в оÑделÑнÑÑ
болÑÑиÑ
ÑаблиÑаÑ
. ÐоÑÑÐ¾Ð¼Ñ Ð² полÑзоваÑелÑÑкиÑ
ÑаблиÑаÑ
иÑполÑзоваÑÑ ÑÑÐ¾Ð»Ð±ÐµÑ Ñипа OID в каÑеÑÑве пеÑвиÑного клÑÑа не ÑекомендÑеÑÑÑ. ÐÑÑÑе вÑего огÑаниÑиÑÑ Ð¿Ñименение ÑÑого Ñипа обÑаÑениÑми к ÑиÑÑемнÑм ÑаблиÑам.
ÐÐ»Ñ Ñамого Ñипа oid помимо ÑÑÐ°Ð²Ð½ÐµÐ½Ð¸Ñ Ð¾Ð¿ÑÐµÐ´ÐµÐ»ÐµÐ½Ñ Ð²Ñего неÑколÑко опеÑаÑоÑов. Ðднако его можно пÑивеÑÑи к ÑÐµÐ»Ð¾Ð¼Ñ Ð¸ заÑем задейÑÑвоваÑÑ Ð² обÑÑнÑÑ
ÑелоÑиÑленнÑÑ
вÑÑиÑлениÑÑ
. (ÐÑи ÑÑом ÑледÑÐµÑ Ð¾Ð¿Ð°ÑаÑÑÑÑ Ð¿ÑÑаниÑÑ Ñо знаковÑми/беззнаковÑми знаÑениÑми.)
ТипÑ-пÑÐµÐ²Ð´Ð¾Ð½Ð¸Ð¼Ñ OID Ñами по Ñебе не вводÑÑ Ð½Ð¾Ð²ÑÑ
опеÑаÑий и оÑлиÑаÑÑÑÑ ÑолÑко ÑпеÑиализиÑованнÑми ÑÑнкÑиÑми ввода/вÑвода. ÐÑи ÑÑнкÑии могÑÑ Ð¿ÑинимаÑÑ Ð¸ вÑводиÑÑ Ð½Ðµ пÑоÑÑо ÑиÑловÑе знаÑениÑ, как Ñип oid, а ÑимволиÑеÑкие имена ÑиÑÑемнÑÑ
обÑекÑов. ÐÑи ÑÐ¸Ð¿Ñ Ð¿Ð¾Ð·Ð²Ð¾Ð»ÑÑÑ ÑпÑоÑÑиÑÑ Ð¿Ð¾Ð¸Ñк обÑекÑов по знаÑениÑм OID. ÐапÑимеÑ, ÑÑÐ¾Ð±Ñ Ð²ÑбÑаÑÑ Ð¸Ð· pg_attribute ÑÑÑоки, оÑноÑÑÑиеÑÑ Ðº ÑаблиÑе mytable, можно напиÑаÑÑ:
SELECT * FROM pg_attribute WHERE attrelid = 'mytable'::regclass;
вмеÑÑо:
SELECT * FROM pg_attribute WHERE attrelid = (SELECT oid FROM pg_class WHERE relname = 'mytable');
ХоÑÑ Ð²ÑоÑой ваÑÐ¸Ð°Ð½Ñ Ð²ÑглÑÐ´Ð¸Ñ Ð½Ðµ Ñаким Ñж плоÑ
им, но ÑÑо лиÑÑ Ð¾ÑÐµÐ½Ñ Ð¿ÑоÑÑой запÑоÑ. ÐÑли же поÑÑебÑеÑÑÑ Ð²ÑбÑаÑÑ Ð¿ÑавилÑнÑй OID, когда ÑаблиÑа mytable еÑÑÑ Ð² неÑколÑкиÑ
ÑÑ
емаÑ
, вложеннÑй подзапÑÐ¾Ñ Ð±ÑÐ´ÐµÑ Ð³Ð¾Ñаздо Ñложнее. ÐÑеобÑазоваÑÐµÐ»Ñ Ð²Ð²Ð¾Ð´Ð¸Ð¼Ð¾Ð³Ð¾ знаÑÐµÐ½Ð¸Ñ Ñипа regclass наÑ
Ð¾Ð´Ð¸Ñ ÑаблиÑÑ ÑоглаÑно Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ð¼Ñ Ð¿ÑÑи поиÑка ÑÑ
ем, Ñак ÑÑо он Ð´ÐµÐ»Ð°ÐµÑ Â«Ð²ÑÑ Ð¿ÑавилÑно» авÑомаÑиÑеÑки. ÐналогиÑно, пÑÐ¸Ð²ÐµÐ´Ñ Ð¸Ð´ÐµÐ½ÑиÑикаÑÐ¾Ñ ÑаблиÑÑ Ðº ÑÐ¸Ð¿Ñ regclass, можно полÑÑиÑÑ ÑимволиÑеÑкое пÑедÑÑавление ÑиÑлового кода.
ТаблиÑа 8.24. ÐденÑиÑикаÑоÑÑ Ð¾Ð±ÑекÑов
| ÐÐ¼Ñ | СÑÑлки | ÐпиÑание | ÐÑÐ¸Ð¼ÐµÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ |
|---|---|---|---|
oid | any | ÑиÑловой иденÑиÑикаÑÐ¾Ñ Ð¾Ð±ÑекÑа | 564182 |
regproc | pg_proc | Ð¸Ð¼Ñ ÑÑнкÑии | sum |
regprocedure | pg_proc | ÑÑнкÑÐ¸Ñ Ñ Ñипами аÑгÑменÑов | sum(int4) |
regoper | pg_operator | Ð¸Ð¼Ñ Ð¾Ð¿ÐµÑаÑоÑа | + |
regoperator | pg_operator | опеÑаÑÐ¾Ñ Ñ Ñипами аÑгÑменÑов | *(integer,integer) или -(NONE,integer) |
regclass | pg_class | Ð¸Ð¼Ñ Ð¾ÑноÑÐµÐ½Ð¸Ñ | pg_type |
regtype | pg_type | Ð¸Ð¼Ñ Ñипа даннÑÑ | integer |
regrole | pg_authid | Ð¸Ð¼Ñ Ñоли | smithee |
regnamespace | pg_namespace | пÑоÑÑÑанÑÑво имÑн | pg_catalog |
regconfig | pg_ts_config | конÑигÑÑаÑÐ¸Ñ ÑекÑÑового поиÑка | english |
regdictionary | pg_ts_dict | ÑловаÑÑ ÑекÑÑового поиÑка | simple |
ÐÑе ÑÐ¸Ð¿Ñ Ð¿Ñевдонимов OID Ð´Ð»Ñ Ð¾Ð±ÑекÑов, ÑгÑÑппиÑованнÑÑ
в пÑоÑÑÑанÑÑво имÑн, пÑинимаÑÑ Ð¸Ð¼ÐµÐ½Ð°, дополненнÑе именем ÑÑ
емÑ, и вÑводÑÑ Ð¸Ð¼ÐµÐ½Ð° Ñо ÑÑ
емой, еÑли даннÑй обÑÐµÐºÑ Ð½ÐµÐ»ÑÐ·Ñ Ð±ÑÐ´ÐµÑ Ð½Ð°Ð¹Ñи в ÑекÑÑем пÑÑи поиÑка без имени ÑÑ
емÑ. Ð¢Ð¸Ð¿Ñ regproc и regoper пÑинимаÑÑ ÑолÑко ÑникалÑнÑе вводимÑе имена (не пеÑегÑÑженнÑе), ÑÑо огÑаниÑÐ¸Ð²Ð°ÐµÑ Ð¸Ñ
пÑименимоÑÑÑ; в болÑÑинÑÑве ÑлÑÑаев лÑÑÑе иÑполÑзоваÑÑ regprocedure или regoperator. ÐÐ»Ñ Ñипа regoperator в запиÑи ÑнаÑного опеÑаÑоÑа неиÑполÑзÑемÑй опеÑанд заменÑеÑÑÑ Ñловом NONE.
ÐополниÑелÑнÑм ÑвойÑÑвом болÑÑинÑÑва Ñипов пÑевдонимов OID ÑвлÑеÑÑÑ Ð¾Ð±Ñазование завиÑимоÑÑей. Ðогда в ÑоÑ
ÑанÑнном вÑÑажении ÑигÑÑиÑÑÐµÑ ÐºÐ¾Ð½ÑÑанÑа одного из ÑÑиÑ
Ñипов (напÑимеÑ, в пÑедÑÑавлении или в знаÑении ÑÑолбÑа по ÑмолÑаниÑ), ÑÑо ÑоздаÑÑ Ð·Ð°Ð²Ð¸ÑимоÑÑÑ Ð¾Ñ Ñелевого обÑекÑа. ÐапÑимеÑ, еÑли знаÑение по ÑмолÑÐ°Ð½Ð¸Ñ Ð¾Ð¿ÑеделÑеÑÑÑ Ð²ÑÑажением nextval('my_seq'::regclass), Postgres Pro понимаеÑ, ÑÑо ÑÑо вÑÑажение завиÑÐ¸Ñ Ð¾Ñ Ð¿Ð¾ÑледоваÑелÑноÑÑи my_seq, и не Ð¿Ð¾Ð·Ð²Ð¾Ð»Ð¸Ñ ÑдалиÑÑ Ð¿Ð¾ÑледоваÑелÑноÑÑÑ ÑанÑÑе, Ñем бÑÐ´ÐµÑ Ñдалено ÑÑо вÑÑажение. ÐдинÑÑвеннÑм иÑклÑÑением ÑвлÑеÑÑÑ Ñип regrole. ÐонÑÑанÑÑ ÑÑого Ñипа в ÑакиÑ
вÑÑажениÑÑ
не допÑÑкаÑÑÑÑ.
ÐÑимеÑание
Ð¢Ð¸Ð¿Ñ Ð¿Ñевдонимов OID не полноÑÑÑÑ ÑледÑÑÑ Ð¿Ñавилам изолÑÑии ÑÑанзакÑий. ÐланиÑовÑик Ñоже воÑпÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ð¸Ñ ÐºÐ°Ðº пÑоÑÑÑе конÑÑанÑÑ, ÑÑо Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑивеÑÑи к неопÑималÑÐ½Ð¾Ð¼Ñ Ð¿Ð»Ð°Ð½Ð¸ÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð·Ð°Ð¿ÑоÑов.
ÐÑÑÑ ÐµÑÑ Ð¾Ð´Ð¸Ð½ Ñип ÑиÑÑемнÑÑ
иденÑиÑикаÑоÑов, xid, пÑедÑÑавлÑÑÑий иденÑиÑикаÑÐ¾Ñ ÑÑанзакÑии (ÑокÑаÑÑнно xact). ÐÑÐ¾Ñ Ñип имеÑÑ ÑиÑÑемнÑе ÑÑолбÑÑ xmin и xmax. ÐденÑиÑикаÑоÑÑ ÑÑанзакÑий опÑеделÑÑÑÑÑ 32-биÑнÑми ÑиÑлами.
ТÑеÑий Ñип иденÑиÑикаÑоÑов, иÑполÑзÑемÑÑ
в ÑиÑÑеме, â cid, иденÑиÑикаÑÐ¾Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ (command identifier). ÐÑÐ¾Ñ Ñип даннÑÑ
имеÑÑ ÑиÑÑемнÑе ÑÑолбÑÑ cmin и cmax. ÐденÑиÑикаÑоÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´ â ÑÑо Ñоже 32-биÑнÑе ÑиÑла.
РнаконеÑ, поÑледний Ñип ÑиÑÑемнÑÑ
иденÑиÑикаÑоÑов â tid, иденÑиÑикаÑÐ¾Ñ ÑÑÑоки/коÑÑежа (tuple identifier). ÐÑÐ¾Ñ Ñип даннÑÑ
Ð¸Ð¼ÐµÐµÑ ÑиÑÑемнÑй ÑÑÐ¾Ð»Ð±ÐµÑ ctid. ÐденÑиÑикаÑÐ¾Ñ ÐºÐ¾ÑÑежа пÑедÑÑавлÑÐµÑ Ñобой паÑÑ (из номеÑа блока и индекÑа коÑÑежа в блоке), иденÑиÑиÑиÑÑÑÑÑÑ ÑизиÑеÑкое ÑаÑположение ÑÑÑоки в ÑаблиÑе.
(ÐодÑобнее о ÑиÑÑемнÑÑ ÑÑолбÑÐ°Ñ ÑаÑÑказÑваеÑÑÑ Ð² Разделе 5.4.)