CREATE LANGUAGE
CREATE LANGUAGE â ÑоздаÑÑ Ð¿ÑоÑедÑÑнÑй ÑзÑк
СинÑакÑиÑ
CREATE [ OR REPLACE ] [ TRUSTED ] [ PROCEDURAL ] LANGUAGEимÑHANDLERобÑабоÑÑик_вÑзова[ INLINEобÑабоÑÑик_внедÑÑнного_кода] [ VALIDATORÑÑнкÑиÑ_пÑовеÑки] CREATE [ OR REPLACE ] [ TRUSTED ] [ PROCEDURAL ] LANGUAGEимÑ
ÐпиÑание
CREATE LANGUAGE ÑегиÑÑÑиÑÑÐµÑ Ð² базе даннÑÑ
PostgreSQL новÑй пÑоÑедÑÑнÑй ÑзÑк. ÐпоÑледÑÑвии на ÑÑом ÑзÑке можно бÑÐ´ÐµÑ Ð¾Ð¿ÑеделÑÑÑ Ð½Ð¾Ð²Ñе ÑÑнкÑии и пÑоÑедÑÑÑ.
CREATE LANGUAGE по ÑÑÑи ÑвÑзÑÐ²Ð°ÐµÑ Ð¸Ð¼Ñ ÑзÑка Ñ ÑÑнкÑиÑми-обÑабоÑÑиками, иÑполнÑÑÑими код, напиÑаннÑй на ÑÑом ÑзÑке. Ðа дополниÑелÑнÑми ÑведениÑми о ÑзÑковÑÑ
обÑабоÑÑикаÑ
обÑаÑиÑеÑÑ Ðº Ðлаве 57.
CREATE OR REPLACE LANGUAGE ÑоздаÑÑ Ð½Ð¾Ð²Ñй ÑзÑк или заменÑÐµÑ Ð¾Ð¿Ñеделение ÑÑÑеÑÑвÑÑÑего. ÐÑли ÑзÑк ÑÑÑеÑÑвÑеÑ, его паÑамеÑÑÑ Ð¸Ð·Ð¼ÐµÐ½ÑÑÑÑÑ Ð² ÑооÑвеÑÑÑвии Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¾Ð¹, но Ð²Ð»Ð°Ð´ÐµÐ»ÐµÑ ÑзÑка и пÑава доÑÑÑпа к Ð½ÐµÐ¼Ñ Ð½Ðµ менÑÑÑÑÑ. ÐÑе Ñже напиÑаннÑе на ÑÑом ÑзÑке ÑÑнкÑии Ñакже ÑÑиÑаÑÑÑÑ ÐºÐ¾ÑÑекÑнÑми.
ÐÐ»Ñ Ñого, ÑÑÐ¾Ð±Ñ Ð·Ð°ÑегиÑÑÑиÑоваÑÑ Ð½Ð¾Ð²Ñй ÑзÑк или измениÑÑ Ð¿Ð°ÑамеÑÑÑ ÑÑÑеÑÑвÑÑÑего, Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ бÑÑÑ ÑÑпеÑполÑзоваÑелем PostgreSQL. Ðднако поÑле Ñого, как ÑзÑк Ñоздан, владелÑÑем его можно назнаÑиÑÑ Ð¾Ð±ÑÑного полÑзоваÑелÑ, коÑоÑÑй заÑем ÑÐ¼Ð¾Ð¶ÐµÑ ÑдалиÑÑ Ð¸Ð»Ð¸ пеÑеименоваÑÑ ÐµÐ³Ð¾, измениÑÑ Ð¿Ñава доÑÑÑпа к немÑ, или назнаÑиÑÑ Ð´ÑÑгого владелÑÑа. (Ðднако нелÑÐ·Ñ Ð½Ð°Ð·Ð½Ð°ÑаÑÑ Ð¾Ð±ÑÑного полÑзоваÑÐµÐ»Ñ Ð²Ð»Ð°Ð´ÐµÐ»ÑÑем нижележаÑÐ¸Ñ ÑÑнкÑий на С â ÑÑо даÑÑ ÐµÐ¼Ñ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑÑ Ð¿Ð¾Ð²ÑÑиÑÑ Ñвои пÑивилегии.)
ФоÑма CREATE LANGUAGE, в коÑоÑой не задаÑÑÑÑ Ð½Ð¸ÐºÐ°ÐºÐ¾Ð¹ обÑабоÑÑик, ÑвлÑеÑÑÑ ÑÑÑаÑевÑей. ÐÐ»Ñ Ð¾Ð±ÑаÑной ÑовмеÑÑимоÑÑи Ñо ÑÑаÑÑми копиÑми в ÑоÑмаÑе ÑкÑипÑа она воÑпÑинимаеÑÑÑ ÐºÐ°Ðº CREATE EXTENSION и бÑÐ´ÐµÑ ÑабоÑаÑÑ, еÑли ÑзÑк Ñпакован в ÑаÑÑиÑение Ñ Ñем же именем, как обÑÑно и оÑоÑмлÑÑÑÑÑ Ð¿ÑоÑедÑÑнÑе ÑзÑки.
ÐаÑамеÑÑÑ
TRUSTEDУказание
TRUSTED(довеÑеннÑй) ознаÑаеÑ, ÑÑо ÑзÑк не даÑÑ Ð¿Ð¾Ð»ÑзоваÑÐµÐ»Ñ Ð´Ð¾ÑÑÑп к даннÑм, к коÑоÑÑм он не имел Ð±Ñ Ð´Ð¾ÑÑÑпа без него. ÐÑли пÑи ÑегиÑÑÑаÑии ÑзÑка ÑÑо клÑÑевое Ñлово опÑÑено, иÑполÑзоваÑÑ ÑÑÐ¾Ñ ÑзÑк Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð½Ð¾Ð²ÑÑ ÑÑнкÑий ÑмогÑÑ ÑолÑко ÑÑпеÑполÑзоваÑели PostgreSQL.PROCEDURALÐÑо Ñлово не неÑÑÑ ÑмÑÑловой нагÑÑзки.
имÑÐÐ¼Ñ Ð¿ÑоÑедÑÑного ÑзÑка. Ðно должно бÑÑÑ ÑникалÑнÑм ÑÑеди вÑÐµÑ ÑзÑков в базе даннÑÑ .
HANDLERобÑабоÑÑик_вÑзоваÐдеÑÑ
обÑабоÑÑик_вÑзоваâ Ð¸Ð¼Ñ Ñанее заÑегиÑÑÑиÑованной ÑÑнкÑии, коÑоÑÐ°Ñ Ð±ÑÐ´ÐµÑ Ð²ÑзÑваÑÑÑÑ Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¿ÑоÑедÑÑ (ÑÑнкÑий) на ÑÑом ÑзÑке. ÐбÑабоÑÑик вÑзова Ð´Ð»Ñ Ð¿ÑоÑедÑÑного ÑзÑка должен бÑÑÑ Ð½Ð°Ð¿Ð¸Ñан на компилиÑÑемом ÑзÑке, напÑимеÑ, на C, Ñ ÑоглаÑениÑми о вÑÐ·Ð¾Ð²Ð°Ñ Ð²ÐµÑÑии 1 и заÑегиÑÑÑиÑован в PostgreSQL как ÑÑнкÑÐ¸Ñ Ð±ÐµÐ· аÑгÑменÑов, возвÑаÑаÑÑÐ°Ñ ÑикÑивнÑй Ñипlanguage_handler, коÑоÑÑй пÑоÑÑо показÑваеÑ, ÑÑо ÑÑа ÑÑнкÑÐ¸Ñ â обÑабоÑÑик вÑзова.INLINEобÑабоÑÑик_внедÑÑнного_кодаÐдеÑÑ
обÑабоÑÑик_внедÑÑнного_кодаâ Ð¸Ð¼Ñ Ñанее заÑегиÑÑÑиÑованной ÑÑнкÑии, коÑоÑÐ°Ñ Ð±ÑÐ´ÐµÑ Ð²ÑзÑваÑÑÑÑ Ð´Ð»Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð°Ð½Ð¾Ð½Ð¸Ð¼Ð½Ð¾Ð³Ð¾ блока кода (командÑDO) на ÑÑом ÑзÑке. ÐÑлиобÑабоÑÑик_внедÑÑнного_кодане опÑеделÑн, даннÑй ÑзÑк не бÑÐ´ÐµÑ Ð¿Ð¾Ð´Ð´ÐµÑживаÑÑ Ð°Ð½Ð¾Ð½Ð¸Ð¼Ð½Ñе блоки кода. ÐÑÐ¾Ñ Ð¾Ð±ÑабоÑÑик должен пÑинимаÑÑ Ð¾Ð´Ð¸Ð½ аÑгÑÐ¼ÐµÐ½Ñ Ñипаinternal, ÑодеÑжаÑий внÑÑÑеннее пÑедÑÑавление командÑDO, и обÑÑно возвÑаÑÐ°ÐµÑ Ñипvoid. ÐнаÑение, возвÑаÑаемое ÑÑим обÑабоÑÑиком, игноÑиÑÑеÑÑÑ.VALIDATORÑÑнкÑиÑ_пÑовеÑкиÐдеÑÑ
ÑÑнкÑиÑ_пÑовеÑкиâ Ð¸Ð¼Ñ Ñанее заÑегиÑÑÑиÑованной ÑÑнкÑии, коÑоÑÐ°Ñ Ð±ÑÐ´ÐµÑ Ð²ÑзÑваÑÑÑÑ Ð¿Ñи Ñоздании новой ÑÑнкÑии на ÑÑом ÑзÑке и пÑовеÑÑÑÑ ÐµÑ. ÐÑли ÑÑнкÑÐ¸Ñ Ð¿ÑовеÑки не задана, ÑÑнкÑии на ÑÑом ÑзÑке пÑи Ñоздании пÑовеÑÑÑÑÑÑ Ð½Ðµ бÑдÑÑ. ФÑнкÑÐ¸Ñ Ð¿ÑовеÑки должна пÑинимаÑÑ Ð¾Ð´Ð¸Ð½ аÑгÑÐ¼ÐµÐ½Ñ ÑипаoidÑ Ð¸Ð´ÐµÐ½ÑиÑикаÑоÑом Ñоздаваемой ÑÑнкÑии и обÑÑно возвÑаÑаеÑvoid.ФÑнкÑÐ¸Ñ Ð¿ÑовеÑки обÑÑно пÑовеÑÑÐµÑ Ñело Ñоздаваемой ÑÑнкÑии на ÑинÑакÑиÑеÑкие оÑибки, но Ð¼Ð¾Ð¶ÐµÑ Ñакже пÑоанализиÑоваÑÑ Ð¸ дÑÑгие Ñ Ð°ÑакÑеÑиÑÑики ÑÑнкÑии, напÑимеÑ, поддеÑÐ¶ÐºÑ Ð¾Ð¿ÑеделÑннÑÑ Ñипов аÑгÑменÑов ÑÑим ÑзÑком. ÐнаÑение, возвÑаÑаемое ÑÑой ÑÑнкÑией, игноÑиÑÑеÑÑÑ, об оÑÐ¸Ð±ÐºÐ°Ñ Ð¾Ð½Ð° должна ÑигнализиÑоваÑÑ, вÑзÑваÑ
ereport().
ÐÑимеÑаниÑ
ÐÐ»Ñ ÑÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð¿ÑоÑедÑÑнÑÑ
ÑзÑков ÑледÑÐµÑ Ð¸ÑполÑзоваÑÑ DROP LANGUAGE.
Ð ÑиÑÑемном каÑалоге pg_language (Ñм. Раздел 52.29) запиÑÑваеÑÑÑ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¾ ÑзÑкаÑ
, ÑÑÑановленнÑÑ
в даннÑй моменÑ. СпиÑок ÑÑÑановленнÑÑ
ÑзÑков Ñакже показÑÐ²Ð°ÐµÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð° \dL в psql.
ЧÑÐ¾Ð±Ñ ÑоздаваÑÑ ÑÑнкÑии на пÑоÑедÑÑном ÑзÑке, полÑзоваÑÐµÐ»Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ имеÑÑ Ð¿Ñаво USAGE Ð´Ð»Ñ ÑÑого ÑзÑка. Ðо ÑмолÑÐ°Ð½Ð¸Ñ Ð´Ð»Ñ Ð´Ð¾Ð²ÐµÑеннÑÑ
ÑзÑков пÑаво USAGE даÑÑÑÑ Ñоли PUBLIC (Ñ. е. вÑем), однако пÑи желании его можно оÑозваÑÑ.
ÐÑоÑедÑÑнÑе ÑзÑки ÑвлÑÑÑÑÑ Ð»Ð¾ÐºÐ°Ð»ÑнÑми по оÑноÑÐµÐ½Ð¸Ñ Ðº базам даннÑÑ
. Тем не менее, ÑзÑк можно ÑÑÑановиÑÑ Ð² Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
template1, в ÑезÑлÑÑаÑе Ñего он бÑÐ´ÐµÑ Ð°Ð²ÑомаÑиÑеÑки доÑÑÑпен во вÑеÑ
базаÑ
даннÑÑ
, ÑоздаваемÑÑ
из Ð½ÐµÑ Ð²Ð¿Ð¾ÑледÑÑвии.
ÐÑимеÑÑ
ÐинималÑÐ½Ð°Ñ Ð¿ÑоÑедÑÑа ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ пÑоÑедÑÑного ÑзÑка вÑглÑÐ´Ð¸Ñ Ñак:
CREATE FUNCTION plsample_call_handler() RETURNS language_handler
AS '$libdir/plsample'
LANGUAGE C;
CREATE LANGUAGE plsample
HANDLER plsample_call_handler;ÐбÑÑно ÑÑи ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ Ð·Ð°Ð¿Ð¸ÑÑваÑÑÑÑ Ð² ÑкÑипÑе ÑÑÑановки ÑаÑÑиÑениÑ, коÑоÑое полÑзоваÑели заÑем ÑÑÑанавливаÑÑ Ñак:
CREATE EXTENSION plsample;
СовмеÑÑимоÑÑÑ
CREATE LANGUAGE ÑвлÑеÑÑÑ ÑаÑÑиÑением PostgreSQL.