Création d'une fonction de déclenchement dans pgModeler

Dans un certain royaume, dans un certain état ... J'avais besoin d'ajouter un déclencheur au modèle sur pgModeler . Que faire est assez simple. Mais pour ajouter une fonction de déclenchement ... C'est aussi facile, mais j'ai dû m'occuper un peu des paramètres proposés pour le remplissage / sélection dans l'interface.

pgModeler est un très bon outil de conception de base de données qui peut générer des scripts SQL pour PostgreSQL . Des détails sur cet outil et ses capacités sont disponibles sur le site officiel .

À titre d'exemple, considérons un modèle simplifié avec une seule table.



Ajoutez une fonction au modèle.



Après cela, une fenêtre s'ouvrira avec divers paramètres modifiables avec lesquels la fonction sera créée. Cependant, certains champs seront déjà remplis avec des valeurs par défaut.



Examinons ces paramètres plus en détail.

Je pense qu'avec les paramètres Nom , Schéma , Propriétaire et Commentaire, tout est clair - c'est le nom de la fonction, le schéma de la base de données, le propriétaire et le commentaire de cette fonction, respectivement.

Langue est le nom de la langue dans laquelle la fonction sera implémentée. Pour être honnête, je n'ai jamais eu à écrire de fonctions pour PostgreSQL sur autre chose que plpgsql . C'est donc cette valeur pour le paramètre que j'ai choisie.

Méthode de retour . Étant donné que dans la fonction de déclenchement, nous n'avons pas besoin de renvoyer la table ou l'ensemble de valeurs, nous laissons Simple .

Avec les paramètres du bloc Data Type , en général, tout est aussi simple. Parce que Si la fonction est appelée dans le déclencheur, alors dans le champ Type , nous spécifions le déclencheur (le champ Format sera rempli automatiquement avec la valeur du déclencheur ). Le champ Dimension (le seul champ numérique non réservé de ce bloc) est nécessaire pour indiquer la dimension du tableau de la valeur retournée. Mais comme nous n'avons besoin que d'une valeur, pas d'un tableau, nous laissons 0 dans ce champ.

Avec les paramètres restants, tout n'est pas si évident, du moins pour moi, car n'a jamais eu à y penser lors de la création habituelle de fonctions dans PostgreSQL .

Le type de fonction peut prendre l'une des trois valeurs suivantes: IMMUTABLE , STABLE et VOLATILE . Dans la documentation officielle de PostgreSQL , vous pouvez découvrir que ces arguments informent l'optimiseur de requête sur le comportement de la fonction.

  • IMMUTABLE signifie que la fonction ne peut pas modifier la base de données et renvoie toujours le même résultat pour certaines valeurs des arguments.
  • STABLE signifie que la fonction ne peut pas modifier la base de données, et dans une seule analyse de table, elle renvoie toujours le même résultat pour certaines valeurs des arguments.
  • VOLATILE signifie que le résultat d'une fonction peut changer même au sein d'une seule analyse de table, de sorte que ses appels ne peuvent pas être optimisés.

Par conséquent, si la fonction de déclenchement nécessite de changer la base de données, alors IMMUTABLE ne convient pas. Une fonction avec le paramètre STABLE ne convient pas aux déclencheurs AFTER qui souhaitent lire des lignes modifiées par la commande en cours. Il reste VOLATILE , qui n'a pas les problèmes ci-dessus. Il sera également spécifié par défaut si aucun des arguments ci-dessus n'est spécifié lors de la création de la fonction.

La sécurité peut prendre l'une des deux valeurs suivantes: SECURITY DEFINER et SECURITY INVOKER et est responsable des droits de l'utilisateur auquel elle sera appelée.

  • DEFINER DE SECURITE signifie que la fonction sera exécutée avec les droits de l'utilisateur qui la possède, c'est-à-dire celui qui était inscrit sur le propriétaire .
  • SECURITY INVOKER signifie que la fonction sera exécutée avec les droits de l'utilisateur qui l'a appelée.

Par défaut, SECURITY INVOKER est utilisé , vous pouvez donc le laisser.

Le comportement peut prendre l'une des trois valeurs: STRICT , RETURNS NULL ON NULL INPUT et CALLED ON NULL INPUT et montre comment la fonction se comportera s'il y a des valeurs NULL parmi ses arguments.

  • RETURNS NULL ON NULL INPUT ou STRICT signifie que la fonction retournera toujours NULL si au moins un de ses arguments est NULL.
  • CALLED ON NULL INPUT signifie que la fonction sera appelée comme d'habitude, même si NULL fait partie de ses arguments.

La valeur par défaut est APPELÉE SUR UNE ENTRÉE NULLE . Par conséquent, de la même manière, vous pouvez le laisser.

Lignes retournées indique le nombre de lignes que le planificateur attendra. La valeur est spécifiée pour les fonctions qui renvoient des ensembles. Parce que notre fonction retourne une seule valeur, nous laissons 0 .

Coût d'exécution définit le coût d'exécution de cette fonction pour le planificateur. Pour plpgsql , la valeur par défaut est 100 . Par conséquent, nous indiquons cette valeur.

Windown Func. signifie qu'une fonction de fenêtre sera créée. Dans notre cas, car nous avons besoin d'une fonction de déclenchement, nous n'avons pas besoin de spécifier cette valeur (enfin, en général, ils écrivent dans la documentation elle-même qu'il est logique de spécifier ce paramètre uniquement pour les fonctions écrites en C).

Étanche indique que la fonction est scellée, c'est-à-dire qu'il ne divulgue pas d'informations sur ses arguments (par exemple, il n'affiche pas leur signification dans un message d'erreur), sauf pour renvoyer un résultat. Parce que Étant donné que la fonction de déclenchement n'accepte pas d'arguments, ce paramètre n'a pas besoin d'être spécifié.

Ainsi, les paramètres de la fonction sont terminés. Le corps de la fonction lui-même peut être écrit dans la même fenêtre de l'onglet Définition. Nous procédons à la création du déclencheur lui-même.



Après cela, la fenêtre de création du déclencheur apparaîtra.



Tenez compte des paramètres qui peuvent être définis dans cette fenêtre.

Avec les paramètres Name , Alias et Comment, encore une fois, tout est clair - c'est le nom du déclencheur, l'alias et le commentaire du déclencheur, respectivement.

Excution montre comment ce déclencheur sera exécuté et peut prendre l'une des valeurs suivantes: BEFORE , AFTER et INSTEAD OF , ce qui signifie que la fonction sera exécutée avant, après ou à la place de l'événement.

POUR CHAQUE RANG, détermine si la procédure de déclenchement se déclenchera une fois pour chaque ligne. S'il n'est pas spécifié, le paramètre FOR EACH STATEMENT sera défini, ce qui détermine que la procédure de déclenchement est déclenchée une fois pour l'instruction SQL.

L'événement détermine quels événements doivent être traités dans ce déclencheur. Vous pouvez spécifier plusieurs événements. Les événements sont des types suivants: INSERT , UPDATE , DELETE et TRUNCATE . Ils se produisent lorsque la commande correspondante avec la même instruction SQL est appelée.

La contrainte indique qu'un déclencheur de restriction sera créé. Les déclencheurs de contrainte sont utilisés pour lever des exceptions lorsque les contraintes sont violées. Vous pouvez en savoir plus à leur sujet dans la documentation officielle.

Pour un déclencheur de restriction, vous pouvez spécifier Différable , qui détermine le temps de déclenchement. Ce paramètre peut prendre l'une des valeurs suivantes: INITIALLY IMMEDIATE ou INITIALLY DEFERRED .

  • INITIALLY IMMEDIATE signifie que le déclencheur se déclenchera après chaque instruction.
  • INITIALY DEFERRED signifie que le déclencheur ne se déclenchera qu'à la fin de la transaction.

Référez-vous. Table est le nom de la table référencée par la contrainte. Utilisé pour les contraintes de clé étrangère et autorisé uniquement pour les déclencheurs de contrainte.

Condition est une condition qui détermine si la fonction de déclenchement sera exécutée. Pour les déclencheurs FOR EACH ROW dans ce champ, vous pouvez accéder respectivement aux anciennes et aux nouvelles valeurs via OLD et NEW (c'est-à-dire les mêmes que dans le corps de la fonction de déclenchement).

Arguments - une liste d'arguments qui seront transmis à la fonction déclencheur lorsque le déclencheur se déclenchera. Les constantes de chaîne sont passées comme arguments à la fonction.

Colonnes - peuvent être spécifiées uniquement pour les événements UPDATE . Le déclencheur ne fonctionnera que si au moins une des colonnes spécifiées se trouve dans la liste des colonnes spécifiées dans UPDATE .

Conclusion


C'est, en général, tout. J'espère que cela a été intéressant et sera utile à quelqu'un.



Lors de la rédaction de cet article, la version 0.9.2-alpha de pgModeler, construite sous Windows 7 x64, a été utilisée. Lors de l'utilisation de versions plus anciennes / plus récentes de pgModeler, de légères différences dans l'interface sont possibles.

Le modèle utilisé dans l'article peut être téléchargé ici .

Source: https://habr.com/ru/post/fr424121/


All Articles