|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Membre éclairé
![]() |
Bonjour.
J'ai fais une fonction qui selon les conditions fait un RAISE EXCEPTION. Jusque la tout va bien. Mon probleme est que, avant de lever l'exception, je veux faire un insert dans une table de log. Or le RAISE visiblement annule toutes les requettes qui ont eu lieu dans ma fonction, dont mon fameux Insert. Comment faire svp dans une fonction, pour faire un INSERT avant un RAISE EXCEPTION qui ne soit pas annulé par ce dernier? |
|
|
00
|
|
|
#2 |
![]() ![]() ![]() Frédéric BROUARDExpert SGBDR & SQL Inscription : mai 2002 Messages : 10 953 ![]() |
Postez le code de votre fonction et un exemple d'appel.
A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/ Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp. Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation * * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * * |
|
00
|
|
|
#3 | ||
|
Membre éclairé
![]() |
Bonjour, et merci pour votre attention.
Voici un exemple, purement academique mais représentatif du but souhaité (voir ses commentaires): Code :
|
||
|
|
00
|
|
|
#4 |
![]() ![]() Inscription : octobre 2008 Messages : 1 505 ![]() |
Le RAISE EXCEPTION provoque un ROLLBACK qui annule l'effet de l'INSERT.
Pour éviter cela il faudrait que l'INSERT soit dans une transaction autonome, mais postgres n'a pas cette fonctionnalité. On peut quand même arriver à un résultat similaire avec le module dblink qui permet d'ouvrir une autre connexion indépendante à la base, tout en restant dans le contexte d'une fonction serveur. |
|
|
00
|
|
|
#5 |
|
Membre éclairé
![]() |
aie
et en prennant le probleme à l'envers : peut on créer un trigger abonné au raise exception? comme il s'executerait apres, je pourrait en fonction du code erreur/message faire mon insert dedans !?!? En fait je ne veux pas dépendre du client qui pourrait oublier de logguer certaines exceptions (entre autre erreur/oubli possible de la part d'un client). PS : ca me serait tres difficile d'ajouter un module à postgres. Merci encore pour votre aide. |
|
|
00
|
|
|
#6 |
![]() ![]() Inscription : octobre 2008 Messages : 1 505 ![]() |
Sans ajouter de module, je ne connais pas de solution à ce problème.
|
|
|
00
|
|
|
#7 |
![]() ![]() ![]() Frédéric BROUARDExpert SGBDR & SQL Inscription : mai 2002 Messages : 10 953 ![]() |
non, ça n'a pas grand sens.
Expliquez le fonctionnel qui vous à conduit à tenter cela. Il existe certainement un moyen de faire cela différemment. A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/ Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp. Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation * * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * * |
|
00
|
|
|
#8 |
|
Membre éclairé
![]() |
Le souhait d'envoyer une exception, est de forcer le code client a reagir. Si je mettais de simples notification, le client devrait les interroger apres chaque action, ce qui garanti un oubli tot ou tard lor du developpement du client.
Ma fonction en base tient plusieurs roles :
Voila donc l"idée en résumé : forcer le client (Exceptions qu'il ne peut ignorer). Enregistrer des données de facon indépendante, meme si le process a échoué. |
|
|
00
|
|
|
#9 | |||
![]() ![]() ![]() Frédéric BROUARDExpert SGBDR & SQL Inscription : mai 2002 Messages : 10 953 ![]() |
Donc, vous faites fausse route sur toute la ligne ....
Citation:
Citation:
Citation:
Bref, vous avez fait fausse route ! A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/ Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp. Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation * * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * * |
|||
|
00
|
|
|
#10 | |
![]() ![]() Inscription : octobre 2008 Messages : 1 505 ![]() |
Citation:
On peut aussi imaginer que les fonctions plpgsql renverraient des codes d'erreur au lieu de faire un RAISE mais l'issue est très dépendante de ce que fait le client. Si le code client n'est pas "coopératif", c'est un argument en plus en faveur du middleware plutôt que de laisser un accès à une connexion SQL. |
|
|
|
00
|
|
|
#11 | |
|
Membre éclairé
![]() |
Merci pour toutes vos réponses.
Il est vrai que j'ai voulu trop en demander à la base : gérer les données, faire le gendarme et le greffier. Le middleware (que j'avais deja commencé) devra donc gérer la sécurité. Juste que j'aurai aimé pouvoir graver quelques regles dans la base pour la rendre plus indépendante... Citation:
Je vais donc trouver un pattern qui me garantisse que mon middleware tienne compte des code erreur retournés sous forme de simple integer. |
|
|
|
00
|
|
|
#12 | |
![]() ![]() ![]() Frédéric BROUARDExpert SGBDR & SQL Inscription : mai 2002 Messages : 10 953 ![]() |
Citation:
Dans le pire des cas, si passer par des vues vous parait trop compliquées, vous pouvez passer uniquement par des routines stockées qui vont faire vos INSERT, UPDATE, DELETE... A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/ Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp. Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation * * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * * |
|
|
00
|
|
|
#13 |
|
Membre éclairé
![]() |
J'utilise l'excelent Pgadmin, donc les vues sont faciles à créer (requette graphique, puis copier coller).
On m'avait deja dit qu'il ne fallait passer que par des vues ou procédures, j'imagine que c'est pour ne pas rendre le code client dépendant de la structure de la base... J'essaye d'aller dans ce sens, juste pour ne pas transformer la maintenance en enfer... meme si pour l'heure ca me rallentit plus qu'autre chose ... Merci en tout cas pour toutes vos réponses, conseils, J'apprécie vraiment ! Je bascule le topic en résolu, meme si je continue à le surveiller... |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com