IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement SQL Server Discussion :

trigger "update sur insert" avec insertion multiple


Sujet :

Développement SQL Server

  1. #1
    Membre du Club
    Profil pro
    Developper
    Inscrit en
    Juin 2008
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Developper

    Informations forums :
    Inscription : Juin 2008
    Messages : 55
    Points : 53
    Points
    53
    Par défaut trigger "update sur insert" avec insertion multiple
    Bonjour,

    J'ai un requete qui insert des milliers de lignes avec un :
    INSERT INTO stat (col1, col2, col3, ...)
    SELECT cola, colb, colc, ... FROM toto

    Est ce que c'est possible, avec un trigger, de faire un update sur chacune de ces lignes pour qu'elles aillent prendre une valeur (qui varie selon les valeurs insérées dans les colonnes) dans une autre table ?
    Puis-je m'appuyer sur la table inserted ?

    Aujourd'hui, après l'insert, je passe ligne par ligne ma table stat avec un curseur et j'update la ligne, mais c'est très long.

    Merci pour votre aide

  2. #2
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    je passe ligne par ligne ma table stat avec un curseur et j'update la ligne, mais c'est très long.
    Vous avez dit deux fois la même chose : "curseur" et "très long"
    N'utilisez les curseurs que lorsque vous avez exploré toutes les autres solutions possibles.
    Dès SQL Server 2005, les cas où on ne peut pas se passer de curseur sont hyper-rares (SQL Server 2005 a introduit les CTE récursives notamment)

    Est ce que c'est possible, avec un trigger, de faire un update sur chacune de ces lignes pour qu'elles aillent prendre une valeur (qui varie selon les valeurs insérées dans les colonnes) dans une autre table ?
    Puis-je m'appuyer sur la table inserted ?
    Tout à fait.
    Voici un exemple un peu générique pour vous lancer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    CREATE TRIGGER TR_A_I_STAT
    	ON dbo.STAT
    AFTER INSERT
    AS
    BEGIN
    	UPDATE dbo.STAT
    	SET colonnesDeSTAT = A.colonnes
    	FROM dbo.STAT AS S
    	INNER JOIN dbo.autreTable AS A ON S.uneClé = A.uneClé
    	INNER JOIN INSERTED AS I ON S.CléPrimaire = I.CléPrimaire
    END
    La documentation T-SQL sur les triggers se trouve ici

    Dans un trigger vous avez "accès" à deux tables virtuelles : INSERTED et DELETED.
    Ces deux tables virtuelles ont strictement la même structure que la table cible de la mise à jour (INSERT | UPDATE | DELETE).
    La table virtuelle INSERTED contient les nouvelles valeurs insérées dans la table, et la table DELETED les valeurs qui ont été écrasées dans la table.
    Ainsi :
    - sur un INSERT, vous avez accès seulement à INSERTED
    - sur un UPDATE, vous avez accès à INSERTED et DELETED
    - sur un DELETE, vous avez accès seulement à DELETED.

    Mais peut-être que vous pourriez faire cette mise à jour dans une procédure stockée, sauf si vous souhaitez "centraliser" la mise à jour.
    Retenez que les triggers sont gourmands en ressources

    @++

  3. #3
    Membre du Club
    Profil pro
    Developper
    Inscrit en
    Juin 2008
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Developper

    Informations forums :
    Inscription : Juin 2008
    Messages : 55
    Points : 53
    Points
    53
    Par défaut
    Merci beaucoup pour ta réponse
    Effectivement ça marche plutôt bien

    Sur un petit volume de 40.000 Lignes
    avec trigger, 9 secondes
    avec curseur 51 secondes

    Est ce qu'il est déconseillé d'enchainer les trigger ?
    ex : un insert qui execute un insert qui execute un autre insert qui execute un update ?

    Merci encore

  4. #4
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    Est ce qu'il est déconseillé d'enchainer les trigger ?
    Oui, les triggers sont gourmands en ressources

    ex : un insert qui execute un insert qui execute un autre insert qui execute un update ?
    Vous voulez dire : un trigger sur INSERT qui déclenche un autre trigger sur INSERT dans sur une autre table, qui à son tour déclenche un trigger sur UPDATE sur une autre table ?
    Si c'est bien cela, imaginez le verouillage que vous mettez en place ... à mon avis, si votre base de données est intensément utilisée (beaucoup de modifications, peu de lectures) vous aurez très vite des problèmes de performance ...
    Écrivez plutôt une jeu de procédures stockées suffisamment découpé pour avoir une souplesse de codage élevée (vous pouvez appeler une procédure dans une autre procédure), vous y gagnerez

    Avez-vous vérifié que les colonnes clés des tables participant à votre requête sont correctement indexées ?

    @++

  5. #5
    Membre du Club
    Profil pro
    Developper
    Inscrit en
    Juin 2008
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Developper

    Informations forums :
    Inscription : Juin 2008
    Messages : 55
    Points : 53
    Points
    53
    Par défaut
    Merci pour votre réponse !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 21/10/2013, 17h30
  2. [2005 Express] un Update sur un top avec des clauses Where
    Par zooffy dans le forum Développement
    Réponses: 7
    Dernier message: 14/09/2009, 09h16
  3. Trigger FOR UPDATE sur SQL Server
    Par fouad_r dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 05/06/2009, 15h43
  4. Réponses: 5
    Dernier message: 15/06/2007, 16h05
  5. [Oracle] Update sur 1 colonne avec condition existence (SUBSTR)
    Par magic charly dans le forum Langage SQL
    Réponses: 6
    Dernier message: 20/04/2006, 13h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo