40.1. Установка процедурных языков #
Прежде всего, процедурный язык должен быть «установлен» в каждую базу данных, где он будет использоваться. Но процедурные языки, устанавливаемые в базу данных template1, автоматически становятся доступными во всех впоследствии создаваемых базах, так как их определения в template1 будут скопированы командой CREATE DATABASE. Таким образом, администратор баз данных может выбрать, какие языки будут доступны в определённых базах данных, и при желании сделать некоторые языки доступными по умолчанию.
Для языков, включённых в стандартный дистрибутив, достаточно выполнить команду CREATE EXTENSION имя_языка, чтобы установить язык в текущую базу данных. Описанная ниже ручная процедура рекомендуется только для установки языков, не упакованных в виде расширений.
Установка процедурного языка вручную
Процедурный язык устанавливается в базу данных в пять этапов, и выполнять их должен администратор баз данных. В большинстве случаев необходимые команды SQL следует упаковать в виде установочного скрипта «расширения», чтобы их можно было выполнить, воспользовавшись командой CREATE EXTENSION.
- Разделяемый объект для обработчика языка должен быть скомпилирован и установлен в соответствующий каталог библиотек. Это в принципе не отличается от сборки и установки дополнительных модулей с обычными функциями на языке C; см. Подраздел 36.10.5. Часто обработчик языка зависит от внешней библиотеки, в которой собственно реализован исполнитель языка программирования; в таких случаях нужно установить и эту библиотеку. 
- Обработчик должен быть объявлен командой - 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] LANGUAGE - имя_языкаHANDLER- имя_функции_обработчика[INLINE- имя_обработчика_внедрённого_кода] [VALIDATOR- имя_функции_проверки] ;- Необязательное ключевое слово - TRUSTED(доверенный) указывает, что язык не предоставляет пользователю доступ к данным, которого он не имел бы без него. Доверенные языки предназначены для обычных пользователей баз данных, не имеющих прав суперпользователя, и их можно использовать для безопасного создания функций и процедур. Так как функции PL выполняются внутри сервера баз данных, флаг- TRUSTEDследует устанавливать только для тех языков, которые не позволяют обращаться к внутренним механизмам сервера или файловой системе. Языки PL/pgSQL, PL/Tcl и PL/Perl считаются доверенными; языки PL/TclU, PL/PerlU и PL/PythonU предоставляют неограниченную функциональность, и их не следует помечать как доверенные.
Примере 40.1 показывает, как выполняется процедура ручной установки для языка PL/Perl.
Пример 40.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 STRICT;
CREATE FUNCTION plperl_validator(oid) RETURNS void AS
    '$libdir/plperl' LANGUAGE C STRICT;Следующая команда:
CREATE TRUSTED 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, но в базы данных эти языки по умолчанию не устанавливаются.