Documentation PostgreSQL 8.0.25 | ||||
---|---|---|---|---|
Pr�c�dent | Arri�re rapide | Avance rapide | Suivant |
Ce chapitre d�crit l'�criture des fonctions d�clencheurs. Ces fonctions peuvent �tre �crites en C ou dans n'importe quel autre langage proc�dural disponible. Il n'est actuellement pas possible d'�crire une fonction d�clencheur en langage SQL.
Une fonction d�clencheur peut �tre d�finie 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. Si un �l�ment d�clencheur se produit, le gestionnaire de d�clencheurs est appel� au bon moment pour g�rer l'�v�nement.
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 pas sous la forme d'arguments de fonctions ordinaires.)
Une fois qu'une fonction d�clencheur est cr��e, le d�clencheur (trigger) est �tabli avec CREATE TRIGGER. La m�me fonction d�clencheur est utilisable par plusieurs d�clencheurs.
Il existe deux types de d�clencheurs : les d�clencheurs en mode ligne et ceux en mode instruction. Dans 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 niveaux instruction�>>.
Les d�clencheurs <<�avant�>> en mode instruction se lancent naturellement avant que l'instruction ait fait une modification alors que le d�clencheur <<�apr�s�>> en mode instruction se lance � la fin de l'instruction. Les d�clencheurs <<�avant�>> en mode ligne s'ex�cutent imm�diatement avant qu'une ligne particuli�re ne soit trait�e alors que les d�clencheurs <<�apr�s�>> en mode ligne se d�clenchent � la fin de l'instruction (mais avant tout d�clencheur <<�apr�s�>> en mode instruction).
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 instruit l'ex�cuteur de ne pas ex�cuter l'op�ration niveau ligne qui a lanc� le d�clencheur (l'insertion ou la modification d'une ligne particuli�re de la table).
Pour les seuls d�clencheurs INSERT et UPDATE au niveau ligne, 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 avant niveau ligne, qui n'est 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, la nouvelle (NEW) ligne pour des d�clencheurs INSERT et UPDATE, l'ancienne (OLD) ligne pour les d�clencheurs DELETE).
La valeur de retour est ignor�e pour les d�clencheurs niveau ligne lanc�s apr�s une op�ration. Ils pourraient donc tr�s bien 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 avant, les lignes, susceptibles d'�tre modifi�es, renvoy�es par chaque d�clencheur deviennent l'argument du prochain d�clencheur. Si un des d�clencheurs avant renvoie un pointeur NULL, l'op�ration est abandonn�e et les d�clencheurs suivants ne sont pas lanc�s.
Typiquement, les d�clencheurs avant en mode ligne sont utilis�s pour v�rifier ou modifier les donn�es qui seront ins�r�es ou mises � jour. Par exemple, un d�clencheur avant 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 apr�s 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 apr�s peut �tre certain qu'il voit la valeur finale de la ligne alors qu'un d�clencheur avant ne l'est pas ; il pourrait exister d'autres d�clencheurs avant qui seront ex�cut�s apr�s lui. Si vous n'avez aucune raison sp�ciale pour le moment du d�clenchement, le cas avant 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 relancer 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.
Pr�c�dent | Sommaire | Suivant |
Interfacer des extensions d'index | Niveau sup�rieur | Visibilit� des modifications des donn�es |