Le module spi fournit plusieurs exemples fonctionnels d'utilisation de l'interface de programmation du serveur (Server Programming Interface) (SPI) et des déclencheurs. Bien que ces fonctions aient un intérêt certain, elles sont encore plus utiles en tant qu'exemples à modifier pour atteindre ses propres buts. Les fonctions sont suffisamment généralistes pour être utilisées avec une table quelconque, mais la création d'un déclencheur impose que les noms des tables et des champs soient précisés (comme cela est décrit ci-dessous).
Chaque groupe de fonctions décrits ci-dessous est fourni comme une extension installable séparément.
check_primary_key()
et
check_foreign_key()
sont utilisées pour vérifier les
contraintes de clé étrangère. (Cette fonctionnalité est dépassée depuis
longtemps par le mécanisme interne, mais le module conserve un rôle
d'exemple.)
check_primary_key()
vérifie la table de référence.
Pour l'utiliser, on crée un déclencheur BEFORE INSERT OR UPDATE
qui utilise cette fonction sur une table référençant une autre table.
En arguments du déclencheur, on trouve : le nom de la colonne
de la table référençant qui forme la clé étrangère, le nom de la table
référencée et le nom de la colonne de la table référencée qui forme la
clé primaire/unique. Il peut y avoir plusieurs colonnes. Pour gérer
plusieurs clés étrangères, on crée un déclencheur pour chaque référence.
check_foreign_key()
vérifie la table référencée.
Pour l'utiliser, on crée un déclencheur BEFORE DELETE OR UPDATE
qui utilise cette fonction sur une table référencée par d'autres tables.
En arguments du déclencheur, on trouve : le nombre de tables référençant pour
lesquelles la fonction réalise la vérification, l'action à exécuter si une clé
de référence est trouvée (cascade
-- pour supprimer
une ligne qui référence, restrict
-- pour annuler la
transaction si des clés de référence existent, setnull
-- pour initialiser les champs des clés référençant à NULL), les noms
des colonnes de la table surveillées par le déclencheur, colonnes qui
forment la clé primaire/unique, puis le nom de la table référençant et les noms des
colonnes (répétés pour autant de tables référençant que cela est précisé par
le premier argument). Les colonnes de clé
primaire/unique doivent être marquées NOT NULL et posséder un index
d'unicité.
Il y a des exemples dans refint.example
.
autoinc()
est un déclencheur qui stocke la prochaine valeur
d'une séquence dans un champ de type integer. Cela recouvre quelque peu
la fonctionnalité interne de la colonne « serial », mais
ce n'est pas strictement identique : autoinc()
surcharge les tentatives de substitution d'une valeur différente pour ce
champ lors des insertions et, optionnellement, peut aussi être utilisé pour
incrémenter le champ lors des mises à jour.
Pour l'utiliser, on crée un déclencheur BEFORE INSERT
(ou
en option BEFORE INSERT OR UPDATE
) qui utilise cette
fonction. Le déclencheur accepte deux arguments : le nom de la
colonne de type integer à modifier et le nom de la séquence qui fournit
les valeurs. (En fait, plusieurs paires de noms peuvent être indiquées pour
actualiser plusieurs colonnes.)
Un exemple est fourni dans autoinc.example
.
insert_username()
est un déclencheur qui stocke le
nom de l'utilisateur courant dans un champ texte. C'est utile pour
savoir quel est le dernier utilisateur à avoir modifié une ligne particulière d'une
table.
Pour l'utiliser, on crée un déclencheur BEFORE INSERT
et/ou
UPDATE
qui utilise cette fonction. Le déclencheur prend
pour seul argument le nom de la colonne texte à modifier.
Un exemple est fourni dans insert_username.example
.
moddatetime()
est un déclencheur qui stocke la date et
l'heure de la dernière modification dans un champ de type
timestamp
. C'est utile pour savoir quand a eu lieu la
dernière modification sur une ligne particulière d'une table.
Pour l'utiliser, on crée un déclencheur BEFORE UPDATE
qui
utilise cette fonction. Le déclencheur prend pour seul argument le
nom de la colonne de type à modifier.
La colonne doit être de type timestamp
ou timestamp with
time zone
.
Un exemple est fourni dans moddatetime.example
.