44.4. ÐлобалÑнÑе знаÑÐµÐ½Ð¸Ñ Ð² PL/Perl #
ÐÑ Ð¼Ð¾Ð¶ÐµÑе иÑполÑзоваÑÑ Ð´Ð»Ñ Ñ
ÑÐ°Ð½ÐµÐ½Ð¸Ñ Ð´Ð°Ð½Ð½ÑÑ
, вклÑÑÐ°Ñ ÑÑÑлки на код, глобалÑнÑй Ñ
ÐµÑ %_SHARED. ÐÑи даннÑе бÑдÑÑ ÑоÑ
ÑанÑÑÑÑÑ Ð¼ÐµÐ¶Ð´Ñ Ð²Ñзовами ÑÑнкÑии на пÑоÑÑжении вÑего ÑекÑÑего ÑеанÑа.
ÐÑоÑÑой пÑÐ¸Ð¼ÐµÑ ÑабоÑÑ Ñ ÑазделÑемÑми даннÑми:
CREATE OR REPLACE FUNCTION set_var(name text, val text) RETURNS text AS $$
if ($_SHARED{$_[0]} = $_[1]) {
return 'ok';
} else {
return "cannot set shared variable $_[0] to $_[1]";
}
$$ LANGUAGE plperl;
CREATE OR REPLACE FUNCTION get_var(name text) RETURNS text AS $$
return $_SHARED{$_[0]};
$$ LANGUAGE plperl;
SELECT set_var('sample', 'Hello, PL/Perl! How''s tricks?');
SELECT get_var('sample');ÐÑо ÑÑÑÑ Ð±Ð¾Ð»ÐµÐµ ÑложнÑй пÑимеÑ, в коÑоÑом иÑполÑзÑеÑÑÑ ÑÑÑлка на код:
CREATE OR REPLACE FUNCTION myfuncs() RETURNS void AS $$
$_SHARED{myquote} = sub {
my $arg = shift;
$arg =~ s/(['\\])/\\$1/g;
return "'$arg'";
};
$$ LANGUAGE plperl;
SELECT myfuncs(); /* иниÑиализаÑÐ¸Ñ ÑÑнкÑии */
/* ÐпÑеделение ÑÑнкÑии, иÑполÑзÑÑÑей ÑÑнкÑÐ¸Ñ Ð·Ð°ÐºÐ»ÑÑÐµÐ½Ð¸Ñ Ð² кавÑÑки */
CREATE OR REPLACE FUNCTION use_quote(TEXT) RETURNS text AS $$
my $text_to_quote = shift;
my $qfunc = $_SHARED{myquote};
return &$qfunc($text_to_quote);
$$ LANGUAGE plperl; (Ðод вÑÑе можно бÑло Ð±Ñ ÑпÑоÑÑиÑÑ Ð´Ð¾ одноÑÑÑоÑной ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ return $_SHARED{myquote}->($_[0]); в ÑÑеÑб ÑиÑаемоÑÑи.)
Ðо ÑообÑажениÑм безопаÑноÑÑи, PL/Perl вÑполнÑÐµÑ ÑÑнкÑии, вÑзÑваемÑе некоÑоÑой ÑолÑÑ SQL, в оÑделÑном инÑеÑпÑеÑаÑоÑе Perl, вÑделенном Ð´Ð»Ñ ÑÑой Ñоли. ÐÑо пÑедоÑвÑаÑÐ°ÐµÑ ÑлÑÑайное или злонамеÑенное влиÑние одного полÑзоваÑÐµÐ»Ñ Ð½Ð° поведение ÑÑнкÑий PL/Perl дÑÑгого полÑзоваÑелÑ. Ркаждом инÑеÑпÑеÑаÑоÑе бÑÐ´ÐµÑ ÑÐ²Ð¾Ñ Ð·Ð½Ð°Ñение пеÑеменной %_SHARED и ÑобÑÑвенное глобалÑное ÑоÑÑоÑние. Таким обÑазом, две ÑÑнкÑии PL/Perl бÑдÑÑ ÑазделÑÑÑ Ð¾Ð´Ð½Ð¾ знаÑение %_SHARED, ÑолÑко еÑли они вÑполнÑÑÑÑÑ Ð¾Ð´Ð½Ð¾Ð¹ ÑолÑÑ SQL. РпÑиложении, вÑполнÑÑÑем код в одном ÑеанÑе Ñ ÑазнÑми ÑолÑми SQL (вÑзÑваÑÑем ÑÑнкÑии SECURITY DEFINER, иÑполÑзÑÑÑем ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ SET ROLE и Ñ. д.) Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾Ð½Ð°Ð´Ð¾Ð±Ð¸ÑÑÑÑ Ñвно пÑедпÑинÑÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑе меÑÑ, ÑÑÐ¾Ð±Ñ ÑÑнкÑии на PL/Perl могли ÑазделÑÑÑ Ð´Ð°Ð½Ð½Ñе ÑеÑез %_SHARED. ÐÐ»Ñ ÑÑого ÑнаÑала ÑÑÑановиÑе Ð´Ð»Ñ ÑÑнкÑий, коÑоÑÑе Ð´Ð¾Ð»Ð¶Ð½Ñ Ð²Ð·Ð°Ð¸Ð¼Ð¾Ð´ÐµÐ¹ÑÑвоваÑÑ, одного владелÑÑа, а заÑем задайÑе Ð´Ð»Ñ Ð½Ð¸Ñ
ÑвойÑÑво SECURITY DEFINER. РазÑмееÑÑÑ, пÑи ÑÑом нÑжно позабоÑиÑÑÑÑ Ð¾ Ñом, ÑÑÐ¾Ð±Ñ ÑÑи ÑÑнкÑии не могли ÑделаÑÑ Ð½Ð¸Ñего непÑедÑÑмоÑÑенного.