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

MS SQL Server Discussion :

Multi row trigger.


Sujet :

MS SQL Server

  1. #21
    Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 36
    Points : 63
    Points
    63
    Par défaut
    Bonjour,

    Pour optimiser un peu votre requête, vous pourriez mettre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    WHERE
    RIGHT(LEFT(
    REPLACE( 'UPDATE Table1 SET' +
    CASE WHEN (DELETED.CHAMP1 <> INSERTED.CHAMP1 AND INSERTED.CHAMP1  IS NOT NULL AND INSERTED.CHAMP1  <> '') THEN ' ,CHAMP1 = ' + QUOTENAME((INSERTED.CHAMP1),'''') ELSE '' END + 
    CASE WHEN (DELETED.CHAMP1 IS NOT NULL AND INSERTED.CHAMP1 IS NULL) THEN ' ,CHAMP1 = NULL' ELSE '' END +
    CASE WHEN (DELETED.CHAMP2 <> INSERTED.CHAMP2 AND INSERTED.CHAMP2 IS NOT NULL AND INSERTED.CHAMP2<> '') THEN ' ,CHAMP2 = ' + QUOTENAME((INSERTED.CHAMP2),'''') ELSE '' END + 
    CASE WHEN (DELETED.CHAMP2 IS NOT NULL AND INSERTED.CHAMP2 IS NULL) THEN ' ,CHAMP2 = NULL' ELSE '' END +
    ' WHERE CHAMPCLEF = ' + QUOTENAME((INSERTED.CHAMPCLEF),''''), 'SET  ,','SET ' ) 
    , 20, 6)
    --la clause
    <> 'SET WH'
    à la place de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    WHERE ... NOT LIKE '%SET WHERE%'
    LIKE et NOT LIKE ne sont pas ce qu'il y a de plus performant dans le traitement des chaînes de caractères.

    Il faut faire attention à l'utilisation des triggers. C'est très pratique mais ça peut entrainer des problèmes de lenteurs et de blocages.
    --> entre autre garder à l'esprit que INSERTED et DELETED sont des tables temporaires non indexées.

  2. #22
    Membre actif
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    210
    Détails du profil
    Informations personnelles :
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Juin 2010
    Messages : 210
    Points : 243
    Points
    243
    Par défaut
    Bonjour,
    désolé pour les quelques jours d'absence.

    J'ai tenu à gérer le cas ou il y'a plusieurs insertions mais ceci ne devrait pas arriver trop souvent.
    Par conséquent, le fait que les tables temporaires ne soit pas indexés ne devrait pas être problématique. Me semble t-il ?

    J'ai besoin de récupérer ces requêtes afin de les jouer ailleurs.

    J'aurais aimé votre avis. Car avec la condition de ne plus obtenir le passage de "vide" à NULL je n'obtenais plus de "vide" à "valeur"..

    Voila comment je gère tous les cas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CASE WHEN ((DELETED.CHAMP1 IS NULL OR (DELETED.CHAMP1 <> INSERTED.CHAMP1)) AND INSERTED.CHAMP1 IS NOT NULL AND INSERTED.CHAMP1 <> '') 
    OR (DELETED.CHAMP1 IS NOT NULL AND DELETED.CHAMP1 <> '' AND INSERTED.CHAMP1 ='') THEN ' ,CHAMP1 = ' + QUOTENAME((INSERTED.CHAMP1),'''') ELSE '' END 
    CASE WHEN (DELETED.CHAMP1 IS NOT NULL AND INSERTED.CHAMP1 IS NULL) THEN ' ,CHAMP1= NULL' ELSE '' END
    Si vous pourriez me confirmer que je n'ai pas omis de cas particulier, ou si vous avez moins lourd..

    En tout cas je vais pouvoir mettre définitivement (je l’espère) se sujet en résolu.
    Un grand merci à vous pour votre temps et votre aide.
    A+

  3. #23
    Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 36
    Points : 63
    Points
    63
    Par défaut
    Bonjour,

    A priori ça à l'air d'être bon. Le CASE WHEN n'a pas besoin d'être répété :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    CASE WHEN 
    ((DELETED.CHAMP1 IS NULL OR (DELETED.CHAMP1 <> INSERTED.CHAMP1)) AND INSERTED.CHAMP1 IS NOT NULL AND INSERTED.CHAMP1 <> '') 
    OR (DELETED.CHAMP1 IS NOT NULL AND DELETED.CHAMP1 <> '' AND INSERTED.CHAMP1 ='') 
    THEN 
    ' ,CHAMP1 = ' + QUOTENAME((INSERTED.CHAMP1),'''') 
    WHEN 
    (DELETED.CHAMP1 IS NOT NULL AND INSERTED.CHAMP1 IS NULL) 
    THEN 
    ' ,CHAMP1= NULL' 
    ELSE '' END
    Quand vous dites :
    J'ai besoin de récupérer ces requêtes afin de les jouer ailleurs.
    Vous voulez synchroniser :
    • des tables dans la même base de données.
    • des tables dans 2 bases différentes sur le même serveur.
    • des tables dans 2 bases différentes sur des serveurs différents.


    Cordialement.

  4. #24
    Membre actif
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    210
    Détails du profil
    Informations personnelles :
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Juin 2010
    Messages : 210
    Points : 243
    Points
    243
    Par défaut
    Bonjour,
    Merci de votre confirmation concernant la requête.

    Il s'agit : des tables dans 2 bases différentes sur des serveurs différents.

  5. #25
    Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 36
    Points : 63
    Points
    63
    Par défaut
    Si c'est pour avoir une sauvegarde temps réel de votre base de données, vous devriez regarder du côté du mirroring (à partir de SQL Server 2005). C'est fait pour.
    Sinon la réplication peut être une solution.

    Voir :
    http://sqlpro.developpez.com/cours/s...disponibilite/
    http://fadace.developpez.com/mssql/replication/

    Cordialement.

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Update multi rows
    Par rgomes dans le forum DB2
    Réponses: 6
    Dernier message: 11/04/2014, 16h52
  2. Bloc multi-row avec set_item_property
    Par Marcel Chabot dans le forum Forms
    Réponses: 9
    Dernier message: 06/04/2012, 12h08
  3. [Select] Problème de multi rows
    Par WwiloO dans le forum Langage SQL
    Réponses: 3
    Dernier message: 26/01/2007, 10h41
  4. Trigger after insert, sans each row, possible ??
    Par veenie dans le forum Oracle
    Réponses: 5
    Dernier message: 16/02/2006, 15h18
  5. Annuler seulement certaines actions d'1 trigger for each row
    Par thebloodyman dans le forum Oracle
    Réponses: 8
    Dernier message: 28/02/2005, 14h17

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