41.5. ÐовеÑеннÑй и недовеÑеннÑй PL/Perl
ÐбÑÑно PL/Perl ÑÑÑанавливаеÑÑÑ Ð² Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
как «довеÑеннÑй» ÑзÑк пÑогÑаммиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ plperl. ÐÑи ÑÑом в ÑелÑÑ
безопаÑноÑÑи опÑеделÑннÑе опеÑаÑии в Perl запÑеÑаÑÑÑÑ. ÐообÑе говоÑÑ, запÑеÑаÑÑÑÑ Ð²Ñе опеÑаÑии, взаимодейÑÑвÑÑÑие Ñ Ð¾ÐºÑÑжением. Ð Ñом ÑиÑле, ÑÑо опеÑаÑии Ñ Ñайлами, require и use (Ð´Ð»Ñ Ð²Ð½ÐµÑниÑ
модÑлей). ÐоÑÑÐ¾Ð¼Ñ ÑÑнкÑии на PL/Perl, в оÑлиÑие Ð¾Ñ ÑÑнкÑий на C, никаким обÑазом не могÑÑ Ð²Ð·Ð°Ð¸Ð¼Ð¾Ð´ÐµÐ¹ÑÑвоваÑÑ Ñ Ð²Ð½ÑÑÑенними меÑ
анизмами ÑеÑвеÑа баз даннÑÑ
или обÑаÑаÑÑÑÑ Ðº опеÑаÑионной ÑиÑÑеме Ñ Ð¿Ñавами ÑеÑвеÑного пÑоÑеÑÑа. ÐÑледÑÑвие ÑÑого, иÑполÑзоваÑÑ ÑÑÐ¾Ñ ÑзÑк можно ÑазÑеÑиÑÑ Ð»ÑÐ±Ð¾Ð¼Ñ Ð½ÐµÐ¿ÑивилегиÑÐ¾Ð²Ð°Ð½Ð½Ð¾Ð¼Ñ Ð¿Ð¾Ð»ÑзоваÑÐµÐ»Ñ Ð±Ð°Ð· даннÑÑ
.
Ð ÑледÑÑÑем пÑимеÑе показана ÑÑнкÑиÑ, коÑоÑÐ°Ñ Ð½Ðµ бÑÐ´ÐµÑ ÑабоÑаÑÑ, поÑÐ¾Ð¼Ñ ÑÑо опеÑаÑии Ñ Ñайловой ÑиÑÑÐµÐ¼Ñ Ð·Ð°Ð¿ÑеÑÐµÐ½Ñ Ð¿Ð¾ ÑообÑажениÑм безопаÑноÑÑи:
CREATE FUNCTION badfunc() RETURNS integer AS $$
my $tmpfile = "/tmp/badfile";
open my $fh, '>', $tmpfile
or elog(ERROR, qq{could not open the file "$tmpfile": $!});
print $fh "Testing writing to a file\n";
close $fh or elog(ERROR, qq{could not close the file "$tmpfile": $!});
return 1;
$$ LANGUAGE plperl;СоздаÑÑ ÑÑÑ ÑÑнкÑÐ¸Ñ Ð½Ðµ ÑдаÑÑÑÑ, Ñак как пÑи пÑовеÑке ÐµÑ Ð¿ÑавилÑноÑÑи бÑÐ´ÐµÑ Ð¾Ð±Ð½Ð°ÑÑжено иÑполÑзование запÑеÑÑнного опеÑаÑоÑа.
Ðногда Ð²Ð¾Ð·Ð½Ð¸ÐºÐ°ÐµÑ Ð¶ÐµÐ»Ð°Ð½Ð¸Ðµ напиÑаÑÑ Ð½Ð° Perl код, ÑÑнкÑионалÑноÑÑÑ ÐºÐ¾ÑоÑого не бÑÐ´ÐµÑ Ð¾Ð³ÑаниÑиваÑÑÑÑ. ÐапÑимеÑ, Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾ÑÑебоваÑÑÑÑ ÑÑнкÑÐ¸Ñ Ð½Ð° Perl, коÑоÑÐ°Ñ Ð±ÑÐ´ÐµÑ Ð¿Ð¾ÑÑлаÑÑ Ð¿Ð¾ÑÑÑ. ÐÐ»Ñ ÑакиÑ
поÑÑебноÑÑей PL/Perl Ñакже можно ÑÑÑановиÑÑ ÐºÐ°Ðº «недовеÑеннÑй» ÑзÑк (обÑÑно его назÑваÑÑ PL/PerlU). Ð ÑÑом ÑлÑÑае бÑдÑÑ Ð´Ð¾ÑÑÑÐ¿Ð½Ñ Ð²Ñе возможноÑÑи ÑзÑка Perl. УÑÑÐ°Ð½Ð°Ð²Ð»Ð¸Ð²Ð°Ñ ÑзÑк, ÑкажиÑе Ð¸Ð¼Ñ plperlu, ÑÑÐ¾Ð±Ñ Ð²ÑбÑаÑÑ Ð½ÐµÐ´Ð¾Ð²ÐµÑеннÑÑ Ð²Ð°ÑиаÑÐ¸Ñ PL/Perl.
ÐвÑÐ¾Ñ ÑÑнкÑии на PL/PerlU должен позабоÑиÑÑÑÑ Ð¾ Ñом, ÑÑÐ¾Ð±Ñ ÑÑÑ ÑÑнкÑÐ¸Ñ Ð½ÐµÐ»ÑÐ·Ñ Ð±Ñло иÑполÑзоваÑÑ Ð½Ðµ по назнаÑениÑ, Ñак как она Ð¼Ð¾Ð¶ÐµÑ Ð´ÐµÐ»Ð°ÑÑ Ð²ÑÑ, ÑÑо Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾Ð»ÑзоваÑÐµÐ»Ñ Ñ Ð¿Ñавами админиÑÑÑаÑоÑа баз даннÑÑ . ÐамеÑÑÑе, ÑÑо СУÐРпозволÑÐµÑ ÑоздаваÑÑ ÑÑнкÑии на недовеÑеннÑÑ ÑзÑÐºÐ°Ñ ÑолÑко ÑÑпеÑполÑзоваÑелÑм Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ .
ÐÑли Ð¿Ð¾ÐºÐ°Ð·Ð°Ð½Ð½Ð°Ñ Ð²ÑÑе ÑÑнкÑÐ¸Ñ Ð±ÑÐ´ÐµÑ Ñоздана ÑÑпеÑполÑзоваÑелем, и пÑи ÑÑом бÑÐ´ÐµÑ Ð²ÑбÑан ÑзÑк plperlu, она вÑполниÑÑÑ ÑÑпеÑно.
Таким же обÑазом, в анонимном блоке кода на Perl ÑазÑеÑÐµÐ½Ñ Ð°Ð±ÑолÑÑно лÑбÑе опеÑаÑии, еÑли в каÑеÑÑве ÑзÑка вмеÑÑо plperl вÑбиÑаеÑÑÑ plperlu, но вÑполнÑÑÑ ÑÑÐ¾Ñ ÐºÐ¾Ð´ должен ÑÑпеÑполÑзоваÑелÑ.
ÐÑимеÑание
Тогда как ÑÑнкÑии на PL/Perl иÑполнÑÑÑÑÑ Ð¾ÑделÑнÑми инÑеÑпÑеÑаÑоÑами Perl Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ Ñоли SQL, вÑе ÑÑнкÑии на PL/PerlU, вÑзÑваемÑе в ÑÐ°Ð¼ÐºÐ°Ñ ÑеанÑа, иÑполнÑÑÑÑÑ Ð² одном инÑеÑпÑеÑаÑоÑе Perl (оÑлиÑном Ð¾Ñ ÑÐµÑ , ÑÑо иÑполнÑÑÑ ÑÑнкÑии PL/Perl). ÐлагодаÑÑ ÑÑомÑ, ÑÑнкÑии PL/PerlU могÑÑ Ñвободно ÑазделÑÑÑ Ð¾Ð±Ñие даннÑе, но Ð¼ÐµÐ¶Ð´Ñ ÑÑнкÑиÑми PL/Perl и PL/PerlU взаимодейÑÑвие невозможно.
ÐÑимеÑание
Perl поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ ÑабоÑÑ Ð½ÐµÑколÑкиÑ
инÑеÑпÑеÑаÑоÑов в одном пÑоÑеÑÑе, ÑолÑко еÑли он бÑл ÑобÑан Ñ Ð½ÑжнÑми Ñлагами, а именно, Ñ Ñлагом usemultiplicity или Ñ Ñлагом useithreads. (РоÑÑÑÑÑÑвие веÑкиÑ
пÑиÑин иÑполÑзоваÑÑ Ð¿Ð¾Ñоки пÑедпоÑÑиÑелÑнÑм ÑвлÑеÑÑÑ Ð²Ð°ÑÐ¸Ð°Ð½Ñ usemultiplicity. ÐополниÑелÑнÑÑ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе полÑÑиÑÑ Ð½Ð° ÑÑÑаниÑе man perlembed.) ÐÑи иÑполÑзовании PL/Perl Ñ Ð²ÐµÑÑией Perl, ÑобÑанной без ÑÑиÑ
Ñлагов, в ÑамкаÑ
ÑеанÑа можно бÑÐ´ÐµÑ Ð·Ð°Ð¿ÑÑÑиÑÑ ÑолÑко один инÑеÑпÑеÑаÑÐ¾Ñ Perl, Ñак ÑÑо в ÑеанÑе бÑÐ´ÐµÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ вÑполнÑÑÑ Ð»Ð¸Ð±Ð¾ ÑÑнкÑии PL/PerlU, либо ÑÑнкÑии PL/Perl (и вÑзÑваÑÑ Ð¸Ñ
должна одна ÑÐ¾Ð»Ñ SQL).