CREATE LANGUAGE — definir un nuevo lenguaje procedimental
CREATE [ OR REPLACE ] [ TRUSTED ] [ PROCEDURAL ] LANGUAGEnombreHANDLERmanejador_llamadas[ INLINEmanejador_en_línea] [ VALIDATORfunción_validación] CREATE [ OR REPLACE ] [ TRUSTED ] [ PROCEDURAL ] LANGUAGEnombre
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.
TRUSTEDTRUSTED 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.
PROCEDURALEsta es una palabra de ruido (noise word) sin efecto.
nombreEl nombre del nuevo lenguaje procedimental. El nombre debe ser único entre los lenguajes de la base de datos.
HANDLER manejador_llamadasmanejador_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íneamanejador_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ónfunció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.
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.
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;
CREATE LANGUAGE es una extensión de PostgreSQL.