Перейти к основному содержимому

CREATE LANGUAGE

примечание

Эта страница переведена при помощи нейросети GigaChat.

CREATE LANGUAGE — создание нового процедурного языка.

Синтаксис

CREATE [ OR REPLACE ] [ TRUSTED ] [ PROCEDURAL ] LANGUAGE name
HANDLER call_handler [ INLINE inline_handler ] [ VALIDATOR valfunction ]
CREATE [ OR REPLACE ] [ TRUSTED ] [ PROCEDURAL ] LANGUAGE name

Описание

CREATE LANGUAGE используется для регистрации нового процедурного языка в базе данных PostgreSQL. После регистрации можно создавать функции и процедуры, написанные на этом языке.

По сути, CREATE LANGUAGE связывает имя языка с функциями обработки, которые отвечают за выполнение функций, написанных на данном языке. Подробнее об обработчиках языков можно узнать в разделе «Создание процедурного языка обработки».

CREATE OR REPLACE LANGUAGE позволяет либо зарегистрировать новый язык, либо обновить параметры уже существующего. При замене существующего языка его параметры обновляются, но права доступа, владельцы и уже созданные функции на этом языке сохраняются без изменений.

Для создания или изменения процедурного языка необходимы права суперпользователя. Однако после создания языка право собственности на него можно передать обычному пользователю, который сможет удалить язык, изменить его права, переименовать или передать его другому владельцу.

Примечание

Не рекомендуется передавать права на базовые C-функции языка непривилегированным пользователям — это может привести к повышению их привилегий.

Устаревший синтаксис CREATE LANGUAGE без указания функции обработки интерпретируется как команда CREATE EXTENSION. Это сделано для поддержки старых дампов. Такой подход работает, если язык был оформлен как расширение с тем же именем, что является стандартным способом установки процедурных языков.

Параметры

TRUSTED
Указывает, что язык безопасен и не предоставляет доступ к данным вне пользовательских прав. Если параметр не указан, только суперпользователи смогут создавать функции на этом языке.
PROCEDURAL
Зарезервированное слово, не имеющее функционального значения — используется для ясности синтаксиса.
name
Задает имя процедурного языка (уникальное среди языков в пределах базы данных), который должен быть создан.
HANDLER call_handler
Указывает имя ранее зарегистрированной функции обработки, которая будет вызываться для выполнения функций, написанных на данном языке.

Функция обработки должна быть реализована на компилируемом языке (например, на C) и соответствовать соглашению о вызове версии 1. В PostgreSQL такая функция регистрируется как не принимающая аргументов и возвращающая тип language_handler, который служит лишь для указания ее роли как обработчика.

INLINE inline_handler
Указывает имя ранее зарегистрированной функции, вызываемой при выполнении анонимных блоков кода с помощью команды DO. Если inline_handler не указан, язык не поддерживает выполнение таких блоков.

Функция должна принимать один аргумент типа internal (внутреннее представление команды DO) и, как правило, возвращает void. Возвращаемое значение игнорируется.

VALIDATOR valfunction
Задает имя ранее зарегистрированной функции (valfunction), вызываемой при создании новых функций на этом языке — для их проверки.

Если валидатор не указан, новая функция не будет проверяться при создании. Функция должна принимать один аргумент типа oid, который будет идентификатором создаваемой функции, и обычно возвращает void.

Валидатор может проверять как синтаксис тела функции, так и другие свойства (например, допустимость типов аргументов). В случае ошибки должна использоваться функция ereport(). Результат выполнения валидатора игнорируется.

Примечания

Для удаления процедурного языка используйте команду DROP LANGUAGE.

Информацию об установленных языках можно найти в системном каталоге pg_language. Кроме того, команда \dL в psql выведет список всех зарегистрированных языков.

Чтобы создавать функции на процедурном языке, пользователь должен иметь привилегию USAGE на этот язык. По умолчанию эта привилегия предоставляется всем (PUBLIC) — только для доверенных языков. При необходимости ее можно отозвать.

Процедурные языки являются локальными для конкретной базы данных. Чтобы язык был доступен во всех новых базах данных, его можно установить в базу template1.

Примеры

Минимальная процедура создания нового процедурного языка:

CREATE FUNCTION plsample_call_handler() RETURNS language_handler
AS '$libdir/plsample'
LANGUAGE C;
CREATE LANGUAGE plsample
HANDLER plsample_call_handler;

Обычно эти команды записываются в скрипте установки расширения, которое пользователи затем устанавливают так:

CREATE EXTENSION plsample;

Совместимость

CREATE LANGUAGE является расширением PostgreSQL.

Смотрите также

ALTER LANGUAGE, CREATE FUNCTION, DROP LANGUAGE, GRANT, REVOKE