CREATE FUNCTION
CREATE FUNCTION â ÑоздаÑÑ ÑÑнкÑиÑ
СинÑакÑиÑ
CREATE [ OR REPLACE ] FUNCTION
Ð¸Ð¼Ñ ( [ [ Ñежим_аÑгÑменÑа ] [ имÑ_аÑгÑменÑа ] Ñип_аÑгÑменÑа [ { DEFAULT | = } вÑÑажение_по_ÑмолÑÐ°Ð½Ð¸Ñ ] [, ...] ] )
[ RETURNS Ñип_ÑезÑлÑÑаÑа
| RETURNS TABLE ( имÑ_ÑÑолбÑа Ñип_ÑÑолбÑа [, ...] ) ]
{ LANGUAGE имÑ_ÑзÑка
| TRANSFORM { FOR TYPE имÑ_Ñипа } [, ... ]
| WINDOW
| { IMMUTABLE | STABLE | VOLATILE }
| [ NOT ] LEAKPROOF
| { CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT }
| { [ EXTERNAL ] SECURITY INVOKER | [ EXTERNAL ] SECURITY DEFINER }
| PARALLEL { UNSAFE | RESTRICTED | SAFE }
| COST ÑÑоимоÑÑÑ_вÑполнениÑ
| ROWS ÑÑÑок_в_ÑезÑлÑÑаÑе
| SUPPORT вÑпомогаÑелÑнаÑ_ÑÑнкÑиÑ
| SET паÑамеÑÑ_конÑигÑÑаÑии { TO знаÑение | = знаÑение | FROM CURRENT }
| AS 'опÑеделение'
| AS 'обÑекÑнÑй_Ñайл', 'обÑекÑнÑй_Ñимвол'
| Ñело_sql
} ...ÐпиÑание
Ðоманда CREATE FUNCTION опÑеделÑÐµÑ Ð½Ð¾Ð²ÑÑ ÑÑнкÑиÑ. CREATE OR REPLACE FUNCTION ÑоздаÑÑ Ð½Ð¾Ð²ÑÑ ÑÑнкÑиÑ, либо заменÑÐµÑ Ð¾Ð¿Ñеделение Ñже ÑÑÑеÑÑвÑÑÑей. ЧÑÐ¾Ð±Ñ Ð¾Ð¿ÑеделиÑÑ ÑÑнкÑиÑ, необÑ
одимо имеÑÑ Ð¿Ñаво USAGE Ð´Ð»Ñ ÑооÑвеÑÑÑвÑÑÑего ÑзÑка.
ÐÑли Ñказано Ð¸Ð¼Ñ ÑÑ ÐµÐ¼Ñ, ÑÑнкÑÐ¸Ñ ÑоздаÑÑÑÑ Ð² заданной ÑÑ ÐµÐ¼Ðµ, в пÑоÑивном ÑлÑÑае â в ÑекÑÑей. ÐÐ¼Ñ Ð½Ð¾Ð²Ð¾Ð¹ ÑÑнкÑии должно оÑлиÑаÑÑÑÑ Ð¾Ñ Ð¸Ð¼Ñн ÑÑÑеÑÑвÑÑÑÐ¸Ñ ÑÑнкÑий или пÑоÑедÑÑ Ñ Ñакими же Ñипами аÑгÑменÑов в ÑÑой ÑÑ ÐµÐ¼Ðµ. Ðднако ÑÑнкÑии и пÑоÑедÑÑÑ Ñ Ð°ÑгÑменÑами ÑазнÑÑ Ñипов могÑÑ Ð¸Ð¼ÐµÑÑ Ð¾Ð´Ð½Ð¾ Ð¸Ð¼Ñ (ÑÑо назÑваеÑÑÑ Ð¿ÐµÑегÑÑзкой).
ЧÑÐ¾Ð±Ñ Ð·Ð°Ð¼ÐµÐ½Ð¸ÑÑ ÑекÑÑее опÑеделение ÑÑÑеÑÑвÑÑÑей ÑÑнкÑии, иÑполÑзÑйÑе ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ CREATE OR REPLACE FUNCTION. Ðо ÑÑÑиÑе, ÑÑо она не позволÑÐµÑ Ð¸Ð·Ð¼ÐµÐ½Ð¸ÑÑ Ð¸Ð¼Ñ Ð¸Ð»Ð¸ аÑгÑменÑÑ ÑÑнкÑии (еÑли попÑÑаÑÑÑÑ ÑделаÑÑ ÑÑо, на Ñамом деле бÑÐ´ÐµÑ Ñоздана новаÑ, незавиÑÐ¸Ð¼Ð°Ñ ÑÑнкÑиÑ). ÐÑоме Ñого, CREATE OR REPLACE FUNCTION не Ð¿Ð¾Ð·Ð²Ð¾Ð»Ð¸Ñ Ð¸Ð·Ð¼ÐµÐ½Ð¸ÑÑ Ñип ÑезÑлÑÑаÑа ÑÑÑеÑÑвÑÑÑей ÑÑнкÑии. ЧÑÐ¾Ð±Ñ ÑделаÑÑ ÑÑо, пÑидÑÑÑÑ ÑдалиÑÑ ÑÑнкÑÐ¸Ñ Ð¸ ÑоздаÑÑ ÐµÑ Ð·Ð°Ð½Ð¾Ð²Ð¾. (ÐÑо ознаÑаеÑ, ÑÑо еÑли ÑÑнкÑÐ¸Ñ Ð¸Ð¼ÐµÐµÑ Ð²ÑÑ
однÑе паÑамеÑÑÑ (OUT), Ñо измениÑÑ ÑÐ¸Ð¿Ñ Ð¿Ð°ÑамеÑÑов OUT можно, ÑолÑко Ñдалив ÑÑнкÑиÑ.)
Ðогда команда CREATE OR REPLACE FUNCTION заменÑÐµÑ ÑÑÑеÑÑвÑÑÑÑÑ ÑÑнкÑиÑ, Ð²Ð»Ð°Ð´ÐµÐ»ÐµÑ Ð¸ пÑава доÑÑÑпа к ÑÑой ÑÑнкÑии не менÑÑÑÑÑ. ÐÑе дÑÑгие ÑвойÑÑва ÑÑнкÑии полÑÑаÑÑ Ð·Ð½Ð°ÑениÑ, задаваемÑе командой Ñвно или по ÑмолÑаниÑ. ЧÑÐ¾Ð±Ñ Ð·Ð°Ð¼ÐµÐ½Ð¸ÑÑ ÑÑнкÑиÑ, необÑ
одимо бÑÑÑ ÐµÑ Ð²Ð»Ð°Ð´ÐµÐ»ÑÑем (или бÑÑÑ Ñленом Ñоли-владелÑÑа).
ÐÑли Ð²Ñ ÑдалиÑе и заÑем Ð²Ð½Ð¾Ð²Ñ ÑоздадиÑе ÑÑнкÑиÑ, Ð½Ð¾Ð²Ð°Ñ ÑÑнкÑÐ¸Ñ ÑÑÐ°Ð½ÐµÑ Ð´ÑÑгой ÑÑÑноÑÑÑÑ, оÑлиÑной Ð¾Ñ ÑÑаÑой; вам поÑÑебÑеÑÑÑ Ñак же ÑдалиÑÑ ÑÑÑеÑÑвÑÑÑие пÑавила, пÑедÑÑавлениÑ, ÑÑиггеÑÑ Ð¸ Ñ. п., ÑÑÑлаÑÑиеÑÑ Ð½Ð° ÑÑаÑÑÑ ÑÑнкÑиÑ. ÐоÑÑомÑ, ÑÑÐ¾Ð±Ñ Ð¸Ð·Ð¼ÐµÐ½Ð¸ÑÑ Ð¾Ð¿Ñеделение ÑÑнкÑии, ÑоÑ
ÑанÑÑ ÑÑÑлаÑÑиеÑÑ Ð½Ð° Ð½ÐµÑ Ð¾Ð±ÑекÑÑ, ÑледÑÐµÑ Ð¸ÑполÑзоваÑÑ CREATE OR REPLACE FUNCTION. ÐÑоме Ñого, многие дополниÑелÑнÑе ÑвойÑÑва ÑÑÑеÑÑвÑÑÑей ÑÑнкÑии можно измениÑÑ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ALTER FUNCTION.
ÐладелÑÑем ÑÑнкÑии ÑÑановиÑÑÑ ÑоздавÑий ÐµÑ Ð¿Ð¾Ð»ÑзоваÑелÑ.
ЧÑÐ¾Ð±Ñ ÑоздаÑÑ ÑÑнкÑиÑ, необÑ
одимо имеÑÑ Ð¿Ñаво USAGE Ð´Ð»Ñ Ñипов ÐµÑ Ð°ÑгÑменÑов и возвÑаÑаемого Ñипа.
Ðа дополниÑелÑной инÑоÑмаÑией о ÑазÑабоÑке ÑÑнкÑий обÑаÑиÑеÑÑ Ðº РазделÑ 36.3.
ÐаÑамеÑÑÑ
имÑÐÐ¼Ñ Ñоздаваемой ÑÑнкÑии (возможно, дополненное ÑÑ ÐµÐ¼Ð¾Ð¹).
Ñежим_аÑгÑменÑаРежим аÑгÑменÑа:
IN(Ð²Ñ Ð¾Ð´Ð½Ð¾Ð¹),OUT(вÑÑ Ð¾Ð´Ð½Ð¾Ð¹),INOUT(Ð²Ñ Ð¾Ð´Ð½Ð¾Ð¹ и вÑÑ Ð¾Ð´Ð½Ð¾Ð¹) илиVARIADIC(пеÑеменнÑй). Ðо ÑмолÑÐ°Ð½Ð¸Ñ Ð¿Ð¾Ð´ÑазÑмеваеÑÑÑIN. Ðа единÑÑвеннÑм аÑгÑменÑомVARIADICмогÑÑ ÑледоваÑÑ ÑолÑко аÑгÑменÑÑOUT. ÐÑоме Ñого, аÑгÑменÑÑOUTиINOUTнелÑÐ·Ñ Ð¸ÑполÑзоваÑÑ Ñ Ð¿ÑедложениемRETURNS TABLE.имÑ_аÑгÑменÑаÐÐ¼Ñ Ð°ÑгÑменÑа. ÐекоÑоÑÑе ÑзÑки (вклÑÑÐ°Ñ SQL и PL/pgSQL) позволÑÑÑ Ð¸ÑполÑзоваÑÑ ÑÑо Ð¸Ð¼Ñ Ð² Ñеле ÑÑнкÑии. ÐÐ»Ñ Ð´ÑÑÐ³Ð¸Ñ ÑзÑков ÑÑо Ð¸Ð¼Ñ ÑлÑÐ¶Ð¸Ñ Ð¿ÑоÑÑо дополниÑелÑнÑм опиÑанием, еÑли говоÑиÑÑ Ð¾ Ñамой ÑÑнкÑии; однако Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе ÑказÑваÑÑ Ð¸Ð¼ÐµÐ½Ð° аÑгÑменÑов пÑи вÑзове ÑÑнкÑии Ð´Ð»Ñ ÑлÑÑÑÐµÐ½Ð¸Ñ ÑиÑаемоÑÑи (Ñм. Раздел 4.3). ÐÐ¼Ñ Ð²ÑÑ Ð¾Ð´Ð½Ð¾Ð³Ð¾ аÑгÑменÑа в лÑбом ÑлÑÑае Ð¸Ð¼ÐµÐµÑ Ð·Ð½Ð°Ñение, Ñак как оно опÑеделÑÐµÑ Ð¸Ð¼Ñ ÑÑолбÑа в Ñипе ÑезÑлÑÑаÑа. (ÐÑли Ð²Ñ Ð¾Ð¿ÑÑÑиÑе Ð¸Ð¼Ñ Ð²ÑÑ Ð¾Ð´Ð½Ð¾Ð³Ð¾ аÑгÑменÑа, ÑиÑÑема вÑбеÑÐµÑ Ð´Ð»Ñ Ð½ÐµÐ³Ð¾ Ð¸Ð¼Ñ Ð¿Ð¾ ÑмолÑаниÑ.)
Ñип_аÑгÑменÑаТип даннÑÑ Ð°ÑгÑменÑа ÑÑнкÑии (возможно, дополненнÑй ÑÑ ÐµÐ¼Ð¾Ð¹), пÑи налиÑии аÑгÑменÑов. Тип аÑгÑменÑов Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð±Ð°Ð·Ð¾Ð²Ñм, ÑоÑÑавнÑм или доменнÑм, либо ÑÑо Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ ÑÑÑлка на ÑÑÐ¾Ð»Ð±ÐµÑ ÑаблиÑÑ.
РзавиÑимоÑÑи Ð¾Ñ ÑзÑка ÑеализаÑии Ñакже Ð¼Ð¾Ð¶ÐµÑ Ð´Ð¾Ð¿ÑÑкаÑÑÑÑ Ñказание «пÑевдоÑипов», напÑимеÑ,
cstring. ÐÑевдоÑÐ¸Ð¿Ñ Ð¿Ð¾ÐºÐ°Ð·ÑваÑÑ, ÑÑо ÑакÑиÑеÑкий Ñип аÑгÑменÑа либо опÑеделÑн не полноÑÑÑÑ, либо ÑÑÑеÑÑвÑÐµÑ Ð²Ð½Ðµ множеÑÑва обÑÑнÑÑ Ñипов SQL.СÑÑлка на Ñип ÑÑолбÑа запиÑÑваеÑÑÑ Ð² виде
. Ðногда Ñакое Ñказание бÑÐ²Ð°ÐµÑ Ð¿Ð¾Ð»ÐµÐ·Ð½Ð¾, Ñак как позволÑÐµÑ ÑоздаÑÑ ÑÑнкÑиÑ, незавиÑÑÑÑÑ Ð¾Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹ в опÑеделении ÑаблиÑÑ.имÑ_ÑаблиÑÑ.имÑ_ÑÑолбÑа%TYPEвÑÑажение_по_ÑмолÑаниÑÐÑÑажение, иÑполÑзÑемое Ð´Ð»Ñ Ð²ÑÑиÑÐ»ÐµÐ½Ð¸Ñ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð¿Ð¾ ÑмолÑаниÑ, еÑли паÑамеÑÑ Ð½Ðµ задан Ñвно. РезÑлÑÑÐ°Ñ Ð²ÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ ÑводиÑÑÑÑ Ðº ÑÐ¸Ð¿Ñ ÑооÑвеÑÑÑвÑÑÑего паÑамеÑÑа. ÐнаÑÐµÐ½Ð¸Ñ Ð¿Ð¾ ÑмолÑÐ°Ð½Ð¸Ñ Ð¼Ð¾Ð³ÑÑ Ð¸Ð¼ÐµÑÑ ÑолÑко Ð²Ñ Ð¾Ð´Ð½Ñе паÑамеÑÑÑ (вклÑÑаÑ
INOUT). ÐÐ»Ñ Ð²ÑÐµÑ Ð²Ñ Ð¾Ð´Ð½ÑÑ Ð¿Ð°ÑамеÑÑов, ÑледÑÑÑÐ¸Ñ Ð·Ð° паÑамеÑÑом Ñ Ð¾Ð¿ÑеделÑннÑм знаÑением по ÑмолÑаниÑ, Ñакже Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ Ð¾Ð¿ÑÐµÐ´ÐµÐ»ÐµÐ½Ñ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð¿Ð¾ ÑмолÑаниÑ.Ñип_ÑезÑлÑÑаÑаТип возвÑаÑаемÑÑ Ð´Ð°Ð½Ð½ÑÑ (возможно, дополненнÑй ÑÑ ÐµÐ¼Ð¾Ð¹). ÐÑо Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð±Ð°Ð·Ð¾Ð²Ñй, ÑоÑÑавной или доменнÑй Ñип, либо ÑÑÑлка на Ñип ÑÑолбÑа ÑаблиÑÑ. РзавиÑимоÑÑи Ð¾Ñ ÑзÑка ÑеализаÑии здеÑÑ Ñакже могÑÑ Ð´Ð¾Ð¿ÑÑкаÑÑÑÑ Â«Ð¿ÑевдоÑипÑ», напÑимеÑ
cstring. ÐÑли ÑÑнкÑÐ¸Ñ Ð½Ðµ должна возвÑаÑаÑÑ Ð·Ð½Ð°Ñение, в каÑеÑÑве Ñипа ÑезÑлÑÑаÑа ÑказÑваеÑÑÑvoid.Ð ÑлÑÑае налиÑÐ¸Ñ Ð¿Ð°ÑамеÑÑов
OUTилиINOUT, пÑедложениеRETURNSможно опÑÑÑиÑÑ. ÐÑли оно пÑиÑÑÑÑÑвÑеÑ, оно должно ÑоглаÑовÑваÑÑÑÑ Ñ Ñипом ÑезÑлÑÑаÑа, вÑводимÑм из вÑÑ Ð¾Ð´Ð½ÑÑ Ð¿Ð°ÑамеÑÑов: в каÑеÑÑве возвÑаÑаемого Ñипа ÑказÑваеÑÑÑRECORD, еÑли вÑÑ Ð¾Ð´Ð½ÑÑ Ð¿Ð°ÑамеÑÑов неÑколÑко, либо Ñип единÑÑвенного вÑÑ Ð¾Ð´Ð½Ð¾Ð³Ð¾ паÑамеÑÑа.Указание
SETOFпоказÑваеÑ, ÑÑо ÑÑнкÑÐ¸Ñ Ð²Ð¾Ð·Ð²ÑаÑÐ°ÐµÑ Ð¼Ð½Ð¾Ð¶ÐµÑÑво, а не единÑÑвеннÑй ÑлеменÑ.СÑÑлка на Ñип ÑÑолбÑа запиÑÑваеÑÑÑ Ð² виде
.имÑ_ÑаблиÑÑ.имÑ_ÑÑолбÑа%TYPEимÑ_ÑÑолбÑаÐÐ¼Ñ Ð²ÑÑ Ð¾Ð´Ð½Ð¾Ð³Ð¾ ÑÑолбÑа в запиÑи
RETURNS TABLE. Ðо ÑÑÑи ÑÑо еÑÑ Ð¾Ð´Ð¸Ð½ ÑпоÑоб обÑÑвиÑÑ Ð¸Ð¼ÐµÐ½Ð¾Ð²Ð°Ð½Ð½Ñй вÑÑ Ð¾Ð´Ð½Ð¾Ð¹ паÑамеÑÑ (OUT), ноRETURNS TABLEÑакже подÑазÑÐ¼ÐµÐ²Ð°ÐµÑ Ð¸RETURNS SETOF.Ñип_ÑÑолбÑаТип даннÑÑ Ð²ÑÑ Ð¾Ð´Ð½Ð¾Ð³Ð¾ ÑÑолбÑа в запиÑи
RETURNS TABLE.имÑ_ÑзÑкаÐÐ¼Ñ ÑзÑка, на коÑоÑом Ñеализована ÑÑнкÑиÑ. ÐÑо Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ
sql,c,internal, либо Ð¸Ð¼Ñ Ð¿ÑоÑедÑÑного ÑзÑка, опÑеделÑнного полÑзоваÑелем, напÑимеÑ,plpgsql. ÐÑли пÑиÑÑÑÑÑвÑеÑÑело_sql, подÑазÑмеваеÑÑÑ ÑзÑкsql. ÐаÑÐ¸Ð°Ð½Ñ Ð½Ð°Ð¿Ð¸ÑÐ°Ð½Ð¸Ñ ÑÑого имени в апоÑÑÑоÑÐ°Ñ ÑÑиÑаеÑÑÑ ÑÑÑаÑевÑим и ÑÑебÑÐµÑ ÑоÑного ÑÐ¾Ð²Ð¿Ð°Ð´ÐµÐ½Ð¸Ñ ÑегиÑÑÑа.TRANSFORM { FOR TYPEимÑ_Ñипа} [, ... ] }УÑÑÐ°Ð½Ð°Ð²Ð»Ð¸Ð²Ð°ÐµÑ ÑпиÑок ÑÑанÑÑоÑмаÑий, коÑоÑÑе Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¿ÑименÑÑÑÑÑ Ð¿Ñи вÑзове ÑÑнкÑии. ТÑанÑÑоÑмаÑии вÑполнÑÑÑ Ð¿ÑеобÑÐ°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¼ÐµÐ¶Ð´Ñ Ñипами SQL и Ñипами даннÑÑ , ÑпеÑиÑиÑнÑми Ð´Ð»Ñ ÑзÑков; Ñм. CREATE TRANSFORM. ÐÑеобÑÐ°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð²ÑÑÑоеннÑÑ Ñипов обÑÑно жÑÑÑко пÑедопÑÐµÐ´ÐµÐ»ÐµÐ½Ñ Ð² ÑеализаÑиÑÑ Ð¿ÑоÑедÑÑнÑÑ ÑзÑков, Ñак ÑÑо Ð¸Ñ Ð·Ð´ÐµÑÑ ÑказÑваÑÑ Ð½Ðµ нÑжно. ÐÑли ÑеализаÑÐ¸Ñ Ð¿ÑоÑедÑÑного ÑзÑка не Ð¼Ð¾Ð¶ÐµÑ Ð¾Ð±ÑабоÑаÑÑ Ñип и ÑÑанÑÑоÑмаÑÐ¸Ñ Ð´Ð»Ñ Ð½ÐµÐ³Ð¾ оÑÑÑÑÑÑвÑеÑ, бÑÐ´ÐµÑ Ð²Ñполнено пÑеобÑазование Ñипов по ÑмолÑаниÑ, но ÑÑо завиÑÐ¸Ñ Ð¾Ñ ÑеализаÑии.
WINDOWУказание
WINDOWпоказÑваеÑ, ÑÑо ÑоздаÑÑÑÑ Ð½Ðµ пÑоÑÑаÑ, а Ð¾ÐºÐ¾Ð½Ð½Ð°Ñ ÑÑнкÑиÑ. РнаÑÑоÑÑее вÑÐµÐ¼Ñ ÑÑо Ð¸Ð¼ÐµÐµÑ ÑмÑÑл ÑолÑко Ð´Ð»Ñ ÑÑнкÑий, напиÑаннÑÑ Ð½Ð° C. ÐÑÑибÑÑWINDOWнелÑÐ·Ñ Ð¸Ð·Ð¼ÐµÐ½Ð¸ÑÑ, модиÑиÑиÑÑÑ Ð²Ð¿Ð¾ÑледÑÑвии опÑеделение ÑÑнкÑии.IMMUTABLESTABLEVOLATILEÐÑи аÑÑибÑÑÑ Ð¸Ð½ÑоÑмиÑÑÑÑ Ð¾Ð¿ÑимизаÑÐ¾Ñ Ð·Ð°Ð¿ÑоÑов о поведении ÑÑнкÑии. ÐдновÑеменно можно ÑказаÑÑ Ð½Ðµ более одного аÑÑибÑÑа. ÐÑли никакой аÑÑибÑÑ Ð½Ðµ задан, по ÑмолÑÐ°Ð½Ð¸Ñ Ð¿Ð¾Ð´ÑазÑмеваеÑÑÑ
VOLATILE.ХаÑакÑеÑиÑÑика
IMMUTABLE(поÑÑоÑннаÑ) показÑваеÑ, ÑÑо ÑÑнкÑÐ¸Ñ Ð½Ðµ Ð¼Ð¾Ð¶ÐµÑ Ð¼Ð¾Ð´Ð¸ÑиÑиÑоваÑÑ Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ Ð¸ вÑегда возвÑаÑÐ°ÐµÑ Ð¾Ð´Ð¸Ð½ и ÑÐ¾Ñ Ð¶Ðµ ÑезÑлÑÑÐ°Ñ Ð¿Ñи опÑеделÑннÑÑ Ð·Ð½Ð°ÑениÑÑ Ð°ÑгÑменÑов; Ñо еÑÑÑ, она не обÑаÑаеÑÑÑ Ðº базе даннÑÑ Ð¸ не иÑполÑзÑÐµÑ Ð¸Ð½ÑоÑмаÑиÑ, не пеÑеданнÑÑ ÐµÐ¹ Ñвно в ÑпиÑке аÑгÑменÑов. ÐÑли ÑÑнкÑÐ¸Ñ Ð¸Ð¼ÐµÐµÑ ÑакÑÑ Ñ Ð°ÑакÑеÑиÑÑикÑ, лÑбой ÐµÑ Ð²Ñзов Ñ Ð°ÑгÑменÑами-конÑÑанÑами можно немедленно замениÑÑ Ð·Ð½Ð°Ñением ÑÑнкÑии.ХаÑакÑеÑиÑÑика
STABLE(ÑÑабилÑнаÑ) показÑваеÑ, ÑÑо ÑÑнкÑÐ¸Ñ Ð½Ðµ Ð¼Ð¾Ð¶ÐµÑ Ð¼Ð¾Ð´Ð¸ÑиÑиÑоваÑÑ Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ Ð¸ в ÑÐ°Ð¼ÐºÐ°Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ ÑканиÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÑаблиÑÑ Ð¾Ð½Ð° вÑегда возвÑаÑÐ°ÐµÑ Ð¾Ð´Ð¸Ð½ и ÑÐ¾Ñ Ð¶Ðµ ÑезÑлÑÑÐ°Ñ Ð´Ð»Ñ Ð¾Ð¿ÑеделÑннÑÑ Ð·Ð½Ð°Ñений аÑгÑменÑов, но ÑÑÐ¾Ñ ÑезÑлÑÑÐ°Ñ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ ÑазнÑм в ÑазнÑÑ Ð¾Ð¿ÐµÑаÑоÑÐ°Ñ SQL. ÐÑо Ð¿Ð¾Ð´Ñ Ð¾Ð´ÑÑий вÑÐ±Ð¾Ñ Ð´Ð»Ñ ÑÑнкÑий, ÑезÑлÑÑаÑÑ ÐºÐ¾ÑоÑÑÑ Ð·Ð°Ð²Ð¸ÑÑÑ Ð¾Ñ ÑодеÑжимого Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ Ð¸ наÑÑÑаиваемÑÑ Ð¿Ð°ÑамеÑÑов (напÑимеÑ, ÑекÑÑего ÑаÑового поÑÑа). (Ðо ÑÑÐ¾Ñ Ð²Ð°ÑÐ¸Ð°Ð½Ñ Ð½Ðµ Ð¿Ð¾Ð´Ñ Ð¾Ð´Ð¸Ñ Ð´Ð»Ñ ÑÑиггеÑовAFTER, желаÑÑÐ¸Ñ Ð¿ÑоÑиÑаÑÑ ÑÑÑоки, изменÑннÑе ÑекÑÑей командой.) Также замеÑÑÑе, ÑÑо ÑÑнкÑии ÑемейÑÑваcurrent_timestampÑакже ÑÑиÑаÑÑÑÑ ÑÑабилÑнÑми, Ñак как Ð¸Ñ ÑезÑлÑÑаÑÑ Ð½Ðµ менÑÑÑÑÑ Ð²Ð½ÑÑÑи ÑÑанзакÑии.ХаÑакÑеÑиÑÑика
VOLATILE(изменÑиваÑ) показÑваеÑ, ÑÑо ÑезÑлÑÑÐ°Ñ ÑÑнкÑии Ð¼Ð¾Ð¶ÐµÑ Ð¼ÐµÐ½ÑÑÑÑÑ Ð´Ð°Ð¶Ðµ в ÑÐ°Ð¼ÐºÐ°Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ ÑканиÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÑаблиÑÑ, Ñак ÑÑо ÐµÑ Ð²ÑÐ·Ð¾Ð²Ñ Ð½ÐµÐ»ÑÐ·Ñ Ð¾Ð¿ÑимизиÑоваÑÑ. ÐзменÑÐ¸Ð²Ñ Ð² ÑÑом ÑмÑÑле оÑноÑиÑелÑно немногие ÑÑнкÑии баз даннÑÑ , напÑимеÑ:random(),currval()иtimeofday(). Ðо замеÑÑÑе, ÑÑо лÑÐ±Ð°Ñ ÑÑнкÑÐ¸Ñ Ñ Ð¿Ð¾Ð±Ð¾ÑнÑми ÑÑÑекÑами должна бÑÑÑ ÐºÐ»Ð°ÑÑиÑиÑиÑована как изменÑиваÑ, даже еÑли ÐµÑ ÑезÑлÑÑÐ°Ñ Ð²Ð¿Ð¾Ð»Ð½Ðµ пÑедÑказÑем, ÑÑÐ¾Ð±Ñ ÐµÑ Ð²ÑÐ·Ð¾Ð²Ñ Ð½Ðµ бÑли ÑопÑимизиÑованÑ; пÑÐ¸Ð¼ÐµÑ Ñакой ÑÑнкÑии:setval().Ðа дополниÑелÑнÑми подÑобноÑÑÑми обÑаÑиÑеÑÑ Ðº РазделÑ 36.7.
LEAKPROOFХаÑакÑеÑиÑÑика
LEAKPROOF(геÑмеÑиÑнаÑ) показÑваеÑ, ÑÑо ÑÑнкÑÐ¸Ñ Ð½Ðµ Ð¸Ð¼ÐµÐµÑ Ð¿Ð¾Ð±Ð¾ÑнÑÑ ÑÑÑекÑов. Ðна не ÑаÑкÑÑÐ²Ð°ÐµÑ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¾ ÑÐ²Ð¾Ð¸Ñ Ð°ÑгÑменÑÐ°Ñ , кÑоме как возвÑаÑÐ°Ñ ÑезÑлÑÑаÑ. ÐапÑимеÑ, ÑÑнкÑиÑ, коÑоÑÐ°Ñ Ð²ÑдаÑÑ ÑообÑение об оÑибке Ñ Ð½ÐµÐºÐ¾ÑоÑÑми, но не вÑеми знаÑениÑми аÑгÑменÑов, либо вÑÐ²Ð¾Ð´Ð¸Ñ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð°ÑгÑменÑов в ÑообÑении об оÑибке, не ÑвлÑеÑÑÑ Ð³ÐµÑмеÑиÑной. ÐÑо влиÑÐµÑ Ð½Ð° Ñо, как ÑиÑÑема вÑполнÑÐµÑ Ð·Ð°Ð¿ÑоÑÑ Ðº пÑедÑÑавлениÑм, ÑозданнÑм Ñ Ð±Ð°ÑÑеÑом безопаÑноÑÑи (Ñ Ñказаниемsecurity_barrier), или к ÑаблиÑам Ñ Ð²ÐºÐ»ÑÑÑнной заÑиÑой ÑÑÑок. Ðо избежание неконÑÑолиÑÑемой ÑÑеÑки даннÑÑ ÑиÑÑема бÑÐ´ÐµÑ Ð¿ÑовеÑÑÑÑ ÑÑÐ»Ð¾Ð²Ð¸Ñ Ð¸Ð· полиÑик заÑиÑÑ Ð¸ опÑеделений пÑедÑÑавлений Ñ Ð±Ð°ÑÑеÑами безопаÑноÑÑи пеÑед лÑбÑми ÑÑловиÑми, коÑоÑÑе задаÑÑ Ð¿Ð¾Ð»ÑзоваÑÐµÐ»Ñ Ð² Ñамом запÑоÑе и в коÑоÑÑÑ Ð·Ð°Ð´ÐµÐ¹ÑÑвÑÑÑÑÑ Ð½ÐµÐ³ÐµÑмеÑиÑнÑе ÑÑнкÑии. ФÑнкÑии и опеÑаÑоÑÑ, помеÑеннÑе как геÑмеÑиÑнÑе, ÑÑиÑаÑÑÑÑ Ð´Ð¾Ð²ÐµÑеннÑми и могÑÑ Ð²ÑполнÑÑÑÑÑ Ð¿ÐµÑед ÑÑловиÑми из полиÑик заÑиÑÑ Ð¸ пÑедÑÑавлений Ñ Ð±Ð°ÑÑеÑами безопаÑноÑÑи. ÐÑи ÑÑом ÑÑнкÑии, коÑоÑÑе не имеÑÑ Ð°ÑгÑменÑов или коÑоÑÑм не пеÑедаÑÑÑÑ Ð½Ð¸ÐºÐ°ÐºÐ¸Ðµ аÑгÑменÑÑ Ð¸Ð· пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ñ Ð±Ð°ÑÑеÑом безопаÑноÑÑи или ÑаблиÑÑ, не ÑÑебÑеÑÑÑ Ð¿Ð¾Ð¼ÐµÑаÑÑ ÐºÐ°Ðº геÑмеÑиÑнÑе, ÑÑÐ¾Ð±Ñ Ð¾Ð½Ð¸ вÑполнÑлиÑÑ Ð´Ð¾ ÑÑловий, ÑвÑзаннÑÑ Ñ Ð±ÐµÐ·Ð¾Ð¿Ð°ÑноÑÑÑÑ. См. CREATE VIEW и Раздел 39.5. ÐÑо ÑвойÑÑво Ð¼Ð¾Ð¶ÐµÑ ÑÑÑановиÑÑ ÑолÑко ÑÑпеÑполÑзоваÑелÑ.CALLED ON NULL INPUTRETURNS NULL ON NULL INPUTSTRICTCALLED ON NULL INPUT(по ÑмолÑаниÑ) показÑваеÑ, ÑÑо ÑÑнкÑÐ¸Ñ Ð±ÑÐ´ÐµÑ Ð²Ñзвана как обÑÑно, еÑли ÑÑеди ÐµÑ Ð°ÑгÑменÑов оказÑваÑÑÑÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ NULL. Ð ÑÑом ÑлÑÑае оÑвеÑÑÑвенноÑÑÑ Ð·Ð° пÑовеÑÐºÑ Ð·Ð½Ð°Ñений NULL и ÑооÑвеÑÑÑвÑÑÑÑÑ Ð¸Ñ Ð¾Ð±ÑабоÑÐºÑ Ð»Ð¾Ð¶Ð¸ÑÑÑ Ð½Ð° ÑазÑабоÑÑика ÑÑнкÑии.Указание
RETURNS NULL ON NULL INPUTилиSTRICTпоказÑваеÑ, ÑÑо ÑÑнкÑÐ¸Ñ Ð²Ñегда возвÑаÑÐ°ÐµÑ NULL, полÑÑив NULL в одном из аÑгÑменÑов. Ð¢Ð°ÐºÐ°Ñ ÑÑнкÑÐ¸Ñ Ð½Ðµ бÑÐ´ÐµÑ Ð²ÑзÑваÑÑÑÑ Ñ Ð°ÑгÑменÑами NULL, вмеÑÑо ÑÑого авÑомаÑиÑеÑки бÑÐ´ÐµÑ Ð¿Ð¾Ð»Ð°Ð³Ð°ÑÑÑÑ ÑезÑлÑÑÐ°Ñ NULL.[EXTERNAL] SECURITY INVOKER[EXTERNAL] SECURITY DEFINERХаÑакÑеÑиÑÑика
SECURITY INVOKER(безопаÑноÑÑÑ Ð²ÑзÑваÑÑего) показÑваеÑ, ÑÑо ÑÑнкÑÐ¸Ñ Ð±ÑÐ´ÐµÑ Ð²ÑполнÑÑÑÑÑ Ñ Ð¿Ñавами полÑзоваÑелÑ, вÑзвавÑего еÑ. ÐÑÐ¾Ñ Ð²Ð°ÑÐ¸Ð°Ð½Ñ Ð¿Ð¾Ð´ÑазÑмеваеÑÑÑ Ð¿Ð¾ ÑмолÑаниÑ. ÐаÑианÑSECURITY DEFINER(безопаÑноÑÑÑ Ð¾Ð¿ÑеделивÑего) показÑваеÑ, ÑÑо ÑÑнкÑÐ¸Ñ Ð²ÑполнÑеÑÑÑ Ñ Ð¿Ñавами полÑзоваÑелÑ, владеÑÑего ей. ÐополниÑелÑнÑÑ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¾ безопаÑном Ñоздании ÑÑнкÑий Ñ Ñ Ð°ÑакÑеÑиÑÑикойSECURITY DEFINERÑм. ниже.ÐлÑÑевое Ñлово
EXTERNAL(внеÑнÑÑ) допÑÑкаеÑÑÑ Ð´Ð»Ñ ÑооÑвеÑÑÑÐ²Ð¸Ñ ÑÑандаÑÑÑ SQL, но ÑвлÑеÑÑÑ Ð½ÐµÐ¾Ð±ÑзаÑелÑнÑм, Ñак как, в оÑлиÑие Ð¾Ñ SQL, ÑÑа Ñ Ð°ÑакÑеÑиÑÑика ÑаÑпÑоÑÑÑанÑеÑÑÑ Ð½Ð° вÑе ÑÑнкÑии, а не ÑолÑко внеÑние.PARALLELУказание
PARALLEL UNSAFEознаÑаеÑ, ÑÑо ÑÑÑ ÑÑнкÑÐ¸Ñ Ð½ÐµÐ»ÑÐ·Ñ Ð²ÑполнÑÑÑ Ð² паÑаллелÑном Ñежиме и пÑиÑÑÑÑÑвие Ñакой ÑÑнкÑии в опеÑаÑоÑе SQL пÑÐ¸Ð²Ð¾Ð´Ð¸Ñ Ðº вÑбоÑÑ Ð¿Ð¾ÑледоваÑелÑного плана вÑполнениÑ. ÐÑо Ñ Ð°ÑакÑеÑиÑÑика ÑÑнкÑии по ÑмолÑаниÑ. УказаниеPARALLEL RESTRICTEDознаÑаеÑ, ÑÑо ÑÑнкÑÐ¸Ñ Ð¼Ð¾Ð¶Ð½Ð¾ вÑполнÑÑÑ Ð² паÑаллелÑном Ñежиме, но ÑолÑко в ведÑÑем пÑоÑеÑÑе гÑÑппÑ.PARALLEL SAFEпоказÑваеÑ, ÑÑо ÑÑнкÑÐ¸Ñ Ð±ÐµÐ·Ð¾Ð¿Ð°Ñна Ð´Ð»Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð² паÑаллелÑном Ñежиме без огÑаниÑений, в Ñом ÑиÑле в паÑаллелÑнÑÑ ÑабоÑÐ¸Ñ Ð¿ÑоÑеÑÑÐ°Ñ .ФÑнкÑии Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¿Ð¾Ð¼ÐµÑаÑÑÑÑ ÐºÐ°Ðº небезопаÑнÑе Ð´Ð»Ñ Ð¿Ð°ÑаллелÑного вÑполнениÑ, еÑли они изменÑÑÑ ÑоÑÑоÑние Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ , вноÑÑÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² ÑÑанзакÑии (кÑоме иÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ð¾Ð´ÑÑанзакÑий Ð´Ð»Ñ Ð²Ð¾ÑÑÑÐ°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿Ð¾Ñле ÑбоÑ), обÑаÑаÑÑÑÑ Ðº поÑледоваÑелÑноÑÑÑм (напÑимеÑ, иÑполÑзÑÑ
currval) или ÑÐ¾Ñ ÑанÑÑÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² паÑамеÑÑÐ°Ñ . ÐгÑаниÑенно паÑаллелÑнÑми Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¿Ð¾Ð¼ÐµÑаÑÑÑÑ ÑÑнкÑии, коÑоÑÑе обÑаÑаÑÑÑÑ Ðº вÑеменнÑм ÑаблиÑам, ÑоÑÑоÑÐ½Ð¸Ñ ÐºÐ»Ð¸ÐµÐ½ÑÑкого подклÑÑениÑ, кÑÑÑоÑам, подгоÑовленнÑм опеÑаÑоÑам или ÑазнообÑÐ°Ð·Ð½Ð¾Ð¼Ñ ÑоÑÑоÑÐ½Ð¸Ñ Ð¾Ð±ÑлÑживаÑÑего пÑоÑеÑÑа, коÑоÑое ÑиÑÑема не Ð¼Ð¾Ð¶ÐµÑ ÑÐ¸Ð½Ñ ÑонизиÑоваÑÑ Ð² паÑаллелÑном Ñежиме (напÑимеÑ,setseedÐ¼Ð¾Ð¶ÐµÑ Ð²ÑполнÑÑÑ ÑолÑко ведÑÑий пÑоÑеÑÑ Ð³ÑÑппÑ, Ñак как изменениÑ, внеÑÑннÑе дÑÑгим пÑоÑеÑÑом, не пеÑедаÑÑÑÑ Ð²ÐµÐ´ÑÑемÑ). Ð Ñелом, еÑли ÑÑнкÑÐ¸Ñ Ð¿Ð¾Ð¼ÐµÑена как безопаÑнаÑ, Ñогда как она ÑвлÑеÑÑÑ Ð¾Ð³ÑаниÑенной или небезопаÑной, либо еÑли она помеÑена как огÑаниÑенно безопаÑнаÑ, не ÑвлÑÑÑÑ Ð±ÐµÐ·Ð¾Ð¿Ð°Ñной, пÑи попÑÑке вÑзваÑÑ ÐµÑ Ð² паÑаллелÑном запÑоÑе она Ð¼Ð¾Ð¶ÐµÑ Ð²ÑдаваÑÑ Ð¾Ñибки или невеÑнÑе ÑезÑлÑÑаÑÑ. ФÑнкÑии на ÑзÑке C пÑи непÑавилÑной помеÑке ÑеоÑеÑиÑеÑки могÑÑ Ð¿ÑоÑвлÑÑÑ Ð¿Ð¾Ð»Ð½Ð¾ÑÑÑÑ Ð½ÐµÐ¾Ð¿ÑеделÑнное поведение, Ñак как ÑиÑÑема никак не Ð¼Ð¾Ð¶ÐµÑ Ð·Ð°ÑиÑиÑÑÑÑ Ð¾Ñ Ð¿ÑоизволÑного кода на C, но ÑаÑе вÑе они бÑдÑÑ Ð²ÐµÑÑи ÑÐµÐ±Ñ Ð½Ðµ Ñ Ñже, Ñем лÑÐ±Ð°Ñ Ð´ÑÑÐ³Ð°Ñ ÑÑнкÑиÑ. Ð ÑлÑÑае Ñомнений ÑÑнкÑÐ¸Ñ ÑледÑÐµÑ Ð¿Ð¾Ð¼ÐµÑаÑÑ ÐºÐ°Ðº небезопаÑнÑÑ (UNSAFE), ÑÑо ÑвлÑеÑÑÑ Ð·Ð½Ð°Ñением по ÑмолÑаниÑ.COSTÑÑоимоÑÑÑ_вÑполнениÑÐоложиÑелÑное ÑиÑло, задаÑÑее пÑимеÑнÑÑ ÑÑоимоÑÑÑ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÑÑнкÑии, в единиÑÐ°Ñ cpu_operator_cost. ÐÑли ÑÑнкÑÐ¸Ñ Ð²Ð¾Ð·Ð²ÑаÑÐ°ÐµÑ Ð¼Ð½Ð¾Ð¶ÐµÑÑво, ÑÑо ÑиÑло задаÑÑ ÑÑоимоÑÑÑ Ð´Ð»Ñ Ð¾Ð´Ð½Ð¾Ð¹ ÑÑÑоки. ÐÑли ÑÑоимоÑÑÑ Ð½Ðµ Ñказана, Ð´Ð»Ñ ÑÑнкÑий на C и внÑÑÑÐµÐ½Ð½Ð¸Ñ ÑÑнкÑий она ÑÑиÑаеÑÑÑ Ñавной 1 единиÑе, а Ð´Ð»Ñ ÑÑнкÑий на вÑÐµÑ Ð´ÑÑÐ³Ð¸Ñ ÑзÑÐºÐ°Ñ â 100 единиÑам. ÐÑи болÑÑÐ¸Ñ Ð·Ð½Ð°ÑениÑÑ Ð¿Ð»Ð°Ð½Ð¸ÑовÑик бÑÐ´ÐµÑ ÑÑаÑаÑÑÑÑ Ð½Ðµ вÑзÑваÑÑ ÑÑÑ ÑÑнкÑÐ¸Ñ ÑаÑе, Ñем ÑÑо Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾.
ROWSÑÑÑок_в_ÑезÑлÑÑаÑеÐоложиÑелÑное ÑиÑло, задаÑÑее пÑимеÑное ÑиÑло ÑÑÑок, коÑоÑое бÑÐ´ÐµÑ Ð¾Ð¶Ð¸Ð´Ð°ÑÑ Ð¿Ð»Ð°Ð½Ð¸ÑовÑик на вÑÑ Ð¾Ð´Ðµ ÑÑой ÑÑнкÑии. ÐÑо Ñказание допÑÑÑимо, ÑолÑко еÑли ÑÑнкÑÐ¸Ñ Ð¾Ð±ÑÑвлена как возвÑаÑаÑÑÐ°Ñ Ð¼Ð½Ð¾Ð¶ÐµÑÑво. ÐÑедполагаемое по ÑмолÑÐ°Ð½Ð¸Ñ Ð·Ð½Ð°Ñение â 1000 ÑÑÑок.
SUPPORTвÑпомогаÑелÑнаÑ_ÑÑнкÑиÑÐÐ¼Ñ (возможно, дополненное ÑÑ ÐµÐ¼Ð¾Ð¹) вÑпомогаÑелÑной ÑÑнкÑии Ð´Ð»Ñ Ð¿Ð»Ð°Ð½Ð¸ÑовÑика, коÑоÑÐ°Ñ Ð±ÑÐ´ÐµÑ Ð¸ÑполÑзоваÑÑÑÑ ÑÑой ÑÑнкÑией. Ðа подÑобноÑÑÑми обÑаÑиÑеÑÑ Ðº РазделÑ 36.11. ÐÐ»Ñ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ ÑÑого ÑÐºÐ°Ð·Ð°Ð½Ð¸Ñ Ð½Ñжно бÑÑÑ ÑÑпеÑполÑзоваÑелем.
паÑамеÑÑ_конÑигÑÑаÑиизнаÑениеÐÑедложение
SETопÑеделÑеÑ, ÑÑо пÑи вÑзове ÑÑнкÑии ÑказаннÑй паÑамеÑÑ ÐºÐ¾Ð½ÑигÑÑаÑии должен пÑинÑÑÑ Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ðµ знаÑение, а заÑем воÑÑÑановиÑÑ ÑÐ²Ð¾Ñ Ð¿ÑедÑдÑÑее знаÑение пÑи завеÑÑении ÑÑнкÑии. ÐÑедложениеSET FROM CURRENTÑÐ¾Ñ ÑанÑÐµÑ Ð² каÑеÑÑве знаÑениÑ, коÑоÑое бÑÐ´ÐµÑ Ð¿Ñименено пÑи Ð²Ñ Ð¾Ð´Ðµ в ÑÑнкÑиÑ, знаÑение, дейÑÑвÑÑÑее в Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð²ÑполнениÑCREATE FUNCTION.ÐÑли в опÑеделение ÑÑнкÑии добавлено
SET, Ñо дейÑÑвие командÑSET LOCAL, вÑполнÑемой внÑÑÑи ÑÑнкÑии Ð´Ð»Ñ Ñого же паÑамеÑÑа, огÑаниÑиваеÑÑÑ Ñелом ÑÑнкÑии: пÑедÑдÑÑее знаÑение паÑамеÑÑа Ñак же бÑÐ´ÐµÑ Ð²Ð¾ÑÑÑановлено пÑи завеÑÑении ÑÑнкÑии. Ðднако обÑÑÐ½Ð°Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð°SET(безLOCAL) пеÑеопÑеделÑÐµÑ Ð¿ÑедложениеSET, как и пÑедÑдÑÑÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´ÑSET LOCAL: дейÑÑвие Ñакой ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ Ð±ÑÐ´ÐµÑ ÑÐ¾Ñ Ñанено и поÑле завеÑÑÐµÐ½Ð¸Ñ ÑÑнкÑии, еÑли ÑолÑко не пÑоизойдÑÑ Ð¾ÑÐºÐ°Ñ ÑÑанзакÑии.Ðа подÑобнÑми ÑведениÑми об Ð¸Ð¼ÐµÐ½Ð°Ñ Ð¸ знаÑениÑÑ Ð¿Ð°ÑамеÑÑов обÑаÑиÑеÑÑ Ðº SET и Ðлаве 19.
опÑеделениеСÑÑÐ¾ÐºÐ¾Ð²Ð°Ñ ÐºÐ¾Ð½ÑÑанÑа, опÑеделÑÑÑÐ°Ñ ÑеализаÑÐ¸Ñ ÑÑнкÑии; ÐµÑ Ð·Ð½Ð°Ñение завиÑÐ¸Ñ Ð¾Ñ ÑзÑка. ÐÑо Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¸Ð¼Ñ Ð²Ð½ÑÑÑенней ÑÑнкÑии, пÑÑÑ Ðº обÑекÑÐ½Ð¾Ð¼Ñ ÑайлÑ, команда SQL или код ÑÑнкÑии на пÑоÑедÑÑном ÑзÑке.
ЧаÑÑо бÑÐ²Ð°ÐµÑ Ð¿Ð¾Ð»ÐµÐ·Ð½Ð¾ заклÑÑаÑÑ Ð¾Ð¿Ñеделение ÑÑнкÑии в доллаÑÑ (Ñм. ÐодÑаздел 4.1.2.4), а не в ÑÑадиÑионнÑе апоÑÑÑоÑÑ. ÐÑли не иÑполÑзоваÑÑ Ð´Ð¾Ð»Ð»Ð°ÑÑ, вÑе апоÑÑÑоÑÑ Ð¸ обÑаÑнÑе коÑÑе ÑеÑÑÑ Ð² опÑеделении ÑÑнкÑии пÑидÑÑÑÑ ÑкÑаниÑоваÑÑ, дÑблиÑÑÑ Ð¸Ñ .
обÑекÑнÑй_Ñайл,обÑекÑнÑй_ÑимволÐÑа ÑоÑма пÑедложениÑ
ASпÑименÑеÑÑÑ Ð´Ð»Ñ Ð´Ð¸Ð½Ð°Ð¼Ð¸ÑеÑки загÑÑжаемÑÑ ÑÑнкÑий на ÑзÑке C, когда Ð¸Ð¼Ñ ÑÑнкÑии в коде C не ÑÐ¾Ð²Ð¿Ð°Ð´Ð°ÐµÑ Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ ÑÑнкÑии в SQL. СÑÑокаобÑекÑнÑй_ÑайлзадаÑÑ Ð¸Ð¼Ñ Ñайла ÑазделÑемой библиоÑеки, ÑодеÑжаÑей ÑкомпилиÑованнÑÑ ÑÑнкÑÐ¸Ñ Ð½Ð° C, и воÑпÑинимаеÑÑÑ ÐºÐ°Ðº паÑамеÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´ÑLOAD. СÑÑокаобÑекÑнÑй_ÑимволзадаÑÑ Ñимвол Ñкомпонованной ÑÑнкÑии, Ñо еÑÑÑ Ð¸Ð¼Ñ ÑÑнкÑии в иÑÑ Ð¾Ð´Ð½Ð¾Ð¼ коде на ÑзÑке C. ÐÑли обÑекÑнÑй Ñимвол опÑÑен, пÑедполагаеÑÑÑ, ÑÑо он ÑÐ¾Ð²Ð¿Ð°Ð´Ð°ÐµÑ Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ опÑеделÑемой SQL-ÑÑнкÑии. Ð C имена вÑÐµÑ ÑÑнкÑий Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ ÑазлиÑнÑми, поÑÑÐ¾Ð¼Ñ Ð¿ÐµÑегÑÑжаемÑм ÑÑнкÑиÑм, ÑеализованнÑм на C, нÑжно даваÑÑ ÑазнÑе имена (напÑимеÑ, вклÑÑаÑÑ Ð² имена C обознаÑÐµÐ½Ð¸Ñ Ñипов аÑгÑменÑов).ÐÑли повÑоÑнÑе вÑзовÑ
CREATE FUNCTIONÑÑÑлаÑÑÑÑ Ð½Ð° один и ÑÐ¾Ñ Ð¶Ðµ обÑекÑнÑй Ñайл, он загÑÑжаеÑÑÑ Ð² ÑÐ°Ð¼ÐºÐ°Ñ ÑеанÑа ÑолÑко один Ñаз. ЧÑÐ¾Ð±Ñ Ð²ÑгÑÑзиÑÑ Ð¸ загÑÑзиÑÑ ÑÑÐ¾Ñ Ñайл Ñнова (напÑимеÑ, в пÑоÑеÑÑе ÑазÑабоÑки), наÑниÑе новÑй ÑеанÑ.Ñело_sqlТело ÑÑнкÑии в ÑÑиле
LANGUAGE SQL. ÐÑо Ð¼Ð¾Ð¶ÐµÑ Ð±Ñли один опеÑаÑоÑRETURN
вÑÑажениеили блок опеÑаÑоÑов
BEGIN ATOMIC
опеÑаÑоÑ;опеÑаÑоÑ; ...опеÑаÑоÑ; ENDÐно опÑеделÑеÑÑÑ Ð¿Ð¾Ð´Ð¾Ð±Ð½Ð¾ ÑелÑ, Ð·Ð°Ð´Ð°Ð²Ð°ÐµÐ¼Ð¾Ð¼Ñ ÑÑÑоковой конÑÑанÑой (Ñм.
опÑеделениевÑÑе), но еÑÑÑ Ð¸ некоÑоÑÑе ÑазлиÑиÑ. ÐÑа ÑоÑма ÑабоÑÐ°ÐµÑ ÑолÑко Ñ ÑÑнкÑиÑми в ÑÑилеLANGUAGE SQL, Ñогда как ÑоÑма Ñо ÑÑÑоковой конÑÑанÑой поддеÑживаеÑÑÑ Ð´Ð»Ñ Ð²ÑÐµÑ ÑзÑков. Ðна ÑазбиÑаеÑÑÑ Ð²Ð¾ вÑÐµÐ¼Ñ Ð¾Ð¿ÑÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ ÑÑнкÑии, Ñогда как ÑоÑма Ñо ÑÑÑоковой конÑÑанÑой â во вÑÐµÐ¼Ñ Ð²ÑполнениÑ; как ÑледÑÑвие, ÑÑа ÑоÑма не поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ Ð¿Ð¾Ð»Ð¸Ð¼Ð¾ÑÑнÑе ÑÐ¸Ð¿Ñ Ð°ÑгÑменÑов и дÑÑгие конÑÑÑÑкÑии, коÑоÑÑе нелÑÐ·Ñ Ð¾Ð±ÑабоÑаÑÑ Ð²Ð¾ вÑÐµÐ¼Ñ Ð¾Ð¿ÑÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ ÑÑнкÑии. С данной ÑоÑмой оÑÑлеживаÑÑÑÑ Ð·Ð°Ð²Ð¸ÑимоÑÑи ÑÑнкÑии Ð¾Ñ Ð¾Ð±ÑекÑов, иÑполÑзÑемÑÑ Ð² ÐµÑ Ñеле, Ñак ÑÑо командаDROP ... CASCADEвÑполниÑÑÑ ÐºÐ¾ÑÑекÑно, Ñогда как в ÑлÑÑае опÑÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ñела в ÑÑÑоковой конÑÑанÑе поÑле Ñакого ÑÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð³ÑÑ Ð¾ÑÑаÑÑÑÑ Ð½ÐµÐ¿Ð¾Ð»Ð½Ð¾ÑеннÑе ÑÑнкÑии. ÐаконеÑ, Ð´Ð°Ð½Ð½Ð°Ñ ÑоÑма в болÑÑей ÑÑепени ÑооÑвеÑÑÑвÑÐµÑ ÑÑандаÑÑÑ SQL и ÑовмеÑÑима Ñ Ð´ÑÑгими ÑеализаÑиÑми SQL.
ÐеÑегÑÑзка
PostgreSQL допÑÑÐºÐ°ÐµÑ Ð¿ÐµÑегÑÑÐ·ÐºÑ ÑÑнкÑий; Ñо еÑÑÑ, позволÑÐµÑ Ð¸ÑполÑзоваÑÑ Ð¾Ð´Ð½Ð¾ Ð¸Ð¼Ñ Ð´Ð»Ñ Ð½ÐµÑколÑÐºÐ¸Ñ ÑазлиÑнÑÑ ÑÑнкÑий, еÑли Ñ Ð½Ð¸Ñ ÑазлиÑаÑÑÑÑ ÑÐ¸Ð¿Ñ Ð²Ñ Ð¾Ð´Ð½ÑÑ Ð°ÑгÑменÑов. ÐезавиÑимо Ð¾Ñ Ñого, иÑполÑзÑеÑе Ð²Ñ ÑÑÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑÑ Ð¸Ð»Ð¸ неÑ, она ÑÑебÑÐµÑ Ð¿ÑедоÑÑоÑожноÑÑи пÑи вÑзове ÑÑнкÑий в Ð±Ð°Ð·Ð°Ñ Ð´Ð°Ð½Ð½ÑÑ , где одни полÑзоваÑели не довеÑÑÑÑ Ð´ÑÑгим; Ñм. Раздел 10.3.
Ðве ÑÑнкÑии ÑÑиÑаÑÑÑÑ ÑовпадаÑÑими, еÑли они имеÑÑ Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²Ñе имена и ÑÐ¸Ð¿Ñ Ð²Ñ
однÑÑ
аÑгÑменÑов, паÑамеÑÑÑ OUT игноÑиÑÑÑÑÑÑ. Таким обÑазом, напÑимеÑ, ÑÑи обÑÑÐ²Ð»ÐµÐ½Ð¸Ñ Ð²ÑзовÑÑ ÐºÐ¾Ð½ÑликÑ:
CREATE FUNCTION foo(int) ... CREATE FUNCTION foo(int, out text) ...
ФÑнкÑии, имеÑÑие ÑазнÑе ÑÐ¸Ð¿Ñ Ð°ÑгÑменÑов, не бÑдÑÑ ÑÑиÑаÑÑÑÑ ÐºÐ¾Ð½ÑликÑÑÑÑими в Ð¼Ð¾Ð¼ÐµÐ½Ñ ÑозданиÑ, но пÑедоÑÑавленнÑе Ð´Ð»Ñ Ð½Ð¸Ñ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð¿Ð¾ ÑмолÑÐ°Ð½Ð¸Ñ Ð¼Ð¾Ð³ÑÑ Ð²ÑзваÑÑ ÐºÐ¾Ð½ÑÐ»Ð¸ÐºÑ Ð² Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð¸ÑполÑзованиÑ. ÐапÑимеÑ, ÑаÑÑмоÑÑиÑе ÑледÑÑÑие опÑеделениÑ:
CREATE FUNCTION foo(int) ... CREATE FUNCTION foo(int, int default 42) ...
ÐÑзов foo(10) завеÑÑиÑÑÑ Ð¾Ñибкой из-за неоднознаÑноÑÑи в вÑбоÑе вÑзÑваемой ÑÑнкÑии.
ÐÑимеÑаниÑ
РобÑÑвлении аÑгÑменÑов ÑÑнкÑии и возвÑаÑаемого знаÑÐµÐ½Ð¸Ñ Ð´Ð¾Ð¿ÑÑкаеÑÑÑ Ð¿Ð¾Ð»Ð½Ñй ÑинÑакÑÐ¸Ñ Ð¾Ð¿Ð¸ÑÐ°Ð½Ð¸Ñ Ñипа SQL. Ðднако модиÑикаÑоÑÑ Ñипа в ÑкобкаÑ
(напÑимеÑ, поле ÑоÑноÑÑи Ð´Ð»Ñ Ñипа numeric) команда CREATE FUNCTION не ÑÑиÑÑваеÑ. Так ÑÑо, напÑимеÑ, CREATE FUNCTION foo (varchar(10)) ... ÑоздаÑÑ ÑакÑÑ Ð¶Ðµ ÑÑнкÑиÑ, ÑÑо и CREATE FUNCTION foo (varchar) ....
ÐÑи замене ÑÑÑеÑÑвÑÑÑей ÑÑнкÑии Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ CREATE OR REPLACE FUNCTION еÑÑÑ Ð¾Ð³ÑаниÑÐµÐ½Ð¸Ñ Ð½Ð° Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¸Ð¼Ñн паÑамеÑÑов. Ð ÑаÑÑноÑÑи, нелÑÐ·Ñ Ð¸Ð·Ð¼ÐµÐ½Ð¸ÑÑ Ð¸Ð¼Ñ, Ñже назнаÑенное лÑÐ±Ð¾Ð¼Ñ Ð²Ñ
Ð¾Ð´Ð½Ð¾Ð¼Ñ Ð¿Ð°ÑамеÑÑÑ (Ñ
оÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ добавиÑÑ Ð¸Ð¼ÐµÐ½Ð° Ñанее безÑмÑннÑм паÑамеÑÑам). Также, еÑли Ñ ÑÑнкÑии более одного вÑÑ
одного паÑамеÑÑа, нелÑÐ·Ñ Ð¸Ð·Ð¼ÐµÐ½ÑÑÑ Ð¸Ð¼ÐµÐ½Ð° вÑÑ
однÑÑ
паÑамеÑÑов, Ñак как ÑÑо пÑиведÑÑ Ðº Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¸Ð¼Ñн ÑÑолбÑов анонимного ÑоÑÑавного Ñипа, опиÑÑваÑÑего ÑезÑлÑÑÐ°Ñ ÑÑнкÑии. ÐÑи огÑаниÑÐµÐ½Ð¸Ñ Ð¿Ð¾Ð·Ð²Ð¾Ð»ÑÑÑ Ð³Ð°ÑанÑиÑоваÑÑ, ÑÑо ÑÑÑеÑÑвÑÑÑие вÑÐ·Ð¾Ð²Ñ ÑÑнкÑии не пеÑеÑÑанÑÑ ÑабоÑаÑÑ Ð¿Ð¾Ñле ÐµÑ Ð·Ð°Ð¼ÐµÐ½Ñ.
ÐÑли ÑÑнкÑÐ¸Ñ Ð¾Ð±ÑÑвлена как STRICT Ñ Ð°ÑгÑменÑом VARIADIC, пÑи оÑенивании ÑÑÑогоÑÑи пÑовеÑÑеÑÑÑ, ÑÑо веÑÑ Ð¿ÐµÑеменнÑй маÑÑив в Ñелом не NULL. ÐÑли же в ÑÑом маÑÑиве ÑодеÑжаÑÑÑ ÑлеменÑÑ NULL, ÑÑнкÑÐ¸Ñ Ð±ÑÐ´ÐµÑ Ð²ÑзÑваÑÑÑÑ.
ÐÑимеÑÑ
SQL-ÑÑнкÑиÑ, ÑкладÑваÑÑÐ°Ñ Ð´Ð²Ð° ÑелÑÑ ÑиÑла:
CREATE FUNCTION add(integer, integer) RETURNS integer
AS 'select $1 + $2;'
LANGUAGE SQL
IMMUTABLE
RETURNS NULL ON NULL INPUT;ÐналогиÑÐ½Ð°Ñ ÑÑнкÑиÑ, опÑеделÑÐ½Ð½Ð°Ñ Ð² ÑÑиле, ÑооÑвеÑÑÑвÑÑÑем ÑÑандаÑÑÑ SQL, Ñ Ð¸Ð¼ÐµÐ½Ð°Ð¼Ð¸ аÑгÑменÑов и без обÑамлÑÑÑÐ¸Ñ Ñело кавÑÑек:
CREATE FUNCTION add(a integer, b integer) RETURNS integer
LANGUAGE SQL
IMMUTABLE
RETURNS NULL ON NULL INPUT
RETURN a + b;ФÑнкÑÐ¸Ñ ÑвелиÑÐµÐ½Ð¸Ñ Ñелого ÑиÑла на 1, иÑполÑзÑÑÑÐ°Ñ Ð¸Ð¼ÐµÐ½Ð¾Ð²Ð°Ð½Ð½Ñй аÑгÑменÑ, на ÑзÑке PL/pgSQL:
CREATE OR REPLACE FUNCTION increment(i integer) RETURNS integer AS $$
BEGIN
RETURN i + 1;
END;
$$ LANGUAGE plpgsql;ФÑнкÑиÑ, возвÑаÑаÑÑÐ°Ñ Ð·Ð°Ð¿Ð¸ÑÑ Ñ Ð½ÐµÑколÑкими вÑÑ Ð¾Ð´Ð½Ñми паÑамеÑÑами:
CREATE FUNCTION dup(in int, out f1 int, out f2 text)
AS $$ SELECT $1, CAST($1 AS text) || ' is text' $$
LANGUAGE SQL;
SELECT * FROM dup(42);То же Ñамое можно ÑделаÑÑ Ð±Ð¾Ð»ÐµÐµ ÑазвÑÑнÑÑо, Ñвно обÑÑвив ÑоÑÑавной Ñип:
CREATE TYPE dup_result AS (f1 int, f2 text);
CREATE FUNCTION dup(int) RETURNS dup_result
AS $$ SELECT $1, CAST($1 AS text) || ' is text' $$
LANGUAGE SQL;
SELECT * FROM dup(42); ÐÑÑ Ð¾Ð´Ð¸Ð½ ÑпоÑоб веÑнÑÑÑ Ð½ÐµÑколÑко ÑÑолбÑов â пÑимениÑÑ ÑÑнкÑÐ¸Ñ TABLE:
CREATE FUNCTION dup(int) RETURNS TABLE(f1 int, f2 text)
AS $$ SELECT $1, CAST($1 AS text) || ' is text' $$
LANGUAGE SQL;
SELECT * FROM dup(42); Ðднако пÑÐ¸Ð¼ÐµÑ Ñ TABLE оÑлиÑаеÑÑÑ Ð¾Ñ Ð¿ÑедÑдÑÑиÑ
, Ñак как в нÑм ÑÑнкÑÐ¸Ñ Ð½Ð° Ñамом деле возвÑаÑÐ°ÐµÑ Ð½Ðµ однÑ, а Ð½Ð°Ð±Ð¾Ñ Ð·Ð°Ð¿Ð¸Ñей.
РазÑабоÑка заÑиÑÑннÑÑ
ÑÑнкÑий SECURITY DEFINER
Так как ÑÑнкÑÐ¸Ñ SECURITY DEFINER вÑполнÑеÑÑÑ Ñ Ð¿Ñавами полÑзоваÑелÑ, владеÑÑего ей, необÑ
одимо позабоÑиÑÑÑÑ Ð¾ Ñом, ÑÑÐ¾Ð±Ñ ÐµÑ Ð½ÐµÐ»ÑÐ·Ñ Ð±Ñло иÑполÑзоваÑÑ Ð½Ðµ по назнаÑениÑ. Ð ÑелÑÑ
безопаÑноÑÑи в пÑÑи search_path ÑледÑÐµÑ Ð¸ÑклÑÑиÑÑ Ð»ÑбÑе ÑÑ
емÑ, доÑÑÑпнÑе на запиÑÑ Ð½ÐµÐ´Ð¾Ð²ÐµÑеннÑм полÑзоваÑелÑм. ÐÑо не Ð¿Ð¾Ð·Ð²Ð¾Ð»Ð¸Ñ Ð·Ð»Ð¾Ð½Ð°Ð¼ÐµÑеннÑм полÑзоваÑелÑм ÑоздаÑÑ Ñвои обÑекÑÑ (напÑимеÑ, ÑаблиÑÑ, ÑÑнкÑии и опеÑаÑоÑÑ), коÑоÑÑе замаÑкиÑÑÑÑ Ð¾Ð±ÑекÑÑ, иÑполÑзÑемÑе ÑÑнкÑией. ÐÑобенно важно в ÑÑом оÑноÑении иÑклÑÑиÑÑ ÑÑ
ÐµÐ¼Ñ Ð²ÑеменнÑÑ
ÑаблиÑ, коÑоÑÐ°Ñ Ð¿Ð¾ ÑмолÑÐ°Ð½Ð¸Ñ Ð¿ÑоÑмаÑÑиваеÑÑÑ Ð¿ÐµÑвой, а пÑаво запиÑи в Ð½ÐµÑ Ð¿Ð¾ ÑмолÑÐ°Ð½Ð¸Ñ Ð¸Ð¼ÐµÑÑ Ð²Ñе. СооÑвеÑÑÑвÑÑÑÑÑ Ð·Ð°ÑиÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ оÑганизоваÑÑ, помеÑÑив вÑеменнÑÑ ÑÑ
ÐµÐ¼Ñ Ð² ÐºÐ¾Ð½ÐµÑ ÑпиÑка поиÑка. ÐÐ»Ñ ÑÑого ÑледÑÐµÑ ÑделаÑÑ pg_temp поÑледней запиÑÑÑ Ð² search_path. ÐезопаÑное иÑполÑзование демонÑÑÑиÑÑÐµÑ ÑледÑÑÑÐ°Ñ ÑÑнкÑиÑ:
CREATE FUNCTION check_password(uname TEXT, pass TEXT)
RETURNS BOOLEAN AS $$
DECLARE passed BOOLEAN;
BEGIN
SELECT (pwd = $2) INTO passed
FROM pwds
WHERE username = $1;
RETURN passed;
END;
$$ LANGUAGE plpgsql
SECURITY DEFINER
-- УÑÑановиÑÑ Ð±ÐµÐ·Ð¾Ð¿Ð°ÑнÑй пÑÑÑ Ð¿Ð¾Ð¸Ñка: ÑнаÑала довеÑÐµÐ½Ð½Ð°Ñ ÑÑ
ема(Ñ), заÑем 'pg_temp'.
SET search_path = admin, pg_temp; ÐÑа ÑÑнкÑÐ¸Ñ Ð´Ð¾Ð»Ð¶Ð½Ð° обÑаÑаÑÑÑÑ Ðº ÑаблиÑе admin.pwds, но без пÑÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ SET или Ñ Ð¿Ñедложением SET, вклÑÑаÑÑим ÑолÑко admin, ÐµÑ Ð¼Ð¾Ð¶Ð½Ð¾ «обманÑÑÑ», Ñоздав вÑеменнÑÑ ÑаблиÑÑ pwds.
ÐÑли ÑÑнкÑиÑ, опÑеделÑÑÑÐ°Ñ ÐºÐ¾Ð½ÑекÑÑ Ð±ÐµÐ·Ð¾Ð¿Ð°ÑноÑÑи, должна ÑоздаваÑÑ Ñоли, и она вÑзÑваеÑÑÑ Ð½Ðµ Ð¾Ñ Ð¸Ð¼ÐµÐ½Ð¸ ÑÑпеÑполÑзоваÑелÑ, необÑ
одимо задаÑÑ Ð´Ð»Ñ Ð¿Ð°ÑамеÑÑа createrole_self_grant непÑÑÑое знаÑение, добавив пÑедложение SET.
Также ÑледÑÐµÑ Ð¿Ð¾Ð¼Ð½Ð¸ÑÑ Ð¾ Ñом, ÑÑо по ÑмолÑÐ°Ð½Ð¸Ñ Ð¿Ñаво вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð´Ð»Ñ ÑоздаваемÑÑ
ÑÑнкÑий Ð¸Ð¼ÐµÐµÑ ÑÐ¾Ð»Ñ PUBLIC (за подÑобноÑÑÑми обÑаÑиÑеÑÑ Ðº РазделÑ 5.8). Ðднако ÑаÑÑо ÑÑебÑеÑÑÑ ÑазÑеÑиÑÑ Ð´Ð¾ÑÑÑп к ÑÑнкÑиÑм, ÑабоÑаÑÑим в конÑекÑÑе опÑеделивÑего, ÑолÑко некоÑоÑÑм полÑзоваÑелÑм. ÐÐ»Ñ ÑÑого необÑ
одимо оÑозваÑÑ ÑÑандаÑÑнÑе пÑава PUBLIC и заÑем даÑÑ Ð¿Ñава на вÑполнение индивидÑалÑно. ЧÑÐ¾Ð±Ñ Ð½Ðµ обÑазовалоÑÑ Ð¾ÐºÐ½Ð¾, в коÑоÑом Ð½Ð¾Ð²Ð°Ñ ÑÑнкÑÐ¸Ñ Ð±ÑÐ´ÐµÑ Ð´Ð¾ÑÑÑпна вÑем, ÑоздайÑе ÐµÑ Ð¸ назнаÑÑÑе пÑава в одной ÑÑанзакÑии. ÐапÑимеÑ, Ñак:
BEGIN; CREATE FUNCTION check_password(uname TEXT, pass TEXT) ... SECURITY DEFINER; REVOKE ALL ON FUNCTION check_password(uname TEXT, pass TEXT) FROM PUBLIC; GRANT EXECUTE ON FUNCTION check_password(uname TEXT, pass TEXT) TO admins; COMMIT;
СовмеÑÑимоÑÑÑ
Ðоманда CREATE FUNCTION опÑеделена в ÑÑандаÑÑе SQL. ÐÑ ÑеализаÑÐ¸Ñ Ð² PostgreSQL Ð¼Ð¾Ð¶ÐµÑ Ð¸ÑполÑзоваÑÑÑÑ ÑовмеÑÑимÑм обÑазом, но дополнена множеÑÑвом ÑаÑÑиÑений. РнапÑоÑив, в ÑÑандаÑÑе SQL опÑеделÑн ÑÑд дополниÑелÑнÑÑ
веÑей, не ÑеализованнÑÑ
в PostgreSQL.
ÐбÑаÑиÑе внимание на важнÑе замеÑÐ°Ð½Ð¸Ñ Ð¾ ÑовмеÑÑимоÑÑи:
Указание
OR REPLACEÑвлÑеÑÑÑ ÑаÑÑиÑением PostgreSQL.ÐÐ»Ñ ÑовмеÑÑимоÑÑи Ñ Ð´ÑÑгими СУÐÐ
Ñежим_аÑгÑменÑаможно запиÑаÑÑ Ð¿Ð¾ÑлеимÑ_аÑгÑменÑаили пеÑед ним, но ÑÑандаÑÑÑ ÑооÑвеÑÑÑвÑÐµÑ ÑолÑко пеÑвÑй ваÑианÑ.ÐÐ»Ñ Ð¾Ð¿ÑÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð·Ð½Ð°Ñений по ÑмолÑÐ°Ð½Ð¸Ñ Ð´Ð»Ñ Ð¿Ð°ÑамеÑÑов ÑÑандаÑÑ SQL поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ ÑолÑко ÑинÑакÑÐ¸Ñ Ñ ÐºÐ»ÑÑевÑм Ñловом
DEFAULT. СинÑакÑÐ¸Ñ Ñо знаком=иÑполÑзÑеÑÑÑ Ð² T-SQL и Firebird.Указание
SETOFÑвлÑеÑÑÑ ÑаÑÑиÑением PostgreSQL.Ð ÑÑандаÑÑе опÑеделÑн ÑолÑко один ÑзÑк â
SQL.ÐÑе аÑÑибÑÑÑ, кÑоме
CALLED ON NULL INPUTиRETURNS NULL ON NULL INPUT, оÑноÑÑÑÑÑ Ðº ÑаÑÑиÑением ÑÑандаÑÑа.Тело ÑÑнкÑии в ÑÑиле
LANGUAGE SQL, ÑоглаÑно ÑÑандаÑÑÑ SQL, Ð¼Ð¾Ð¶ÐµÑ Ð¾Ð¿ÑеделÑÑÑÑÑ ÑолÑко в ÑоÑме, задаÑÑейÑело_sql.
ÐÑоÑÑÑе ÑÑнкÑии в ÑÑиле LANGUAGE SQL можно опÑеделиÑÑ Ñак, ÑÑÐ¾Ð±Ñ Ð¸Ñ
опÑеделение ÑооÑвеÑÑÑвовало ÑÑандаÑÑÑ Ð¸ бÑло ÑовмеÑÑимÑм Ñ Ð´ÑÑгими ÑеализаÑиÑми. Ðолее ÑложнÑе ÑÑнкÑии, иÑполÑзÑÑÑие ÑаÑÑиÑеннÑе возможноÑÑи, аÑÑибÑÑÑ Ð¾Ð¿ÑимизаÑии, или напиÑаннÑе на дÑÑгиÑ
ÑзÑкаÑ
, по понÑÑнÑм пÑиÑинам Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¾Ð¿ÑеделÑÑÑÑÑ Ð² ÑпеÑиалÑном ÑинÑакÑиÑе PostgreSQL.