CREATE LANGUAGE — Définir un nouveau langage procédural
CREATE [ OR REPLACE ] [ TRUSTED ] [ PROCEDURAL ] LANGUAGEnom
HANDLERgestionnaire_appel
[ VALIDATORfonction_validation
] CREATE [ OR REPLACE ] [ TRUSTED ] [ PROCEDURAL ] LANGUAGEnom
CREATE LANGUAGE
enregistre un nouveau langage
procédural à une base de données PostgreSQL. En
conséquence, les fonctions et procédures peuvent être
définies dans ce nouveau langage.
CREATE LANGUAGE
associe en fait le nom du langage à
un ou des fonctions de gestion qui sont responsable de l'exécution des fonctions
écrites dans le langage. Chapitre 42 offre de plus amples
informations sur les gestionnaires de fonctions.
CREATE OR REPLACE LANGUAGE
va soit créer un nouveau
langage, soit remplacer une définition existante. Si le langage existe
déjà, ses paramètres sont mis à jour suivant la commande, mais le
propriétaire et les droits ne changent pas, et toutes les fonctions
existantes écrite dans ce langage sont supposées être toujours valides.
Un utilisateur doit être un superutilisateur PostgreSQL pour enregistrer un nouveau langage ou modifier les paramètres d'un langage existant. Néanmoins, une fois que le langage est créé, il est possible d'affecter un propriétaire autre qu'un superutilisateur, qui pourrait le supprimer, modifier ses droits, le renommer ou lui affecter un autre propriétaire. (Néanmoins, n'affectez pas un utilisateur standard comme propriétaire d'une fonction C ; cela créerait un moyen d'escalade de droits pour cet utilisateur.
La syntaxe de CREATE LANGUAGE
qui ne fournit pas de
fonction de gestion est obsolète. Pour des raisons de compatibilité
ascendante avec les anciens fichiers de sauvegarde, c'est interprété
comme un CREATE EXTENSION
. Ceci fonctionnera
si le langage a été préparé sous la forme d'une extension de même
nom, ce qui est la façon conventionnelle de configurer les langages
de procédures.
TRUSTED
TRUSTED
indique que le langage ne donne pas accès
aux données auquel l'utilisateur n'a pas normalement accès. Si ce mot
clé est omis à l'enregistrement du langage, seuls les superutilisateurs
peuvent utiliser ce langage pour créer de nouvelles fonctions.
PROCEDURAL
Sans objet.
nom
Le nom du nouveau langage procédural. Il ne peut y avoir deux langages portant le même nom au sein de la base de données.
HANDLER
gestionnaire_appel
gestionnaire_appel
est le
nom d'une fonction précédemment enregistrée. C'est elle qui est appelée pour
exécuter les fonctions du langage procédural. Le gestionnaire d'appels
d'un langage procédural doit être écrit dans un langage compilé,
tel que le C, avec la convention d'appel version 1 et enregistré dans
PostgreSQL comme une fonction ne prenant aucun
argument et retournant le type language_handler
, type
servant essentiellement à identifier la fonction comme gestionnaire
d'appels.
INLINE
gestionnaire_en_ligne
gestionnaire_en_ligne
est
le nom d'une fonction déjà enregistrée qui sera appelée pour exécuter
un bloc de code anonyme (voir la commande DO
)
dans ce langage. Si aucune fonction gestionnaire_en_ligne
n'est indiquée,
le langage ne supporte pas les blocs de code anonymes. La fonction de
gestion doit prendre un argument du type internal
, qui
sera la représentation interne de la commande DO
, et
il renverra le type void
. La valeur de retour du
gestionnaire est ignorée.
VALIDATOR
fonction_validation
fonction_validation
est le
nom d'une fonction précédemment enregistrée. C'est elle qui est appelée
pour valider toute nouvelle fonction écrite dans ce langage.
Si aucune fonction de validation n'est spécifiée, alors toute
nouvelle fonction n'est pas vérifiée à sa création. La fonction de
validation prend obligatoirement un argument de type oid
, OID de
la fonction à créer, et renvoie par convention void
.
Une fonction de validation contrôle généralement le corps de la
fonction pour s'assurer de sa justesse syntaxique mais peut également
vérifier d'autres propriétés de la fonction (l'incapacité du langage
à gérer certains types d'argument, par exemple). Le signalement d'erreur
se fait à l'aide de la fonction ereport()
.
La valeur de retour de la fonction est ignorée.
Utiliser DROP LANGUAGE
pour supprimer un langage procédural.
Le catalogue système pg_language
(voir
Section 53.29) contient des informations sur les langages
installés. De plus, la commande psql
\dL
liste les langages installées.
Pour créer des fonctions dans un langage procédural, l'utilisateur doit
posséder le droit USAGE
pour ce langage. Par défaut,
USAGE
est donné à PUBLIC
(c'est-à-dire tout le monde)
pour les langages de confiance. Ce droit peut être révoqué si nécessaire.
Les langages procéduraux sont installées par base. Néanmoins, un
langage peut être installé dans la base de données
template1
, ce qui le rend automatiquement disponible
dans toutes les bases de données créées par la suite.
Voici une séquence minimale pour créer un langage de procédures :
CREATE FUNCTION plsample_call_handler() RETURNS language_handler AS '$libdir/plsample' LANGUAGE C; CREATE LANGUAGE plsample HANDLER plsample_call_handler;
Habituellement, cela devrait être écrit dans le script de création de l'extension, et les utilisateurs feraient ceci pour installer l'extension :
CREATE EXTENSION plsample;
CREATE LANGUAGE
est une extension de
PostgreSQL.