Ce chapitre fournit des informations g�n�rales sur l'�criture des fonctions pour d�clencheur. Les fonctions pour d�clencheurs peuvent �tre �crites dans la plupart des langages de proc�dure disponibles incluant PL/pgSQL (Chapitre 39, PL/pgSQL - Langage de proc�dures SQL), PL/Tcl (Chapitre 40, PL/Tcl - Langage de proc�dures Tcl), PL/Perl (Chapitre 41, PL/Perl - Langage de proc�dures Perl) et PL/Python (Chapitre 42, PL/Python - Langage de proc�dures Python). Apr�s avoir lu ce chapitre, vous devriez consulter le chapitre sur votre langage de proc�dure favori pour d�couvrir les sp�cificit�s de l'�criture de d�clencheurs dans ce langage.
Il est aussi possible d'�crire une fonction d�clencheur en C, bien que la plupart des gens trouvent plus facile d'utiliser un des langages de proc�dure. Il est actuellement impossible d'�crire une fonction d�clencheur dans le langage de fonction simple SQL.
Un d�clencheur sp�cifie que la base de donn�es doit ex�cuter automatiquement une fonction donn�e chaque fois qu'un certain type d'op�ration est ex�cut�. Les fonctions d�clencheur peuvent �tre attach�es � une table ou � une vue.
Sur des tables, les triggers peuvent �tre d�finies pour s'ex�cuter avant ou apr�s une commande INSERT, UPDATE ou DELETE, soit une fois par ligne modifi�e, soit une fois par expression SQL. Les triggers UPDATE peuvent en plus �tre configur�es pour n'�tre d�clench�s que si certaines colonnes sont mentionn�es dans la clause SET de l'instruction UPDATE. Les triggers peuvent aussi se d�clencher pour des instructions TRUNCATE. Si un �v�nement d'un trigger intervient, la fonction du trigger est appel�e au moment appropri� pour g�rer l'�v�nement.
Des triggers peuvent �tre d�finies sur des vues pour ex�cuter des op�rations � la place des commandes INSERT, UPDATE ou DELETE. Les triggers INSTEAD OF sont d�clench�s une fois par ligne devant �tre modifi�e dans la vue. C'est de la responsabilit� de la fonction trigger de r�aliser les modifications n�cessaires pour que les tables de base sous-jacentes et, si appropri�, de renvoyer la ligne modifi�e comme elle appara�tra dans la vue. Les triggers sur les vues peuvent aussi �tre d�finis pour s'ex�cuter une fois par requ�te SQL statement, avant ou apr�s des op�rations INSERT, UPDATE ou DELETE operations.
La fonction d�clencheur doit �tre d�finie avant que le d�clencheur lui-m�me puisse �tre cr��. La fonction d�clencheur doit �tre d�clar�e comme une fonction ne prenant aucun argument et retournant un type trigger (la fonction d�clencheur re�oit ses entr�es via une structure TriggerData pass�e sp�cifiquement, et non pas sous la forme d'arguments ordinaires de fonctions).
Une fois qu'une fonction d�clencheur est cr��e, le d�clencheur (trigger) est cr�� avec CREATE TRIGGER(7). La m�me fonction d�clencheur est utilisable par plusieurs d�clencheurs.
PostgreSQL™ offre des d�clencheurs par ligne et par instruction. Avec un d�clencheur mode ligne, la fonction du d�clencheur est appel�e une fois pour chaque ligne affect�e par l'instruction qui a lanc� le d�clencheur. Au contraire, un d�clencheur mode instruction n'est appel� qu'une seule fois lorsqu'une instruction appropri�e est ex�cut�e, quelque soit le nombre de lignes affect�es par cette instruction. En particulier, une instruction n'affectant aucune ligne r�sultera toujours en l'ex�cution de tout d�clencheur mode instruction applicable. Ces deux types sont quelque fois appel�s respectivement des d�clencheurs niveau ligne et des d�clencheurs niveau instruction. Les triggers sur TRUNCATE peuvent seulement �tre d�finis au niveau instruction. Sur des vues, les triggers qui se d�clenchent avant ou apr�s peuvent �tre seulement d�finis au niveau instruction alors que les triggers qui ont un d�clenchement � � la place � d'un INSERT, UPDATE ou DELETE peuvent seulement �tre d�finis au niveau ligne.
Les triggers sont aussi classifi�es suivant qu'ils se d�clenchent avant (before), apr�s (after) ou � la place (instead of) de l'op�ration. Ils sont r�f�renc�s respectivement comme des triggers BEFORE, AFTER et INSTEAD OF. Les triggers BEFORE au niveau requ�te se d�clenchent avant que la requ�te ne commence quoi que ce soit alors que les triggers AFTER au niveau requ�te se d�clenchent tout � la fin de la requ�te. Ces types de triggers peuvent �tre d�finis sur les tables et vues. Les triggers BEFORE au niveau ligne se d�clenchent imm�diatement avant l'op�ration sur une ligne particuli�re alors que les triggers AFTER au niveau ligne se d�clenchent � la fin de la requ�te (mais avant les triggers AFTER au niveau requ�te). Ces types de triggers peuvent seulement �tre d�finis sur les tables. Les triggers INSTEAD OF au niveau ligne peuvent seulement �tre d�finis sur des vues et se d�clenchent imm�diatement sur chaque ligne de la vue qui est identifi�e comme n�cessitant cette op�ration.
Les fonctions d�clencheurs appel�es par des d�clencheurs niveau instruction devraient toujours renvoyer NULL. Les fonctions d�clencheurs appel�es par des d�clencheurs niveau ligne peuvent renvoyer une ligne de la table (une valeur de type HeapTuple) vers l'ex�cuteur appelant, s'ils le veulent. Un d�clencheur niveau ligne ex�cut� avant une op�ration a les choix suivants :
Il peut retourner un pointeur NULL pour sauter l'op�ration pour la ligne courante. Ceci donne comme instruction � l'ex�cuteur de ne pas ex�cuter l'op�ration niveau ligne qui a lanc� le d�clencheur (l'insertion, la modification ou la suppression d'une ligne particuli�re de la table).
Pour les d�clencheurs INSERT et UPDATE de niveau ligne uniquement, la valeur de retour devient la ligne qui sera ins�r�e ou remplacera la ligne en cours de mise � jour. Ceci permet � la fonction d�clencheur de modifier la ligne en cours d'insertion ou de mise � jour.
Un d�clencheur BEFORE niveau ligne qui ne serait pas con�u pour avoir l'un de ces comportements doit prendre garde � retourner la m�me ligne que celle qui lui a �t� pass�e comme nouvelle ligne (c'est-�-dire : pour des d�clencheurs INSERT et UPDATE : la nouvelle (NEW) ligne ,et pour les d�clencheurs DELETE) : l'ancienne (OLD) ligne .
Un trigger INSTEAD OF niveau ligne devrait renvoyer soit NULL pour indiquer qu'il n'a pas modifi� de donn�es des tables de base sous-jacentes de la vue, soit la ligne de la vue qui lui a �t� pass� (la ligne NEW pour les op�rations INSERT et UPDATE, ou la ligne OLD pour l'op�ration DELETE). Une valeur de retour diff�rent de NULL est utilis�e comme signal indiquant que le trigger a r�alis� les modifications de donn�es n�cessaires dans la vue. Ceci causera l'incr�mentation du nombre de lignes affect�es par la commande. Pour les op�rations INSERT et UPDATE, le trigger peut modifier la ligne NEW avant de la renvoyer. Ceci modifiera les donn�es renvoy�es par INSERT RETURNING ou UPDATE RETURNING, et est utile quand la vue n'affichera pas exactement les donn�es fournies.
La valeur de retour est ignor�e pour les d�clencheurs niveau ligne lanc�s apr�s une op�ration. Ils peuvent donc renvoyer la valeur NULL.
Si plus d'un d�clencheur est d�fini pour le m�me �v�nement sur la m�me relation, les d�clencheurs seront lanc�s dans l'ordre alphab�tique de leur nom. Dans le cas de d�clencheurs BEFORE et INSTEAD OF, la ligne renvoy�e par chaque d�clencheur, qui a �ventuellement �t� modifi�e, devient l'argument du prochain d�clencheur. Si un des d�clencheurs BEFORE ou INSTEAD OF renvoie un pointeur NULL, l'op�ration est abandonn�e pour cette ligne et les d�clencheurs suivants ne sont pas lanc�s (pour cette ligne).
Une d�finition de trigger peut aussi sp�cifier une condition bool�enne WHEN qui sera test�e pour savoir si le trigger doit bien �tre d�clench�. Dans les triggers de niveau ligne, la condition WHEN peut examiner l'ancienne et la nouvelle valeur des colonnes de la ligne. (les triggers de niveau instruction peuvent aussi avoir des conditions WHEN mais cette fonctionnalit� est moins int�ressante pour elles). Dans un trigger avant, la condition WHEN est �valu�e juste avant l'ex�cution de la fonction, donc l'utilisation de WHEN n'est pas r�ellement diff�rente du test de la m�me condition au d�but de la fonction trigger. N�anmoins, dans un tigger AFTER, la condition WHEN est �valu�e juste avant la mise � jour de la ligne et d�termine si un �v�nement va d�clencher le trigger � la fin de l'instruction. Donc, quand la condition WHEN d'un trigger AFTER ne renvoie pas true, il n'est pas n�cessaire de mettre en queue un �v�nement ou de r�cup�rer de nouveau la ligne � la fin de l'instriction. Ceci permet une am�lioration cons�quente des performances pour les instructions qui modifient un grand nombre de lignes si le trigger a seulement besoin d'�tre ex�cut� que sur quelques lignes. Les triggers INSTEAD OF n'acceptent pas les conditions WHEN.
Les d�clencheurs BEFORE en mode ligne sont typiquement utilis�s pour v�rifier ou modifier les donn�es qui seront ins�r�es ou mises � jour. Par exemple, un d�clencheur BEFORE pourrait �tre utilis� pour ins�rer l'heure actuelle dans une colonne de type timestamp ou pour v�rifier que deux �l�ments d'une ligne sont coh�rents. Les d�clencheurs AFTER en mode ligne sont pour la plupart utilis�s pour propager des mises � jour vers d'autres tables ou pour r�aliser des tests de coh�rence avec d'autres tables. La raison de cette division du travail est qu'un d�clencheur AFTER peut �tre certain qu'il voit la valeur finale de la ligne alors qu'un d�clencheur BEFORE ne l'est pas ; il pourrait exister d'autres d�clencheurs BEFORE qui seront ex�cut�s apr�s lui. Si vous n'avez aucune raison sp�ciale pour le moment du d�clenchement, le cas BEFORE est plus efficace car l'information sur l'op�ration n'a pas besoin d'�tre sauvegard�e jusqu'� la fin du traitement.
Si une fonction d�clencheur ex�cute des commandes SQL, alors ces commandes peuvent lancer � leur tour des d�clencheurs. On appelle ceci un d�clencheur en cascade. Il n'y a pas de limitation directe du nombre de niveaux de cascade. Il est possible que les cascades causent un appel r�cursif du m�me d�clencheur ; par exemple, un d�clencheur INSERT pourrait ex�cuter une commande qui ins�re une ligne suppl�mentaire dans la m�me table, entra�nant un nouveau lancement du d�clencheur INSERT. Il est de la responsabilit� du programmeur d'�viter les r�cursions infinies dans de tels sc�narios.
Quand un d�clencheur est d�fini, des arguments peuvent �tre sp�cifi�s pour lui. L'objectif de l'inclusion d'arguments dans la d�finition du d�clencheur est de permettre � diff�rents d�clencheurs ayant des exigences similaires d'appeler la m�me fonction. Par exemple, il pourrait y avoir une fonction d�clencheur g�n�ralis�e qui prend comme arguments deux noms de colonnes et place l'utilisateur courant dans l'une et un horodatage dans l'autre. Correctement �crit, cette fonction d�clencheur serait ind�pendante de la table particuli�re sur laquelle il se d�clenche. Ainsi, la m�me fonction pourrait �tre utilis�e pour des �v�nements INSERT sur n'importe quelle table ayant des colonnes ad�quates, pour automatiquement suivre les cr�ations d'enregistrements dans une table de transactions par exemple. Elle pourrait aussi �tre utilis�e pour suivre les derni�res mises � jours si elle est d�finie comme un d�clencheur UPDATE.
Chaque langage de programmation supportant les d�clencheurs a sa propre m�thode pour rendre les donn�es en entr�e disponible � la fonction du d�clencheur. Cette donn�e en entr�e inclut le type d'�v�nement du d�clencheur (c'est-�-dire INSERT ou UPDATE) ainsi que tous les arguments list�s dans CREATE TRIGGER. Pour un d�clencheur niveau ligne, la donn�e en entr�e inclut aussi la ligne NEW pour les d�clencheurs INSERT et UPDATE et/ou la ligne OLD pour les d�clencheurs UPDATE et DELETE. Les d�clencheurs niveau instruction n'ont actuellement aucun moyen pour examiner le(s) ligne(s) individuelle(s) modifi�es par l'instruction.