F.28. lo
ÐодÑÐ»Ñ lo поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ ÑпÑавление болÑÑими обÑекÑами (ÐРили LO, Large Objects, иногда BLOB, Binary Large OBjects). Ðн ÑеализÑÐµÑ Ñип даннÑÑ
lo и ÑÑÐ¸Ð³Ð³ÐµÑ lo_manage.
ÐаннÑй модÑÐ»Ñ ÑÑиÑаеÑÑÑ Â«Ð´Ð¾Ð²ÐµÑеннÑм», Ñо еÑÑÑ ÐµÐ³Ð¾ могÑÑ ÑÑÑанавливаÑÑ Ð¾Ð±ÑÑнÑе полÑзоваÑели, имеÑÑие пÑаво CREATE в ÑекÑÑей базе даннÑÑ
.
F.28.1. ÐбоÑнование
Ðдна из пÑоблем дÑайвеÑа JDBC (она ÑаÑпÑоÑÑÑанÑеÑÑÑ Ð¸ на дÑÐ°Ð¹Ð²ÐµÑ ODBC) в Ñом, ÑÑо ÑпеÑиÑикаÑÐ¸Ñ Ñипа пÑедполагаеÑ, ÑÑо ÑÑÑлки на BLOB Ñ ÑанÑÑÑÑ Ð² ÑаблиÑе, и еÑли запиÑÑ Ð¼ÐµÐ½ÑеÑÑÑ, ÑвÑзаннÑй BLOB ÑдалÑеÑÑÑ Ð¸Ð· базÑ.
Ðо Ñ Postgres Pro ÑÑого не пÑоиÑÑ Ð¾Ð´Ð¸Ñ. ÐолÑÑие обÑекÑÑ Ð¾Ð±ÑабаÑÑваÑÑÑÑ ÐºÐ°Ðº ÑамоÑÑоÑÑелÑнÑе обÑекÑÑ; запиÑÑ Ð² ÑаблиÑе Ð¼Ð¾Ð¶ÐµÑ ÑÑÑлаÑÑÑÑ Ð½Ð° болÑÑой обÑÐµÐºÑ Ð¿Ð¾ OID, но пÑи ÑÑом на один и ÑÐ¾Ñ Ð¶Ðµ обÑÐµÐºÑ Ð¼Ð¾Ð³ÑÑ ÑÑÑлаÑÑÑÑ Ð½ÐµÑколÑко запиÑей ÑаблиÑÑ, Ñак ÑÑо ÑиÑÑема не ÑдалÑÐµÑ Ð±Ð¾Ð»ÑÑой обÑекÑ, ÑолÑко поÑÐ¾Ð¼Ñ ÑÑо Ð²Ñ Ð¼ÐµÐ½ÑеÑе или ÑдалÑеÑе ÑакÑÑ Ð·Ð°Ð¿Ð¸ÑÑ.
ÐÑо не пÑоблема Ð´Ð»Ñ Ð¿Ñиложений, оÑиенÑиÑованнÑÑ Ð½Ð° Postgres Pro, но ÑÑандаÑÑнÑй код, иÑполÑзÑÑÑий JDBC или ODBC, не бÑÐ´ÐµÑ ÑдалÑÑÑ ÑÑи обÑекÑÑ, в ÑезÑлÑÑаÑе Ñего они окажÑÑÑÑ Ð¿Ð¾ÑеÑÑннÑми â обÑекÑами, коÑоÑÑе никак не задейÑÑвованÑ, а пÑоÑÑо занимаÑÑ Ð¼ÐµÑÑо на диÑке.
ÐодÑÐ»Ñ lo позволÑÐµÑ ÑеÑиÑÑ ÑÑÑ Ð¿ÑоблемÑ, добавлÑÑ ÑÑÐ¸Ð³Ð³ÐµÑ Ðº ÑаблиÑам, коÑоÑÑе ÑодеÑÐ¶Ð°Ñ ÑÑолбÑÑ, ÑÑÑлаÑÑиеÑÑ Ð½Ð° ÐÐ. ÐÑÐ¾Ñ ÑÑÐ¸Ð³Ð³ÐµÑ Ð¿Ð¾ ÑÑÑи пÑоÑÑо вÑзÑÐ²Ð°ÐµÑ lo_unlink, когда Ð²Ñ ÑдалÑеÑе или изменÑеÑе знаÑение, ÑÑÑлаÑÑееÑÑ Ð½Ð° болÑÑой обÑекÑ. ÐаннÑй ÑÑÐ¸Ð³Ð³ÐµÑ Ð¿ÑедполагаеÑ, ÑÑо на лÑбой болÑÑой обÑекÑ, на коÑоÑÑй ÑÑÑлаеÑÑÑ ÐºÐ¾Ð½ÑÑолиÑÑемÑй им ÑÑолбеÑ, ÑказÑÐ²Ð°ÐµÑ ÑолÑко одна ÑÑÑлка!
ÐÑÐ¾Ñ Ð¼Ð¾Ð´ÑÐ»Ñ Ñакже пÑедоÑÑавлÑÐµÑ Ñип даннÑÑ
lo, коÑоÑÑй пÑоÑÑо ÑвлÑеÑÑÑ Ð´Ð¾Ð¼ÐµÐ½Ð¾Ð¼ на базе oid. Ðн Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿Ð¾Ð»ÐµÐ·ÐµÐ½ Ð´Ð»Ñ Ð²ÑÐ´ÐµÐ»ÐµÐ½Ð¸Ñ ÑÑолбÑов, ÑодеÑжаÑиÑ
ÑÑÑлки на болÑÑие обÑекÑÑ, ÑÑеди ÑÑолбÑов, ÑодеÑжаÑиÑ
дÑÑгие OID. ÐÐ»Ñ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ ÑÑиггеÑа пÑименÑÑÑ Ñип lo необÑзаÑелÑно, но ÑÑÐ¾Ñ Ñип Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿Ð¾Ð»ÐµÐ·ÐµÐ½ Ð´Ð»Ñ Ð¾ÑÑÐ»ÐµÐ¶Ð¸Ð²Ð°Ð½Ð¸Ñ ÑÑолбÑов в ваÑей базе, пÑедÑÑавлÑÑÑиÑ
болÑÑие обÑекÑÑ, Ñ ÐºÐ¾ÑоÑÑми ÑабоÑÐ°ÐµÑ ÑÑиггеÑ. ÐÑоме Ñого, поÑÑÑпали ÑообÑениÑ, ÑÑо дÑÐ°Ð¹Ð²ÐµÑ ODBC не ÑабоÑÐ°ÐµÑ ÐºÐ¾ÑÑекÑно, еÑли Ð´Ð»Ñ ÑÑолбÑов BLOB иÑполÑзÑеÑÑÑ Ð½Ðµ Ñип lo.
F.28.2. Ðак его иÑполÑзоваÑÑ
ÐÑÐ¸Ð¼ÐµÑ ÐµÐ³Ð¾ иÑполÑзованиÑ:
CREATE TABLE image (title text, raster lo);
CREATE TRIGGER t_raster BEFORE UPDATE OR DELETE ON image
FOR EACH ROW EXECUTE FUNCTION lo_manage(raster);ÐÐ»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ ÑÑолбÑа, коÑоÑÑй бÑÐ´ÐµÑ ÑодеÑжаÑÑ ÑникалÑнÑе ÑÑÑлки на болÑÑие обÑекÑÑ, ÑоздайÑе ÑÑÐ¸Ð³Ð³ÐµÑ BEFORE UPDATE OR DELETE и пеÑедайÑе Ð¸Ð¼Ñ ÑÑолбÑа в каÑеÑÑве единÑÑвенного аÑгÑменÑа ÑÑиггеÑа. ÐÑ Ñакже можеÑе ÑделаÑÑ, ÑÑÐ¾Ð±Ñ ÑÑÐ¸Ð³Ð³ÐµÑ ÑÑабаÑÑвал ÑолÑко пÑи изменениÑÑ
в ÑÑолбÑе, Ñказав BEFORE UPDATE OF имÑ_ÑÑолбÑа. ÐÑли вам нÑжно имеÑÑ Ð² одной ÑаблиÑе неÑколÑко ÑÑолбÑов lo, ÑоздайÑе оÑделÑнÑй ÑÑÐ¸Ð³Ð³ÐµÑ Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ (пÑи ÑÑом обÑзаÑелÑно нÑжно даÑÑ Ð²Ñем ÑÑиггеÑам в одной ÑаблиÑе ÑазнÑе имена).
F.28.3. ÐгÑаниÑениÑ
ÐÑи Ñдалении ÑаблиÑÑ, однако, вÑÑ Ñавно бÑдÑÑ Ð¿Ð¾ÑеÑÑÐ½Ñ Ð¾ÑноÑÑÑиеÑÑ Ðº ней обÑекÑÑ, Ñак как ÑÑÐ¸Ð³Ð³ÐµÑ Ð½Ðµ бÑÐ´ÐµÑ Ð²ÑполнÑÑÑÑÑ. ÐÑого можно избежаÑÑ, вÑполнив пеÑед
DROP TABLEкомандÑDELETE FROM.ÑаблиÑаТо же каÑаеÑÑÑ Ð¸ командÑ
TRUNCATE.ÐÑли Ñ Ð²Ð°Ñ Ñже еÑÑÑ, или Ð²Ñ Ð¿Ð¾Ð´Ð¾Ð·ÑеваеÑе, ÑÑо еÑÑÑ Ð¿Ð¾ÑеÑÑннÑе болÑÑие обÑекÑÑ, обÑаÑиÑе внимание на модÑÐ»Ñ vacuumlo, коÑоÑÑй Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾Ð¼Ð¾ÑÑ Ð²ÑÑиÑÑиÑÑ Ð¸Ñ . ÐÐ¼ÐµÐµÑ ÑмÑÑл пеÑиодиÑеÑки запÑÑкаÑÑ vacuumlo в каÑеÑÑве меÑÑ, дополнÑÑÑей дейÑÑвие ÑÑиггеÑа
lo_manage.ÐекоÑоÑÑе клиенÑÑкие пÑогÑÐ°Ð¼Ð¼Ñ Ð¼Ð¾Ð³ÑÑ ÑоздаваÑÑ ÑобÑÑвеннÑе ÑаблиÑÑ, но не ÑоздаваÑÑ Ð´Ð»Ñ Ð½Ð¸Ñ ÑооÑвеÑÑÑвÑÑÑие ÑÑиггеÑÑ. ÐÑоме Ñого, и полÑзоваÑели могÑÑ Ð½Ðµ ÑоздаваÑÑ Ñакие ÑÑиггеÑÑ (забÑÐ²Ð°Ñ Ð¾ Ð½Ð¸Ñ , либо не знаÑ, как ÑÑо ÑделаÑÑ).
F.28.4. ÐвÑоÑ
ÐиÑÐµÑ ÐаÑÐ½Ñ <[email protected]>