38.1. УÑÑановка пÑоÑедÑÑнÑÑ ÑзÑков
ÐÑежде вÑего, пÑоÑедÑÑнÑй ÑзÑк должен бÑÑÑ Â«ÑÑÑановлен» в каждÑÑ Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
, где он бÑÐ´ÐµÑ Ð¸ÑполÑзоваÑÑÑÑ. Ðо пÑоÑедÑÑнÑе ÑзÑки, ÑÑÑанавливаемÑе в Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
template1, авÑомаÑиÑеÑки ÑÑановÑÑÑÑ Ð´Ð¾ÑÑÑпнÑми во вÑеÑ
впоÑледÑÑвии ÑоздаваемÑÑ
базаÑ
, Ñак как иÑ
опÑÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð² template1 бÑдÑÑ ÑкопиÑÐ¾Ð²Ð°Ð½Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¾Ð¹ CREATE DATABASE. Таким обÑазом, админиÑÑÑаÑÐ¾Ñ Ð±Ð°Ð· даннÑÑ
Ð¼Ð¾Ð¶ÐµÑ Ð²ÑбÑаÑÑ, какие ÑзÑки бÑдÑÑ Ð´Ð¾ÑÑÑÐ¿Ð½Ñ Ð² опÑеделÑннÑÑ
базаÑ
даннÑÑ
, и пÑи желании ÑделаÑÑ Ð½ÐµÐºÐ¾ÑоÑÑе ÑзÑки доÑÑÑпнÑми по ÑмолÑаниÑ.
ÐÐ»Ñ ÑзÑков, вклÑÑÑннÑÑ
в ÑÑандаÑÑнÑй диÑÑÑибÑÑив, доÑÑаÑоÑно вÑполниÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ CREATE EXTENSION имÑ_ÑзÑка, ÑÑÐ¾Ð±Ñ ÑÑÑановиÑÑ ÑзÑк в ÑекÑÑÑÑ Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
. ЧÑÐ¾Ð±Ñ ÑделаÑÑ ÑÑо из командной ÑÑÑоки оболоÑки, Ñакже можно воÑполÑзоваÑÑÑÑ Ð¿ÑогÑаммой createlang. ÐапÑимеÑ, ÑÑÐ¾Ð±Ñ ÑÑÑановиÑÑ Ð² Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
template1 ÑзÑк PL/Perl, вÑполниÑе:
createlang plperl template1
ÐпиÑÐ°Ð½Ð½Ð°Ñ Ð½Ð¸Ð¶Ðµ ÑÑÑÐ½Ð°Ñ Ð¿ÑоÑедÑÑа ÑекомендÑеÑÑÑ ÑолÑко Ð´Ð»Ñ ÑÑÑановки ÑзÑков, не ÑпакованнÑÑ Ð² виде ÑаÑÑиÑений.
УÑÑановка пÑоÑедÑÑного ÑзÑка вÑÑÑнÑÑ
ÐÑоÑедÑÑнÑй ÑзÑк ÑÑÑанавливаеÑÑÑ Ð² Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
в пÑÑÑ ÑÑапов, и вÑполнÑÑÑ Ð¸Ñ
должен админиÑÑÑаÑÐ¾Ñ Ð±Ð°Ð· даннÑÑ
. РболÑÑинÑÑве ÑлÑÑаев необÑ
одимÑе ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ SQL ÑледÑÐµÑ ÑпаковаÑÑ Ð² виде ÑÑÑановоÑного ÑкÑипÑа «ÑаÑÑиÑениÑ», ÑÑÐ¾Ð±Ñ Ð¸Ñ
можно бÑло вÑполниÑÑ, воÑполÑзовавÑиÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¾Ð¹ CREATE EXTENSION.
РазделÑемÑй обÑÐµÐºÑ Ð´Ð»Ñ Ð¾Ð±ÑабоÑÑика ÑзÑка должен бÑÑÑ ÑкомпилиÑован и ÑÑÑановлен в ÑооÑвеÑÑÑвÑÑÑий каÑалог библиоÑек. ÐÑо в пÑинÑипе не оÑлиÑаеÑÑÑ Ð¾Ñ ÑбоÑки и ÑÑÑановки дополниÑелÑнÑÑ Ð¼Ð¾Ð´Ñлей Ñ Ð¾Ð±ÑÑнÑми ÑÑнкÑиÑми на ÑзÑке C; Ñм. ÐодÑаздел 34.9.6. ЧаÑÑо обÑабоÑÑик ÑзÑка завиÑÐ¸Ñ Ð¾Ñ Ð²Ð½ÐµÑней библиоÑеки, в коÑоÑой ÑобÑÑвенно Ñеализован иÑполниÑÐµÐ»Ñ ÑзÑка пÑогÑаммиÑованиÑ; в ÑÐ°ÐºÐ¸Ñ ÑлÑÑаÑÑ Ð½Ñжно ÑÑÑановиÑÑ Ð¸ ÑÑÑ Ð±Ð¸Ð±Ð»Ð¸Ð¾ÑекÑ.
ÐбÑабоÑÑик должен бÑÑÑ Ð¾Ð±ÑÑвлен командой
CREATE FUNCTION
имÑ_ÑÑнкÑии_обÑабоÑÑика() RETURNS language_handler AS 'пÑÑÑ-к-ÑазделÑемомÑ-обÑекÑÑ' LANGUAGE C;СпеÑиалÑнÑй Ñип возвÑаÑа
language_handlerговоÑÐ¸Ñ Ð¡Ð£ÐÐ, ÑÑо ÑÑа ÑÑнкÑÐ¸Ñ Ð½Ðµ возвÑаÑÐ°ÐµÑ ÐºÐ°ÐºÐ¾Ð¹-либо опÑеделÑннÑй Ñип даннÑÑ SQL, и знаÑÐ¸Ñ ÐµÑ Ð½ÐµÐ»ÑÐ·Ñ Ð¸ÑполÑзоваÑÑ Ð½ÐµÐ¿Ð¾ÑÑедÑÑвенно в опеÑаÑоÑÐ°Ñ SQL.ÐополниÑелÑно обÑабоÑÑик ÑзÑка Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑедоÑÑавиÑÑ ÑÑнкÑÐ¸Ñ Ð¾Ð±ÑабоÑки «внедÑÑнного кода», коÑоÑÐ°Ñ Ð±ÑÐ´ÐµÑ Ð²ÑполнÑÑÑ Ð°Ð½Ð¾Ð½Ð¸Ð¼Ð½Ñе блоки кода (ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ DO), напиÑаннÑе на ÑÑом ÑзÑке. ÐÑли Ð´Ð»Ñ ÑзÑка еÑÑÑ Ð¾Ð±ÑабоÑÑик внедÑÑнного кода, обÑÑвиÑе его Ñакой командой:
CREATE FUNCTION
имÑ_обÑабоÑÑика_внедÑÑнного_кода(internal) RETURNS void AS 'пÑÑÑ-к-ÑазделÑемомÑ-обÑекÑÑ' LANGUAGE C;ÐÑоме Ñого, обÑабоÑÑик ÑзÑка Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑедоÑÑавиÑÑ ÑÑнкÑÐ¸Ñ Â«Ð¿ÑовеÑки», коÑоÑÐ°Ñ Ð±ÑÐ´ÐµÑ Ð¿ÑовеÑÑÑÑ ÐºÐ¾ÑÑекÑноÑÑÑ Ð¾Ð¿ÑÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ ÑÑнкÑии, ÑобÑÑвенно не вÑполнÑÑ ÐµÑ. ФÑнкÑÐ¸Ñ Ð¿ÑовеÑки, еÑли она ÑÑÑеÑÑвÑеÑ, вÑзÑваеÑÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¾Ð¹
CREATE FUNCTION. ÐÑли ÑÐ°ÐºÐ°Ñ ÑÑнкÑÐ¸Ñ Ð´Ð»Ñ ÑзÑка опÑеделена, обÑÑвиÑе ÐµÑ Ñакой командой:CREATE FUNCTION
имÑ_ÑÑнкÑии_пÑовеÑки(oid) RETURNS void AS 'пÑÑÑ-к-ÑазделÑемомÑ-обÑекÑÑ' LANGUAGE C STRICT;ÐаконеÑ, пÑоÑедÑÑнÑй ÑзÑк должен бÑÑÑ Ð¾Ð±ÑÑвлен командой
CREATE [TRUSTED] [PROCEDURAL] LANGUAGE
имÑ_ÑзÑкаHANDLERимÑ_ÑÑнкÑии_обÑабоÑÑика[INLINEимÑ_обÑабоÑÑика_внедÑÑнного_кода] [VALIDATORимÑ_ÑÑнкÑии_пÑовеÑки] ;ÐеобÑзаÑелÑное клÑÑевое Ñлово
TRUSTED(довеÑеннÑй) ÑказÑваеÑ, ÑÑо ÑзÑк не пÑедоÑÑавлÑÐµÑ Ð¿Ð¾Ð»ÑзоваÑÐµÐ»Ñ Ð´Ð¾ÑÑÑп к даннÑм, коÑоÑого он не имел Ð±Ñ Ð±ÐµÐ· него. ÐовеÑеннÑе ÑзÑки пÑедназнаÑÐµÐ½Ñ Ð´Ð»Ñ Ð¾Ð±ÑÑнÑÑ Ð¿Ð¾Ð»ÑзоваÑелей баз даннÑÑ , не имеÑÑÐ¸Ñ Ð¿Ñав ÑÑпеÑполÑзоваÑелÑ, и Ð¸Ñ Ð¼Ð¾Ð¶Ð½Ð¾ иÑполÑзоваÑÑ Ð´Ð»Ñ Ð±ÐµÐ·Ð¾Ð¿Ð°Ñного ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÑÑнкÑий и ÑÑиггеÑнÑÑ Ð¿ÑоÑедÑÑ. Так как ÑÑнкÑии PL вÑполнÑÑÑÑÑ Ð²Ð½ÑÑÑи ÑеÑвеÑа баз даннÑÑ , ÑлагTRUSTEDÑледÑÐµÑ ÑÑÑанавливаÑÑ ÑолÑко Ð´Ð»Ñ ÑÐµÑ ÑзÑков, коÑоÑÑе не позволÑÑÑ Ð¾Ð±ÑаÑаÑÑÑÑ Ðº внÑÑÑенним Ð¼ÐµÑ Ð°Ð½Ð¸Ð·Ð¼Ð°Ð¼ ÑеÑвеÑа или Ñайловой ÑиÑÑеме. ЯзÑки PL/pgSQL, PL/Tcl и PL/Perl ÑÑиÑаÑÑÑÑ Ð´Ð¾Ð²ÐµÑеннÑми; ÑзÑки PL/TclU, PL/PerlU и PL/PythonU пÑедоÑÑавлÑÑÑ Ð½ÐµÐ¾Ð³ÑаниÑеннÑÑ ÑÑнкÑионалÑноÑÑÑ, и Ð¸Ñ Ð½Ðµ ÑледÑÐµÑ Ð¿Ð¾Ð¼ÐµÑаÑÑ ÐºÐ°Ðº довеÑеннÑе.
ÐÑимеÑе 38.1 показÑваеÑ, как вÑполнÑеÑÑÑ Ð¿ÑоÑедÑÑа ÑÑÑной ÑÑÑановки Ð´Ð»Ñ ÑзÑка PL/Perl.
ÐÑÐ¸Ð¼ÐµÑ 38.1. УÑÑановка PL/Perl вÑÑÑнÑÑ
СледÑÑÑÐ°Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð° говоÑÐ¸Ñ ÑеÑвеÑÑ Ð±Ð°Ð· даннÑÑ , где найÑи ÑазделÑемÑй обÑÐµÐºÑ Ð´Ð»Ñ ÑÑнкÑии-обÑабоÑÑика ÑзÑка PL/Perl:
CREATE FUNCTION plperl_call_handler() RETURNS language_handler AS
'$libdir/plperl' LANGUAGE C;ÐÐ»Ñ PL/Perl ÑÐµÐ°Ð»Ð¸Ð·Ð¾Ð²Ð°Ð½Ñ Ð¾Ð±ÑабоÑÑик внедÑÑнного кода и ÑÑнкÑÐ¸Ñ Ð¿ÑовеÑки, Ñак ÑÑо Ð¸Ñ Ð¼Ñ Ñоже обÑÑвим:
CREATE FUNCTION plperl_inline_handler(internal) RETURNS void AS
'$libdir/plperl' LANGUAGE C;
CREATE FUNCTION plperl_validator(oid) RETURNS void AS
'$libdir/plperl' LANGUAGE C STRICT;СледÑÑÑÐ°Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð°:
CREATE TRUSTED PROCEDURAL LANGUAGE plperl
HANDLER plperl_call_handler
INLINE plperl_inline_handler
VALIDATOR plperl_validator; опÑеделÑеÑ, ÑÑо Ñанее обÑÑвленнÑе ÑÑнкÑии Ð´Ð¾Ð»Ð¶Ð½Ñ Ð²ÑзÑваÑÑÑÑ Ð´Ð»Ñ ÑÑнкÑий и ÑÑиггеÑнÑÑ
пÑоÑедÑÑ Ñ Ð°ÑÑибÑÑом ÑзÑка plperl.
Ð ÑÑандаÑÑной инÑÑаллÑÑии Postgres Pro обÑабоÑÑик ÑзÑка PL/pgSQL Ñже ÑобÑан и ÑÑÑановлен в каÑалог «библиоÑек»; более Ñого, Ñам ÑзÑк PL/pgSQL ÑÑÑановлен во вÑÐµÑ Ð±Ð°Ð·Ð°Ñ Ð´Ð°Ð½Ð½ÑÑ . ÐÑли пÑи ÑбоÑке ÑконÑигÑÑиÑована поддеÑжка Tcl, Ñо обÑабоÑÑики Ð´Ð»Ñ PL/Tcl и PL/TclU ÑобиÑаÑÑÑÑ Ð¸ ÑÑÑанавливаÑÑÑÑ Ð² каÑалог библиоÑек, но Ñам ÑзÑк по ÑмолÑÐ°Ð½Ð¸Ñ Ð² Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ Ð½Ðµ ÑÑÑанавливаеÑÑÑ. ÐодобнÑм обÑазом, еÑли ÑконÑигÑÑиÑована поддеÑжка Perl, ÑобиÑаÑÑÑÑ Ð¸ ÑÑÑанавливаÑÑÑÑ Ð¾Ð±ÑабоÑÑики PL/Perl и PL/PerlU, а пÑи вклÑÑении поддеÑжки Python ÑÑÑанавливаеÑÑÑ Ð¾Ð±ÑабоÑÑик PL/PythonU, но в Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ ÑÑи ÑзÑки по ÑмолÑÐ°Ð½Ð¸Ñ Ð½Ðµ ÑÑÑанавливаÑÑÑÑ.