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; 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, но в базы данных эти языки по умолчанию не устанавливаются.