|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Invité de passage
![]() Inscription : mai 2002 Messages : 22 ![]() |
Bonjour,
Je cherche à importer des données dans une table sous firebird 2.5, depuis un ensemble de donnée externe. J'utilise update or insert, la recherche dans ma table s'effectue non pas sur la clé primaire mais sur la clé de l'ensemble de donnée externe. Les valeurs sont fournies par paramètre. La table possède un trigger qui alloue une valeur de clé primaire si la clé primaire fournie est négative. Cette valeur de clé primaire est requise pour l'insertion. update or insert into matable(ChampClé, ChampCléExterne, AutreChamp) values (-1, :ValeurCléExterne, :AutreChamp) matching (ChampCléExterne) Ca fonctionne bien lors de l'insertion initiale, mais écrase la valeur de la clé avec la valeur '-1' lors de la seconde exécution. Je m'attendais à ce que update or insert n'altère pas la valeur de clé primaire en cas de update (par définition, elle ne peut être modifiée...) Comment faites vous pour contourner ce problème? J'ai regardé l'instruction merge mais elle se base sur une requête interne, or je dois fournir les valeurs par programme Merci, g. |
|
|
00
|
|
|
#2 | ||
|
Invité de passage
![]() Inscription : mai 2002 Messages : 22 ![]() |
Je contourne le problème avec un trigger BEFORE_INSERT:
Code :
Merci, g. |
||
|
|
00
|
|
|
#3 |
|
Membre Expert
![]() Frédéric Inscription : octobre 2002 Messages : 1 722 ![]() |
Bonjour,
Difficile de répondre à votre question, car à mon avis le problème vient de votre trigger : Pour répondre il nous faudrait le code de ce trigger. |
|
|
00
|
|
|
#4 | ||
|
Invité de passage
![]() Inscription : mai 2002 Messages : 22 ![]() |
Le test a été effectué avec plusieurs versions du trigger, dont la plus simple était:
Code :
|
||
|
|
00
|
|
|
#5 | ||
![]() ![]() Serge GirardDéveloppeur informatique Inscription : janvier 2007 Messages : 3 617 ![]() |
Il est évident que le problème vient du Trigger !
le trigger 'classique' est plutôt de la forme Code :
Je n'ai pas cherché dans la doc , mais si le comportement du UPDATE OR INSERT est le même que celui du REPLACE de mySQL (frais dans ma mémoire) c'est compréhensible : En fait il y a un processus de suppression puis insertion (dans mySQL). Une bonne lecture dans la doc semble nécessaire , si j'ai le temps .....
__________________
La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein J'entends et j'oublie. Je vois et je me souviens. Je fais et je comprends . Confucius |
||
|
|
00
|
|
|
#6 |
|
Membre Expert
![]() Frédéric Inscription : octobre 2002 Messages : 1 722 ![]() |
Il en manque un bout
![]() La partie déclaration, notamment quand est ce qu'il ne déclenche. |
|
|
00
|
|
|
#7 |
|
Membre Expert
![]() Frédéric Inscription : octobre 2002 Messages : 1 722 ![]() |
Non son trigger est correct, simplement cela dépend du déclenchement.
S'il le lance sur insert ET sur update (ce que je soupçonne), forcément le trigger update reçois -1 et donc il va régénérer une clé. |
|
|
00
|
|
|
#8 |
|
Expert Confirmé
![]() ![]() ![]() Philippe MakowskiConsultant spécialité Firebird Inscription : mai 2002 Messages : 2 213 ![]() |
pourquoi des messsages ont disparus (au moin dans ce fil) ?
__________________
Philippe Makowski IBPhoenix - Firebird Membre de l'April |
|
00
|
|
|
#9 |
![]() ![]() Serge GirardDéveloppeur informatique Inscription : janvier 2007 Messages : 3 617 ![]() |
non , grand maitre
, aucun message n'a disparu . Même si le tout reste plutôt télégraphique Effectivement GSide nous a bien parlé d'un trigger mais effectivement sans nous indiqué si c'était un Trigger BEFORE INSERT ou BEFORE INSERT OR UPDATE ou ..... et comme l'indique Barbibulle tel qu'écrit en post #4 si le trigger est du style BEFORE INSERT OR UPDATE le bug est a chercher du coté de Gside (sans vouloir vexer
__________________
La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein J'entends et j'oublie. Je vois et je me souviens. Je fais et je comprends . Confucius |
|
|
00
|
|
|
#10 | ||||
|
Expert Confirmé
![]() ![]() ![]() Philippe MakowskiConsultant spécialité Firebird Inscription : mai 2002 Messages : 2 213 ![]() |
ben ...
j'avais pour fait une réponse sur ce sujet (à moins qu'il y ait un autre fil très semblable) avec la syntaxe pour MERGE et un autre qui expliquait que son : Code :
Code :
__________________
Philippe Makowski IBPhoenix - Firebird Membre de l'April |
||||
|
10
|
Copyright © 2000-2012 - www.developpez.com