34.4. СеÑвеÑнÑе ÑÑнкÑии
ФÑнкÑии, пÑедназнаÑеннÑе Ð´Ð»Ñ ÑабоÑÑ Ñ Ð±Ð¾Ð»ÑÑими обÑекÑами на ÑÑоÑоне ÑеÑвеÑа из SQL, пеÑеÑиÑÐ»ÐµÐ½Ñ Ð² ТаблиÑе 34.1.
ТаблиÑа 34.1. SQL-оÑиенÑиÑованнÑе ÑÑнкÑии Ð´Ð»Ñ ÑабоÑÑ Ñ Ð±Ð¾Ð»ÑÑими обÑекÑами
Ðаждой из клиенÑÑкиÑ
ÑÑнкÑий, опиÑаннÑÑ
Ñанее, ÑооÑвеÑÑÑвÑÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑе ÑÑнкÑии на ÑÑоÑоне ÑеÑвеÑа; на Ñамом деле, по болÑÑей ÑаÑÑи клиенÑÑкие ÑÑнкÑии пÑедÑÑавлÑÑÑ Ñобой пÑоÑÑо инÑеÑÑейÑÑ Ðº ÑавнознаÑнÑм ÑеÑвеÑнÑм ÑÑнкÑиÑм. Ð ÑÑнкÑиÑм, коÑоÑÑе Ñак же Ñдобно вÑзÑваÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð°Ð¼Ð¸ SQL, оÑноÑÑÑÑÑ: lo_creat, lo_create, lo_unlink, lo_import и lo_export. Ðиже пÑÐ¸Ð²ÐµÐ´ÐµÐ½Ñ Ð¿ÑимеÑÑ Ð¸Ñ
иÑполÑзованиÑ:
CREATE TABLE image (
name text,
raster oid
);
SELECT lo_creat(-1); -- возвÑаÑÐ°ÐµÑ OID нового пÑÑÑого болÑÑого обÑекÑа
SELECT lo_create(43213); -- пÑÑаеÑÑÑ ÑоздаÑÑ Ð±Ð¾Ð»ÑÑой обÑÐµÐºÑ Ñ OID 43213
SELECT lo_unlink(173454); -- ÑдалÑÐµÑ Ð±Ð¾Ð»ÑÑой обÑÐµÐºÑ Ñ OID 173454
INSERT INTO image (name, raster)
VALUES ('beautiful image', lo_import('/etc/motd'));
INSERT INTO image (name, raster) -- Ñо же, ÑÑо вÑÑе, но Ñ Ð¿ÑедопÑеделÑннÑм OID
VALUES ('beautiful image', lo_import('/etc/motd', 68583));
SELECT lo_export(image.raster, '/tmp/motd') FROM image
WHERE name = 'beautiful image';СеÑвеÑнÑе ÑÑнкÑии lo_import и lo_export знаÑиÑелÑно оÑлиÑаÑÑÑÑ Ð¾Ñ Ð¸Ñ
аналогов, вÑполнÑемÑÑ
на ÑÑоÑоне клиенÑа. ÐÑи две ÑÑнкÑии ÑиÑаÑÑ Ð¸ пиÑÑÑ ÑÐ°Ð¹Ð»Ñ Ð² Ñайловой ÑиÑÑеме ÑеÑвеÑа Ñ Ð¿Ñавами полÑзоваÑелÑ-владелÑÑа Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
. ÐоÑÑÐ¾Ð¼Ñ Ð¿Ð¾ ÑмолÑÐ°Ð½Ð¸Ñ Ð¸ÑполÑзоваÑÑ Ð¸Ñ
ÑазÑеÑено ÑолÑко ÑÑпеÑполÑзоваÑелÑм. ÐлиенÑÑкие ÑÑнкÑии импоÑÑа и ÑкÑпоÑÑа, напÑоÑив, иÑполÑзÑÑÑ Ð¿Ñава клиенÑÑкой пÑогÑÐ°Ð¼Ð¼Ñ Ð´Ð»Ñ ÑÑÐµÐ½Ð¸Ñ Ð¸ запиÑи Ñайлов в Ñайловой ÑиÑÑеме клиенÑа. ÐÐ»Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÐºÐ»Ð¸ÐµÐ½ÑÑкиÑ
ÑÑнкÑий никакие пÑава в базе даннÑÑ
не ÑÑебÑеÑÑÑ, кÑоме пÑава на ÑÑение или запиÑÑ ÑÑебÑемого болÑÑого обÑекÑа.
Ðнимание
ÐÑполÑзование ÑеÑвеÑнÑÑ
ÑÑнкÑий lo_import и lo_export можно ÑазÑеÑиÑÑ (воÑполÑзовавÑиÑÑ GRANT) не ÑолÑко ÑÑпеÑполÑзоваÑелÑм, но пÑи ÑÑом ÑледÑÐµÑ ÑеÑÑÑзно оÑениÑÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ñе ÑгÑÐ¾Ð·Ñ Ð±ÐµÐ·Ð¾Ð¿Ð°ÑноÑÑи. ÐлонамеÑеннÑй полÑзоваÑелÑ, Ð¸Ð¼ÐµÑ Ñакие пÑава, легко Ð¼Ð¾Ð¶ÐµÑ ÑÑаÑÑ ÑÑпеÑполÑзоваÑелем (напÑимеÑ, пеÑезапиÑав ÑÐ°Ð¹Ð»Ñ ÐºÐ¾Ð½ÑигÑÑаÑии ÑеÑвеÑа) или аÑаковаÑÑ Ð´ÑÑгие облаÑÑи Ñайловой ÑиÑÑÐµÐ¼Ñ ÑеÑвеÑа, не ÑÑÑемÑÑÑ Ð¿Ð¾Ð»ÑÑиÑÑ Ð¿Ð¾Ð»Ð½Ð¾Ð¼Ð¾ÑÐ¸Ñ ÑÑпеÑполÑзоваÑÐµÐ»Ñ Ð² базе даннÑÑ
. ÐоÑÑÐ¾Ð¼Ñ Ð´Ð¾ÑÑÑп к ÑолÑм Ñ Ñакими пÑавами должен огÑаниÑиваÑÑÑÑ Ñак же ÑÑÑого, как и доÑÑÑп к ÑолÑм ÑÑпеÑполÑзоваÑелей. Тем не менее, еÑли ÑеÑвеÑнÑе ÑÑнкÑии lo_import и lo_export необÑ
одимо пÑименÑÑÑ Ð´Ð»Ñ ÐºÐ°ÐºÐ¸Ñ
-либо ÑегÑлÑÑнÑÑ
опеÑаÑий, безопаÑнее бÑÐ´ÐµÑ Ð¸ÑполÑзоваÑÑ ÑÐ¾Ð»Ñ Ñ Ñакими пÑавами, Ñем Ñ Ð¿Ñавами ÑÑпеÑполÑзоваÑелÑ, Ñак как ÑÑо Ð¿Ð¾Ð¼Ð¾Ð³Ð°ÐµÑ Ð¿ÑедоÑ
ÑаниÑÑÑÑ Ð¾Ñ ÑлÑÑайнÑÑ
оÑибок.
ФÑнкÑионалÑноÑÑÑ lo_read и lo_write Ñакже пÑедÑÑавлÑеÑÑÑ ÑеÑез вÑÐ·Ð¾Ð²Ñ Ð½Ð° ÑÑоÑоне ÑеÑвеÑа, но имена ÑеÑвеÑнÑÑ
ÑÑнкÑий, в оÑлиÑие Ð¾Ñ ÐºÐ»Ð¸ÐµÐ½ÑÑкиÑ
, не ÑодеÑÐ¶Ð°Ñ ÑÐ¸Ð¼Ð²Ð¾Ð»Ñ Ð¿Ð¾Ð´ÑÑÑкиваниÑ. ÐÑи ÑÑнкÑии нÑжно вÑзÑваÑÑ Ð¿Ð¾ именам loread и lowrite.