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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    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
    Par défaut Multi row trigger.
    Bonjour à tous.
    J'ai un problème lors de mes udates/deletes sur mes déclencheurs.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
     
    IF @EtatTrigger = 2 -- Dans le cas d'un Update. 
    BEGIN
     
    	SET @MyReqInstruction = 'UPDATE MyTable '
    	SET @MyReqValue = 'SET '
     
    	If (SELECT CHAMP1 FROM DELETED) <> (SELECT CHAMP1 FROM INSERTED)
    	BEGIN
    		IF len(@MyReqValue) > 4 SET @MyReqValue = (@MyReqValue + ', ')
    		SET @MyReqValue += ('CHAMP1 = ' + QUOTENAME((SELECT CHAMP1 FROM INSERTED),''''))
    	END
     
    	If (SELECT CHAMP2 FROM DELETED) <> (SELECT CHAMP2 FROM INSERTED)
    	BEGIN
    		IF len(@MyReqValue) > 4 SET @MyReqValue = (@MyReqValue + ', ')
    		SET @MyReqValue += ('CHAMP2 = ' + QUOTENAME((SELECT CHAMP2 FROM INSERTED),''''))
    	END
     
    	If (SELECT CHAMP3 FROM DELETED) <> (SELECT CHAMP3 FROM INSERTED)
    	BEGIN
    		IF len(@MyReqValue) > 4 SET @MyReqValue = (@MyReqValue + ', ')
    		SET @MyReqValue += ('CHAMP3 = ' + QUOTENAME((SELECT CHAMP3 FROM INSERTED),''''))
    	END
     
    ...
    ...
    ...
    END
    Enfait, lorsque mon déclencheur capte une requête, je veux la réécrire (car impossible à capter directement si elle provient d'une requête paramétré..) et la stocker dans une autre table.

    Cependant, dans le cas ou il y'a un Update sur plusieurs rows (une seule instruction donc) cela pose problème.

    J'aimerais donc idéalement faire un "for each" visiblement impossible en sql et ne tiens pas à utiliser les curseurs.

    Mes recherches se sont révélés infructueuses, si quelqu'un à une idée..
    Merci à vous.

    A+

  2. #2
    Membre éclairé
    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
    Par défaut
    Bonjour,

    Dans ce cas, dans le trigger, il faut trouver un moyen pour réaliser le traitement de manière ensembliste, si possible en une seule requête et des CASE WHEN.

    Cordialement.

  3. #3
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 998
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 998
    Billets dans le blog
    6
    Par défaut
    Que cherchez-vous à faire au juste ???

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  4. #4
    Membre confirmé
    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
    Par défaut
    Bonjour,
    Merci à vous de répondre.

    Enfait ce que j'aimerais c'est :

    Si j'ai 3 update sur MaTable1
    Mon triggerTable1 écris 3 requêtes updates dans MaTableLOG avec d'autre info (Ref Clef primaire, DateRequete, NomTable, TypeInstruction...)

    (Et je dois également écrire une requêtes avec uniquement les champs qui sont modifiés)..

    Si j'ai une requête qui update 1 row. Tout vas bien..
    Si j'ai une requête qui update X rows. Tout vas mal..

  5. #5
    Membre éclairé
    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
    Par défaut
    Pour compléter ce que j'ai dit :
    dans le trigger, il faut faire une seule requête avec des CASE WHEN et des jointures sur INSERTED et DELETED

    Voilà un exemple à adapter à votre situation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    UPDATE MaTable 
    SET MaTableChampX = CASE WHEN INSERTED.MaTableChampX = 1 THEN MaValeur ELSE 0 END           
    FROM MaTable
    INNER JOIN INSERTED ON INSERTED.MaTableChamp1 = MaTable.MaTableChamp1
    INNER JOIN DELETED ON DELETED.MaTableChamp1 = MaTable.MaTableChamp1
    INNER JOIN Table2 ON INSERTED.Table2Champ1 = Table2.Table2Champ1 
    WHERE DELETED.Table2Champ1 <> INSERTED.Table2Champ1

  6. #6
    Membre confirmé
    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
    Par défaut
    Je ne sais pas si je passe complètement à côté ou si cela n'est pas adaptable mais je ne vois pas du tout comment m'inspirer de la requête que vous m'avez donné afin d'avoir en résultat des requêtes écrites (non exécutée, mais stocké dans un champ)

    Et je ne vois pas non plus sur quel critère je peux boucler afin de jouer sur mes X enregistrements..

    J'avais pensé à jouer avec ROW_NUMBER() mais il ne me sort pas vraiment ce à quoi je m'attendais..

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    DECLARE @MyRowCount int	= 3
    DECLARE @UpUp int = 1
     
    WHILE (@UpUp <> @MyRowCount)
    BEGIN
    	SET @MyRequete = 'DELETE MyTable WHERE CHAMP1 = ' + QUOTENAME((SELECT CHAMP1 FROM DELETED where (SELECT ROW_NUMBER() OVER (ORDER BY CLEF1, CLEF2, CLEF3, CLEF4) AS rownumber FROM DELETED) = @UpUp),'''')
    ..
    .. 
    ..
     
     
            SET @UpUp +=1
    END

    Si @UpUp = 1, il me récupère toutes les rows de la table (donc bug de nouveau),
    Si il est > 1, il ne trouve aucun résultat..

    [EDIT]
    Désolé, je vous ai mis mes test dans le cas d'un DELETE, avec une seule table temporaire à gérer, dans un premier temps..

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

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