CREATE LANGUAGE

CREATE LANGUAGE — definir un nuevo lenguaje procedimental

Synopsis

CREATE [ OR REPLACE ] [ TRUSTED ] [ PROCEDURAL ] LANGUAGE nombre
    HANDLER manejador_llamadas [ INLINE manejador_en_línea ] [ VALIDATOR función_validación ]
CREATE [ OR REPLACE ] [ TRUSTED ] [ PROCEDURAL ] LANGUAGE nombre

Descripción

CREATE LANGUAGE registra un nuevo lenguaje procedimental con una base de datos PostgreSQL. Posteriormente, se pueden definir funciones y procedimientos en este nuevo lenguaje.

CREATE LANGUAGE asocia eficazmente el nombre del lenguaje con la(s) función(es) manejadora(s) que son responsables de ejecutar las funciones escritas en ese lenguaje. Consulta la Chapter 57 para obtener más información sobre los manejadores de lenguajes.

CREATE OR REPLACE LANGUAGE creará un nuevo lenguaje o reemplazará una definición existente. Si el lenguaje ya existe, sus parámetros se actualizan de acuerdo con el comando, pero la propiedad y la configuración de permisos del lenguaje no cambian, y se asume que las funciones existentes escritas en el lenguaje siguen siendo válidas.

Se debe tener el privilegio de superusuario de PostgreSQL para registrar un nuevo lenguaje o cambiar los parámetros de un lenguaje existente. Sin embargo, una vez creado el lenguaje, es válido asignar su propiedad a un no superusuario, quien luego podrá eliminarlo, cambiar sus permisos, renombrarlo o asignarlo a un nuevo propietario. (No asignes, sin embargo, la propiedad de las funciones C subyacentes a un no superusuario; eso crearía una ruta de escalada de privilegios para ese usuario).

La forma de CREATE LANGUAGE que no proporciona ninguna función manejadora está obsoleta. Para compatibilidad con archivos de volcado antiguos, se interpreta como CREATE EXTENSION. Eso funcionará si el lenguaje se ha empaquetado en una extensión del mismo nombre, que es la forma convencional de configurar lenguajes procedimentales.

Parámetros

TRUSTED

TRUSTED especifica que el lenguaje no otorga acceso a datos a los que el usuario no tendría acceso de otro modo. Si se omite esta palabra clave al registrar el lenguaje, solo los usuarios con el privilegio de superusuario de PostgreSQL pueden usar este lenguaje para crear nuevas funciones.

PROCEDURAL

Esta es una palabra de ruido (noise word) sin efecto.

nombre

El nombre del nuevo lenguaje procedimental. El nombre debe ser único entre los lenguajes de la base de datos.

HANDLER manejador_llamadas

manejador_llamadas es el nombre de una función previamente registrada que será llamada para ejecutar las funciones del lenguaje procedimental. El manejador de llamadas para un lenguaje procedimental debe estar escrito en un lenguaje compilado como C con la convención de llamadas de versión 1 y registrado en PostgreSQL como una función que no recibe argumentos y devuelve el tipo language_handler, un tipo de marcador de posición que se usa simplemente para identificar la función como un manejador de llamadas.

INLINE manejador_en_línea

manejador_en_línea es el nombre de una función previamente registrada que será llamada para ejecutar un bloque de código anónimo (comando DO) en este lenguaje. Si no se especifica ninguna función manejador_en_línea, el lenguaje no admite bloques de código anónimos. La función manejadora debe recibir un argumento de tipo internal, que será la representación interna del comando DO, y normalmente devolverá void. El valor de retorno del manejador es ignorado.

VALIDATOR función_validación

función_validación es el nombre de una función previamente registrada que será llamada cuando se cree una nueva función en el lenguaje, para validar la nueva función. Si no se especifica ninguna función validadora, entonces una nueva función no se comprobará cuando se cree. La función validadora debe recibir un argumento de tipo oid, que será el OID de la función que se va a crear, y normalmente devolverá void.

Una función validadora normalmente inspeccionaría el cuerpo de la función para verificar la corrección sintáctica, pero también puede observar otras propiedades de la función, por ejemplo, si el lenguaje no puede manejar ciertos tipos de argumentos. Para señalar un error, la función validadora debe usar la función ereport(). El valor de retorno de la función es ignorado.

Notas

Utiliza DROP LANGUAGE para eliminar lenguajes procedimentales.

El catálogo del sistema pg_language (consulta la Section 52.29) registra información sobre los lenguajes instalados actualmente. Además, el comando \dL de psql enumera los lenguajes instalados.

Para crear funciones en un lenguaje procedimental, el usuario debe tener el privilegio USAGE para el lenguaje. Por defecto, USAGE se otorga a PUBLIC (es decir, a todos) para los lenguajes de confianza (trusted). Esto se puede revocar si se desea.

Los lenguajes procedimentales son locales para cada base de datos individual. Sin embargo, un lenguaje se puede instalar en la base de datos template1, lo que hará que esté disponible automáticamente en todas las bases de datos creadas posteriormente.

Ejemplos

Una secuencia mínima para crear un nuevo lenguaje procedimental es:

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

Normalmente eso se escribiría en un script de creación de una extensión, y los usuarios harían esto para instalar la extensión:

CREATE EXTENSION plsample;

Compatibilidad

CREATE LANGUAGE es una extensión de PostgreSQL.

Consulte también

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