41.1. Установка процедурных языков
Прежде всего, процедурный язык должен быть «установлен» в каждую базу данных, где он будет использоваться. Но процедурные языки, устанавливаемые в базу данных template1
, автоматически становятся доступными во всех впоследствии создаваемых базах, так как их определения в template1
будут скопированы командой CREATE DATABASE
. Таким образом, администратор баз данных может выбрать, какие языки будут доступны в определённых базах данных, и при желании сделать некоторые языки доступными по умолчанию.
Для языков, включённых в стандартный дистрибутив, достаточно выполнить команду CREATE EXTENSION
имя_языка
, чтобы установить язык в текущую базу данных. Описанная ниже ручная процедура рекомендуется только для установки языков, не упакованных в виде расширений.
Установка процедурного языка вручную
Процедурный язык устанавливается в базу данных в пять этапов, и выполнять их должен администратор баз данных. В большинстве случаев необходимые команды SQL следует упаковать в виде установочного скрипта «расширения», чтобы их можно было выполнить, воспользовавшись командой CREATE EXTENSION
.
Разделяемый объект для обработчика языка должен быть скомпилирован и установлен в соответствующий каталог библиотек. Это в принципе не отличается от сборки и установки дополнительных модулей с обычными функциями на языке C; см. Подраздел 37.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 предоставляют неограниченную функциональность, и их не следует помечать как доверенные.
Примере 41.1 показывает, как выполняется процедура ручной установки для языка PL/Perl.
Пример 41.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, но в базы данных эти языки по умолчанию не устанавливаются.