|
Publicité ' | ||||||||||||||||||||||||
|
|
#1 | |
|
Futur Membre du Club
![]() Inscription : novembre 2010 Messages : 47 ![]() |
Bonjour,
Je suis en train de voir l'ensemble des fonctionnalités des SGBDR, et je suis passé de Mysql à PostegreSQL en local pour pouvoir le faire (sauf assertions qui ne semblent pas possible). Lors de la violation d'une contrainte CHECK, mon exécution retourne une erreur. De façon général, que ce soit en local directement sur phpPgAdmin, ou à travers un langage tel que PHP, savoir si une exécution a eu lieue ou non est primordiale. Seulement, là j'ai créé un TRIGGER, et j'utilise une "fonction" (j'ai pas réussi autrement ^^). Je vais ensuite passer aux procédures stockées. Donc ma question est : quelle va être la réaction face au ROLLBACK ? Si je lance une transaction dans ma procédure stockée et que le ROLLBACK est lancé, recevrais-je une erreur, ou dois-je me retourner en plus une valeur que je définirai comme telle ? Et actuellement, ma fonction lancée par mon trigger BEFORE INSERT est : Cela a bien été enregistré par PostegreSQL. Lorsque je tente d'ajouter une ligne (un tuple, c'est ça ?), il me retourne : ERREUR: Citation:
Je vais, en attendant, faire le tour du forum, mais j'espère avoir quelques pistes ;o Merci, a+ |
|
|
|
00
|
|
|
#2 |
|
Futur Membre du Club
![]() Inscription : novembre 2010 Messages : 47 ![]() |
Au fait, j'ai vu le tuto sur les séquences ... mais auto increment n'existe pas ? Je ne le trouve pas dans phpPgAdmin et comme souvent depuis la transition, je viens d'essayer ALTER TABLE et il n'en veut pas ... il y a beaucoup trop de différence de syntaxe avec mySQL
|
|
|
00
|
|
|
#3 | ||
![]() ![]() |
Citation:
Citation:
La norme SQL ne prévoit pas d'instruction pour auto-incrémenter une colonne à ma connaissance.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework... « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau) À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française ! Linuxiens, comptez-vous ! |
||
|
00
|
|
|
#4 |
|
Futur Membre du Club
![]() Inscription : novembre 2010 Messages : 47 ![]() |
OK. La réponse est très claire. Malheureusement, je passe des fois (beaucoup) trop de temps sur des choses qui ne le devrait pas en demander. Par exemple, en formation .NET, le formateur avait parlé de procédures stockée pour éviter que entre son SELECT et son INSERT, un autre INSERT apparaisse. Evidemment, le cours n'était pas sur SQL, sinon pour cet exemple, la contrainte d'unicité était bien plus appropriée, mais surtout que j'ai regardé les procédures stockées sur Google, surtout pour Mysql, et ils parlaient énormément de l'avantage d'atomicité, mais toujours sans suggérer que la transaction faisait elle-même les verrouillages. J'ai même regarder à ce sujet, c'est toujours rester flou. Les discutions et tutoriels sur PostegreSQL sont déjà bien plus clair là dessus : les verrous faits "maison", c'est "à fuir". Et puis, de ce que j'ai pu comprendre, et c'est quasi sûr, sinon pourquoi permettre les verrous (serialize etc), s'il n'en mettait pas. Bref, c'est pas clair. Pareil pour les règles PostegreSQL, je me demande si ce n'est pas l'équivalent des assertions. A coté, on trouve facilement des tutoriels sur les contraintes. Heureusement ! Et là c'est un régal :p
|
|
|
00
|
|
|
#5 | |
|
Futur Membre du Club
![]() Inscription : novembre 2010 Messages : 47 ![]() |
Re:
http://www.postgresql.org/docs/9.0/s...l-trigger.html Je cite Citation:
J'essaie de mon coté hors procédure et fonction RAISE EXCEPTION, et il n'en veut pas. L'équivalent de throw new Exception serait effectivement super. |
|
|
|
00
|
|
|
#6 | ||
|
Futur Membre du Club
![]() Inscription : novembre 2010 Messages : 47 ![]() |
Ca y est ! Ouf !
j'ai trouvé seulement après la valeur de retour VOID, donc j'ai mis INTEGER puisque NULL ne passait pas ... Code :
Erreur SQL : ERREUR: CECI EST UNE ERREUR J'imagine donc que l'exception + un rollback (voir l'exception seule il me semble l'avoir vu) permettent de gérer cette ensemble dissociable arret transaction (si existe) + erreur J'attends vos com :p |
||
|
|
00
|
|
|
#7 | |
![]() ![]() Inscription : octobre 2008 Messages : 1 504 ![]() |
Citation:
Autre chose notable par rapport à d'autres SGBDs: il n'est pas possible de faire commit ou rollback à l'intérieur d'une fonction. En revanche si besoin est de traiter localement une erreur isolée du reste de la transaction, y compris dans une fonction, c'est possible en utilisant un SAVEPOINT. |
|
|
|
00
|
|
|
#8 |
|
Futur Membre du Club
![]() Inscription : novembre 2010 Messages : 47 ![]() |
Je comprends pas trop ... On ne peut pas faire de transaction dans la procédure stockée ? Il faut la démarrer et la valider/annuler avant et après son appel ?
Par ailleurs, si la transaction est possible dans la procédure, comment savoir si une requête lancée dans cette procédure échoue ou réussie (contraintes ou autres), afin de pouvoir annuler la transaction ? L'idée c'était de créer une petite application qui permette de se passer de langages tels que Php. Donc par exemple, créer un résident et sa résidence (deux tables) ==> Op, une procédure / fonction qui traite le tout dans une transaction lancée par eux mêmes afin d'éviter l'oubli par l'utilisateur ^^. GrossoModo ne permettre à l'utilisateur de n'utiliser que les procédures stockées en partant du principe que c'est un idiot ^^. Quoique je fasse je galère vraiment à découvrir seul PostgreSQL et les procédures, ça m'envoie des erreurs partout et je suis un peu perdu. Mais rien que la possibilité de CHECK-er les valeurs, de créer des domaines, c'est vraiment bête que MySQL ne le prenne pas en charge. |
|
|
00
|
|
|
#9 | |||
|
Futur Membre du Club
![]() Inscription : novembre 2010 Messages : 47 ![]() |
Citation:
Code :
Le langage lance une procédure stockée. Il doit pouvoir avoir message confirmation ou erreur. La procédure lance des requêtes et traîte des données, avec une ou plusieurs transactions (c'est là où elle remplace PHP sur la plupart des cas). Elle doit pouvoir s'arrêter, lancer une erreur pour le langage, etc. Durant ses requêtes, les triggers peuvent intervenir, et eux mêmes lancés des exceptions. Durant les requêtes des triggers ou des procédures (les triggers utilisent des procédures c'est vrai), les contraintes peuvent émettre des erreurs. Bref, c'est imbriqué de partout, et j'ai vraiment du mal. Je crois que je vais me contenter des contraintes et triggers à terme (qui n'ont pas à être remplacés par le langage de programmation), et à faire les procédures et transactions par le langage (sachant, en avouant tout, que pour le moment une appli = un langage). Mais j'aurais voulu pouvoir baigner là dedans quelques instants ... |
|||
|
|
00
|
|
|
#10 | |
![]() ![]() ![]() Frédéric BROUARDExpert SGBDR & SQL Inscription : mai 2002 Messages : 10 937 ![]() |
Citation:
1) IDENTITY 2) CREATE SEQUENCE Font tous deux parties intégrantes de la norme SQL ! Voir mon bouquin pour de plus amples informations... 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
|
|
|
#11 | |
![]() ![]() ![]() Frédéric BROUARDExpert SGBDR & SQL Inscription : mai 2002 Messages : 10 937 ![]() |
Citation:
http://sqlpro.developpez.com/isolation-transaction/ 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
|
|
|
#12 | |
![]() ![]() ![]() Frédéric BROUARDExpert SGBDR & SQL Inscription : mai 2002 Messages : 10 937 ![]() |
Citation:
Comme ce que j'indique ici : http://blog.developpez.com/sqlpro/p9...pping-ro-dire/
__________________
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 | ||||
![]() ![]() Inscription : octobre 2008 Messages : 1 504 ![]() |
Citation:
Citation:
Citation:
Citation:
|
||||
|
|
00
|
|
|
#14 | |||||
|
Futur Membre du Club
![]() Inscription : novembre 2010 Messages : 47 ![]() |
Citation:
Vue Apercu (Pour comptable par exemple) (rem: code SQL modifié par phpMyAdmin Code :
Citation:
Citation:
Dans Creer_resident_ville, peut-on capturer une erreur (cas n°2) et la gérer du coup ? Si (cas n°1), une erreur est jettée, la transaction se ROLLBACK toute seule, et la fonction s'arrête ? Donc, en dehors de ces questions, comment exécuter des commandes SQL dans le code PL/SQL (enfin, l'équivalent PostgreSQL) ? J'essayerai une fonction si j'ai le temps demain (Dimanche), là il est tard et mes tables sont toujours sur MySQL. Il faut aussi que je rajoute des CHECK pour codePostal, genre (je ne veux pas de valeur '' (item 0)), etc. Attention, il ne s'agit pas ici de critiquer la modélisation et la logique, mais de voir comment utiliser des fonctions, triggers, etc pour effectuer des tâches. Autre question : ces fonctions sont-elles disponibles si j'interdis l'accès direct aux tables à l'utilisateur mais permet l'accès aux fonctions ? |
|||||
|
|
00
|
|
|
#15 | |
|
Futur Membre du Club
![]() Inscription : novembre 2010 Messages : 47 ![]() |
Citation:
|
|
|
|
00
|
|
|
#16 | |
|
Futur Membre du Club
![]() Inscription : novembre 2010 Messages : 47 ![]() |
Citation:
|
|
|
|
00
|
|
|
#17 | ||||
|
Futur Membre du Club
![]() Inscription : novembre 2010 Messages : 47 ![]() |
Citation:
Je galère toujours là pour retourner un jeu d'enregistrement ... j'ai mis SET OF RECORD en sortie, et Code :
Citation:
|
||||
|
|
00
|
|
|
#18 |
![]() ![]() Inscription : octobre 2008 Messages : 1 504 ![]() |
Les fonctions s'exécutant dans le contexte du serveur évitent des transferts de données de serveur à client qui peuvent être coûteux, ça dépend de ce qu'elles font.
|
|
|
00
|
|
|
#19 | |
![]() ![]() Inscription : octobre 2008 Messages : 1 504 ![]() |
Citation:
Si la fonction renvoie des lignes de la table test, il est préférable de le déclarer explicitement comme type de retour plutôt que SET OF RECORD qui est difficilement exploitable par la suite. |
|
|
|
00
|
|
|
#20 |
|
Futur Membre du Club
![]() Inscription : novembre 2010 Messages : 47 ![]() |
Au fait, pgAdmin III, ou phppgAdmin ? Perso, j'ai une préférence pour pgAdmin III ...
estofilo, l'idée serait par exemple d'avoir une fonction stockée de pagination de la vue "aperçu", avec un LIMIT sur le résident (pour éviter de couper puisque resident-residence est à 1-n). La requête SQL, pas de problème, mais il faudrait en entrée un INTEGER pour l'OFFSET, et en sortie un ensemble de lignes comportant plusieurs colonnes. Comment, à partir d'une requete, on peut faire ça ? Avec un FOR statement IN ? Oui, mais comment le sortir ? |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com