|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Futur Membre du Club
![]() Inscription : septembre 2002 Messages : 143 ![]() |
Bonjour,
Je voudrais savoir s'il est possible de créer un trigger sur un champ d'une table, et que ce trigger puisse agir avant et après l'écriture des données. Je m'explique : j'ai une table Article avec QteStock et CMUP. Quand QteStock est modifié, je voudrais que le trigger se déclenche et fonctionne de la manière suivante : - avant écriture dans la base, on enregistre les valeurs QteStock et CMUP dans une table de travail - mise à jour effective de la base - après ecriture, on enregistre les nouvelles valeurs dans cette même table de travail. Le but final étant d'avoir une table du genre : Code :
code_art | date_heure | qte_avant | cmup_avant | qte_apres | cmup_apres Est-ce que c'est jouable ? Merci.
__________________
Postes Dév : W7 SP1 / XP SP3 / Windev 17 / Delphi 7 Entreprise Serveur : W2k3 SP2 + SQL 2008 Connexion : OLE.DB |
|
|
00
|
|
|
#2 |
|
Expert Confirmé Sénior
![]() François Chef de projet NTIC Inscription : janvier 2007 Messages : 5 352 ![]() |
Les triggers Sql Server (qui sont uniquement des triggers "commande" il n'y a pas de trigger "ligne" en SQL SERVER) exposent deux vues (enfin deux pour les trigger UPDATE) qui sont "delete" et "insert".
Il suffit de lire la vue "delete" pour obtenir les valeurs "anciennes" et la vue "insert" pour lire les valeurs "nouvelles" (c'est un peu l'équivalent de :old et :new en Oracle, mais qui ne sont dans le cas d'Oracle qu'accessible dans les triggers "ligne"). Il va de soit qu'un trigger "ON INSERT" n'expose que la vue "insert" et un trigger "ON DELETE" n'expose que la vue "delete". Que ensuite tu utilises un trigger BEFORE ou AFTER dépend de tes choix applicatifs. (mais dans ton cas, ce serait plutôt un TRIGGER "AFTER", c'est à dire appelé après la mise à jour).
__________________
Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça... Une réponse vous a aidé ? utiliser le bouton "L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel |
|
|
20
|
|
|
#3 | ||
![]() ![]() ![]() Frédéric BROUARDExpert SGBDR & SQL Inscription : mai 2002 Messages : 10 959 ![]() |
Citation:
Citation:
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 * * * * * |
||
|
10
|
|
|
#4 |
|
Expert Confirmé Sénior
![]() François Chef de projet NTIC Inscription : janvier 2007 Messages : 5 352 ![]() |
Décidément, 8 mois sans toucher à SQL SERVER ne me réussissent pas....
__________________
Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça... Une réponse vous a aidé ? utiliser le bouton "L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel |
|
|
00
|
|
|
#5 |
![]() ![]() ![]() Frédéric BROUARDExpert SGBDR & SQL Inscription : mai 2002 Messages : 10 959 ![]() |
et puis il va y avoir DENALI !!!!
;-) 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
|
|
|
#6 | ||
|
Futur Membre du Club
![]() Inscription : septembre 2002 Messages : 143 ![]() |
J'ai essayé ça
Code :
__________________
Postes Dév : W7 SP1 / XP SP3 / Windev 17 / Delphi 7 Entreprise Serveur : W2k3 SP2 + SQL 2008 Connexion : OLE.DB |
||
|
|
00
|
|
|
#7 |
![]() ![]() ![]() Frédéric BROUARDExpert SGBDR & SQL Inscription : mai 2002 Messages : 10 959 ![]() |
Déjà c'est pas bon, car vous avez des variables, alors qu'un trigger est ensembliste !
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 | |
|
Futur Membre du Club
![]() Inscription : septembre 2002 Messages : 143 ![]() |
Citation:
Parce que j'ai mis des DEFINE ?
__________________
Postes Dév : W7 SP1 / XP SP3 / Windev 17 / Delphi 7 Entreprise Serveur : W2k3 SP2 + SQL 2008 Connexion : OLE.DB |
|
|
|
00
|
|
|
#9 |
|
Expert Confirmé Sénior
![]() François Chef de projet NTIC Inscription : janvier 2007 Messages : 5 352 ![]() |
Comme je te l'ai dit supra les trigger SQL sont des trigger COMMANDE !
ce qui signifie que les vue deleted et inserted (merci à SQLPro de m'avoir corrigé) peuvent contenir plusieurs lignes. Or, ici le SELECT .. INTO ne peut en traiter qu'une. Inserted et deleted ne fonctionne pas comme :old et ;:new de Oracle qui ne contienne qu'une ligne puisque accessible uniquement depuis les trigger "ligne" (concept inexistant en SQL SERVER). En clair si on fait par exemple : Code :
UPDATE MyTable SET MyField = newValue WHERE MyKeyNonUnique = MyValue
__________________
Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça... Une réponse vous a aidé ? utiliser le bouton "L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel |
|
|
10
|
|
|
#10 | ||
|
Futur Membre du Club
![]() Inscription : septembre 2002 Messages : 143 ![]() |
OK, pigé.
Du coup, j'ai réécrit mon trigger ainsi : Code :
__________________
Postes Dév : W7 SP1 / XP SP3 / Windev 17 / Delphi 7 Entreprise Serveur : W2k3 SP2 + SQL 2008 Connexion : OLE.DB |
||
|
|
00
|
|
|
#11 |
![]() ![]() ![]() Frédéric BROUARDExpert SGBDR & SQL Inscription : mai 2002 Messages : 10 959 ![]() |
Nombreuses erreurs :
1) pas de close du curseur 2) pas de deallocate du curseur 3) un rollback dans une boucle dans un curseur va se traduire par des effets de bords inattendus... 3) pourquoi passer par un curseur qui est lent alors que vous pouvez faire cela sous forme de requêtes optimisées ? 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 |
|
Futur Membre du Club
![]() Inscription : septembre 2002 Messages : 143 ![]() |
Pour l'instant, c'est du test à l'arrache, s'il manque des bouts, ça n'est pas grave. La version finale ne ressemblera probablement pas du tout à ça.
Si un curseur est plus lent, alors soit, j'utiliserai volontier une requête. Mais tant que je n'aurai pas de solution à mon problème, je ne perdrai pas de temps à blinder le code.
__________________
Postes Dév : W7 SP1 / XP SP3 / Windev 17 / Delphi 7 Entreprise Serveur : W2k3 SP2 + SQL 2008 Connexion : OLE.DB |
|
|
00
|
|
|
#13 |
|
Futur Membre du Club
![]() Inscription : septembre 2002 Messages : 143 ![]() |
ah, je viens juste de capter que les anciennes valeurs étaient stockées dans la vue DELETED.
Du coup, ça à l'air de fonctionner selon mes besoins.
__________________
Postes Dév : W7 SP1 / XP SP3 / Windev 17 / Delphi 7 Entreprise Serveur : W2k3 SP2 + SQL 2008 Connexion : OLE.DB |
|
|
00
|
|
|
#14 |
|
Futur Membre du Club
![]() Inscription : septembre 2002 Messages : 143 ![]() |
est-il possible qu'un même enregistrement se retrouve plusieurs fois dans DELETED / INSERTED, s'il a été modifié par plusieurs utilisateurs en même temps, ou qu'une même transaction le modifie plusieurs fois ?
__________________
Postes Dév : W7 SP1 / XP SP3 / Windev 17 / Delphi 7 Entreprise Serveur : W2k3 SP2 + SQL 2008 Connexion : OLE.DB |
|
|
00
|
|
|
#15 | ||||
![]() ![]() ![]() Nicolas SouquetAdministrateur de base de données Inscription : janvier 2005 Messages : 4 669 ![]() |
Bonjour,
Citation:
Citation:
Au passage le type money est plus connu pour produire des erreurs de calculs que pour autre chose. Il vaut mieux utiliser le type decimal. Code :
Voyez ce que vous avez fait avec votre curseur : il n'y a rien de plus crade qu'un curseur en bases de données relationnelles SQL. J'ai également publié un article sur l'écriture ensembliste de triggers, que l'on trouve très simplement avec un moteur de recherche très connu. Tout en SQL est ensembliste parce que ce langage est conçu pour cela. Si vous faites du ligne à ligne (RBAR dans la littérature), ne vous attendez pas à des performances au moins correctes. @++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes. Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012 |
||||
|
11
|
|
|
#16 | |
|
Futur Membre du Club
![]() Inscription : septembre 2002 Messages : 143 ![]() |
Citation:
On se connait ? on a déjà bossé ensemble ? Me faire traiter de feignasse par un inconnu qui à la grosse tête quand je demande un peu d'aide, ça va 5 minutes. OSEF, mon code est terminé depuis vendredi soir.
__________________
Postes Dév : W7 SP1 / XP SP3 / Windev 17 / Delphi 7 Entreprise Serveur : W2k3 SP2 + SQL 2008 Connexion : OLE.DB |
|
|
|
03
|
|
|
#17 | ||
![]() ![]() ![]() Nicolas SouquetAdministrateur de base de données Inscription : janvier 2005 Messages : 4 669 ![]() |
Citation:
![]() Je n'ai jamais bossé avec qui que ce soit sur ce forum Dire que j'ai la grosse tête c'est vraiment mal me connaître, ce qui justifie qu'effectivement nous n'avons pas travaillé ensemble. Si j'arrivais pas à passer les portes ou que j'aie les chevilles qui se touchent, expliquez-moi pourquoi j'ai pris la peine de vous donner le code du trigger. Si vous avez envie de mal faire les choses, ça vous regarde. Mais avec un aussi mauvais à priori, je suis finalement content de ne pas avoir à travailler avec vous. Citation:
Allez bon boulot @++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes. Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012 |
||
|
20
|
|
|
#18 | |
|
Membre Expert
![]() |
Citation:
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir. |
|
|
|
40
|
|
|
#19 | |
![]() ![]() ![]() Nicolas SouquetAdministrateur de base de données Inscription : janvier 2005 Messages : 4 669 ![]() |
Citation:
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes. Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012 |
|
|
20
|
Copyright © 2000-2012 - www.developpez.com