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 et condition


Sujet :

Développement SQL Server

  1. #1
    Membre émérite Avatar de shadowmoon
    Homme Profil pro
    Expert technique et fonctionnel .Net
    Inscrit en
    Mai 2005
    Messages
    1 066
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Expert technique et fonctionnel .Net
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 066
    Points : 2 645
    Points
    2 645
    Par défaut Trigger, update et condition
    Bonjour

    Toutes mes excuses pour le mélange français / anglais.

    J'ai besoin d'une "traduction" en SQL sur le cas suivant.

    Dans un trigger déclenché par un update sur une table, je veux écrire une condition telle que :

    if only update(col1) or only update(col2) then ...

    Qui peut m'indiquer la syntaxe à utiliser ?

    Cordialement
    il n'y a jamais eu qu'un seul chrétien et il est mort sur la croix Friedrich Nietzsche
    L'homme est un apprenti, la douleur est son maitre Alfred de Musset
    C'est avoir tort que d'avoir raison trop tôt Praefectus Praetario Hadrianus

    my best memories ever : 2008 London Circle Line "The Booze Train"

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 188
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 188
    Points : 12 744
    Points
    12 744
    Par défaut
    Bonjour,
    La syntaxe dépend du SGBD (je suis justement en train de faire une migration de MaxDb vers SqlServer, la traduction des triggers n'est pas une mince affaire…).
    En gros il faut comparer l'ancienne valeur avec la nouvelle pour chaque colonne, un truc du genre:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if (new.col1 <> old.col1 and new.col2 = old.col2) or (new.col1 = old.col1 and new.col2 <> old.col2) then

    Tatayo.

  3. #3
    Membre émérite Avatar de shadowmoon
    Homme Profil pro
    Expert technique et fonctionnel .Net
    Inscrit en
    Mai 2005
    Messages
    1 066
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Expert technique et fonctionnel .Net
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 066
    Points : 2 645
    Points
    2 645
    Par défaut
    Merci pour cette réponse, qui me permet de m'apercevoir que j'ai oublié un point plutôt important et qui, je pense, change la problématique : la table en question contient 21 colonnes.

    Comme indiqué précédemment, je souhaite faire un traitement uniquement si le changement de valeur concerne la colonne G ou H.

    De plus c'est pour du Sql Server 2012.


    Cordialement
    il n'y a jamais eu qu'un seul chrétien et il est mort sur la croix Friedrich Nietzsche
    L'homme est un apprenti, la douleur est son maitre Alfred de Musset
    C'est avoir tort que d'avoir raison trop tôt Praefectus Praetario Hadrianus

    my best memories ever : 2008 London Circle Line "The Booze Train"

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 188
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 188
    Points : 12 744
    Points
    12 744
    Par défaut
    Citation Envoyé par shadowmoon Voir le message
    Merci pour cette réponse, qui me permet de m'apercevoir que j'ai oublié un point plutôt important et qui, je pense, change la problématique : la table en question contient 21 colonnes.
    Comme indiqué précédemment, je souhaite faire un traitement uniquement si le changement de valeur concerne la colonne G ou H.
    Pour être sûr de bien comprendre: il faut faire le traitement si une de ces deux colonnes a été modifiée (peu importe les 19 autres), ou si une et seulement une de ces colonnes est modifiée (et aucune autre) ?
    Dans le premier cas, le code ressemble à ceci:
    Code sql : 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
     
    create trigger TriggerName on LaTable after update as 
    begin
    	declare @oldColG int,@oldColH int,@newColG int,@newColH int
    	declare mycursor cursor for
    	select inserted.colg,inserted.colh,deleted.colg,deleted.colh
    		from inserted
    		inner join deleted on deleted.id = inserted.id
    	fetch mycursor into @newcolg,@newcolh,@oldcolg,@oldcolh
    	while @@fetch_status = 0
    	begin
    		if @oldcolg <> @newcolg or @colcolh <> @newcolh then
    			… le traitement
    	fetch mycursor into @newcolg,@newcolh,@oldcolg,@oldcolh
    	end
    	close mycursor
    	deallocate mycursor
    end

    Maintenant je débute avec les triggers sur SqlServer, donc si un spécialiste a des commentaires, il sont les bienvenus !

    Tatayo.

  5. #5
    Membre éprouvé
    Homme Profil pro
    Chef de projets retraité
    Inscrit en
    Juillet 2011
    Messages
    419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Chef de projets retraité
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2011
    Messages : 419
    Points : 1 096
    Points
    1 096
    Par défaut
    Bonjour,

    Regardes dans la doc si ton SGBD accepte la syntaxe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    UPDATE OF <nom de colonne>
    Si oui, c'est la syntaxe à utiliser (quitte à créer deux triggers selon ton besoin assez peu développé)

    Edit : NB tu peux avoir plusieurs colonnes dans cette clause

    Cordialement

  6. #6
    Membre émérite Avatar de shadowmoon
    Homme Profil pro
    Expert technique et fonctionnel .Net
    Inscrit en
    Mai 2005
    Messages
    1 066
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Expert technique et fonctionnel .Net
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 066
    Points : 2 645
    Points
    2 645
    Par défaut
    Bonjour


    Citation Envoyé par tatayo Voir le message
    si une et seulement une de ces colonnes est modifiée (et aucune autre)
    Nous somme en effet dans ce cas là

    Citation Envoyé par acaumes Voir le message
    (quitte à créer deux triggers selon ton besoin assez peu développé)
    Non, je ne dois pas créer de trigger, je dois ajouter des instructions dans un trigger existant et leur exécution est conditionnée.
    il n'y a jamais eu qu'un seul chrétien et il est mort sur la croix Friedrich Nietzsche
    L'homme est un apprenti, la douleur est son maitre Alfred de Musset
    C'est avoir tort que d'avoir raison trop tôt Praefectus Praetario Hadrianus

    my best memories ever : 2008 London Circle Line "The Booze Train"

  7. #7
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour

    Cela manque en effet de précision.

    Est-ce que la condition est qu'une seule des deux colonnes doit être visée par la commande UPDATE, ou est-ce qu'il doit effectivement y avoir des modifications des valeurs des colonnes ?

    Dans le second cas, vous pouvez faire une jointure entre les pseudo tables INSERTED et DELETED et vérifier s'il y a des modifications. Attention dans ce cas a traiter correctement le cas des NULLNotez par ailleurs que plusieurs ligne peuvent être mises à jour en même temps, il faut alors expliciter les règles de gestion si plusieurs cas de figure se présentent.

    Il serait utile d'en savoir un peu plus sur l'action a mener dans le trigger pour mieux vous aider.

  8. #8
    Membre émérite Avatar de shadowmoon
    Homme Profil pro
    Expert technique et fonctionnel .Net
    Inscrit en
    Mai 2005
    Messages
    1 066
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Expert technique et fonctionnel .Net
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 066
    Points : 2 645
    Points
    2 645
    Par défaut
    Citation Envoyé par aieeeuuuuu Voir le message
    Est-ce que la condition est qu'une seule des deux colonnes doit être visée par la commande UPDATE, ou est-ce qu'il doit effectivement y avoir des modifications des valeurs des colonnes ?

    ...

    Il serait utile d'en savoir un peu plus sur l'action a mener dans le trigger pour mieux vous aider.
    Le trigger se déclenche au moment de l'update d'une ligne de la table.

    La condition est que seulement la valeur d'une des deux colonnes, ou les deux soit modifiée. Les valeurs des autres colonnes restent inchangées.

    L'instruction à exécuter est une insertion dans une autre table.
    il n'y a jamais eu qu'un seul chrétien et il est mort sur la croix Friedrich Nietzsche
    L'homme est un apprenti, la douleur est son maitre Alfred de Musset
    C'est avoir tort que d'avoir raison trop tôt Praefectus Praetario Hadrianus

    my best memories ever : 2008 London Circle Line "The Booze Train"

  9. #9
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    toujours pas compris précisément, mais vous pouvez partir la dessus, à adapter, et a condition que vous ayez une clef dans la table (colonne id dans l'exemple)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    IF EXISTS(
        SELECT id, col1, col2
        FROM INSERTED
        EXCEPT
        SELECT id, col1, col2
        FROM INSERTED
     
    ) 
    BEGIN
    ...
    END

  10. #10
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 146
    Points : 7 388
    Points
    7 388
    Billets dans le blog
    1
    Par défaut
    Hmmm, en gros, sur les 21 colonnes, il y en a 19 qui sont "readonly" et deux qui sont modifiables, c'est ça ?

    Si oui, alors je pense qu'on prend le problème à l'envers :

    Il faut vérifier que pour un même identifiant de lignes, toutes les 19 colonnes sont identiques entre "inserted" et "deleted".
    Et s'il y a une ligne avec un écart, déclencher une exception (ou autre traitement interrompant la mise à jour).
    On ne jouit bien que de ce qu’on partage.

  11. #11
    Membre émérite Avatar de shadowmoon
    Homme Profil pro
    Expert technique et fonctionnel .Net
    Inscrit en
    Mai 2005
    Messages
    1 066
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Expert technique et fonctionnel .Net
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 066
    Points : 2 645
    Points
    2 645
    Par défaut
    Bonjour

    Citation Envoyé par StringBuilder Voir le message
    Hmmm, en gros, sur les 21 colonnes, il y en a 19 qui sont "readonly" et deux qui sont modifiables, c'est ça ?
    Non, elles sont tous modifiables, c'est pour cela que je me demande comment faire.

    Le trigger est déclenché sur l'update d'une ligne de la table.

    Dans le trigger, je dois écrire une instruction qui insère des données dans une autre table, uniquement si la valeur de la colonne G ou H est modifiée et que les valeurs des autres colonnes ne sont pas changées.

    C'est cette dernière partie de la condition qui me pose problème.

    Cordialement
    il n'y a jamais eu qu'un seul chrétien et il est mort sur la croix Friedrich Nietzsche
    L'homme est un apprenti, la douleur est son maitre Alfred de Musset
    C'est avoir tort que d'avoir raison trop tôt Praefectus Praetario Hadrianus

    my best memories ever : 2008 London Circle Line "The Booze Train"

  12. #12
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Citation Envoyé par shadowmoon Voir le message
    et que les valeurs des autres colonnes ne sont pas changées.
    Est-ce que c'est un condition ? (j'avais compris que les autres colonnes n'avaient pas d'importance)

    alors il faut compléter le code que j'avais proposé :

    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
     
    IF EXISTS(
        SELECT id, col1, col2
        FROM INSERTED
        EXCEPT
        SELECT id, col1, col2
        FROM INSERTED
     
    ) 
    AND NOT EXISTS (
        SELECT id, col3, col4, ...
        FROM INSERTED
        EXCEPT
        SELECT id, col3, col4, ...
        FROM INSERTED
    ) 
    BEGIN
    ...
    END

  13. #13
    Membre émérite Avatar de shadowmoon
    Homme Profil pro
    Expert technique et fonctionnel .Net
    Inscrit en
    Mai 2005
    Messages
    1 066
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Expert technique et fonctionnel .Net
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 066
    Points : 2 645
    Points
    2 645
    Par défaut
    Citation Envoyé par shadowmoon Voir le message
    et que les valeurs des autres colonnes ne sont pas changées.
    Citation Envoyé par aieeeuuuuu Voir le message
    Est-ce que c'est un condition ? (j'avais compris que les autres colonnes n'avaient pas d'importance)
    En effet, ce point fait partie de la condition.

    Je vais écrire l'instruction selon le modèle proposé.

    Je vous ferez un retour dès que c'est testé.

    Cordialement
    il n'y a jamais eu qu'un seul chrétien et il est mort sur la croix Friedrich Nietzsche
    L'homme est un apprenti, la douleur est son maitre Alfred de Musset
    C'est avoir tort que d'avoir raison trop tôt Praefectus Praetario Hadrianus

    my best memories ever : 2008 London Circle Line "The Booze Train"

  14. #14
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 736
    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 736
    Points : 52 447
    Points
    52 447
    Billets dans le blog
    5
    Par défaut
    La solution est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    IF COLUMNS_UPDATED() = 0x1 OR COLUMNS_UPDATED() = 0x2
    BEGIN
     
    END;
    Ceci suppose que la position ordinale de vos colonnes dans la table soit 1 et 2. Pour la colonne 3 il faut mettre 0x4, pour la 4 il faut mettre 0x8 et pour la 5 0x10 (c'est un masque binaire). Pour connaître la position ordinale de vos colonnes dans la table, utilisez la vue normalisée INFORMATION_SCHEMA.COLUMNS.

    A +

    PS : tout ceci est décrit dans notre livre sur SQL Server :
    Nom : Couverture livre SQL server Eyrolles.jpg
Affichages : 1227
Taille : 105,0 Ko
    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/ * * * * *

  15. #15
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 146
    Points : 7 388
    Points
    7 388
    Billets dans le blog
    1
    Par défaut
    Wow, je ne connaissais pas cette syntaxe

    N'y aurait-il pas par hasard une fonction "GetOrdinal(@table, @columnname)" ou autre astuce pour récupérer l'indice de la colonne dans la table à partir de son nom ?
    On ne jouit bien que de ce qu’on partage.

  16. #16
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 736
    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 736
    Points : 52 447
    Points
    52 447
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par StringBuilder Voir le message
    Wow, je ne connaissais pas cette syntaxe

    N'y aurait-il pas par hasard une fonction "GetOrdinal(@table, @columnname)" ou autre astuce pour récupérer l'indice de la colonne dans la table à partir de son nom ?
    Déjà ceci va te donner les indices attendus :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT COLUMN_NAME, ORDINAL_POSITION, POWER(ORDINAL_POSITION, 2) AS INDICE
    FROM   INFORMATION_SCHEMA.COLUMNS 
    WHERE  TABLE_SCHEMA = 'S_PRS' AND TABLE_NAME = 'T_PERSONNE_PHYSIQUE_PSP'

    Une UDF pour ce faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    CREATE FUNCTION dbo.F_GET_COLUMN_ORDINAL_MASK (@TABLE NVARCHAR(261), @COL sysname)
    RETURNS INT 
    AS
    BEGIN
    RETURN
    (
    SELECT POWER(ROW_NUMBER() OVER(ORDER BY column_id), 2) AS INDICE
    FROM   sys.columns
    WHERE  object_id = OBJECT_ID(@TABLE)
      AND  name = @COL
    )
    END;
    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/ * * * * *

  17. #17
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 146
    Points : 7 388
    Points
    7 388
    Billets dans le blog
    1
    Par défaut
    C'est effectivement ce que j'avais dans l'idée de faire.

    Mais ça me surprends un peu de la part de Microsoft d'exposer la fonction "COLUMNS_UPDATED()" sans la rendre plus "user friendly".
    Ca donne l'impression qu'un développeur Oracle est passé par là

    Sinon, je me pose quand même une question…

    COLUMNS_UPDATED() retourne un masque binaire, non ?

    Si j'ai la colonne 1 et 2 qui sont modifiées, je dois avoir comme résultat "11" (soit 3) et le test que tu indiques ne fonctionnera pas, si ?


    Ne faudrait-il pas remplacer :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    IF COLUMNS_UPDATED() = 0x1 OR COLUMNS_UPDATED() = 0x2

    Par
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    IF COLUMNS_UPDATED() > 0 AND COLUMNS_UPDATED() <= 3

    Ou même :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    IF COLUMNS_UPDATED() & 3 > 0

    Ou encore :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    IF COLUMNS_UPDATED() & 0x1 > 0 OR COLUMNS_UPDATED() & 0x2 > 0

    Non ?

    (sachant que les différentes syntaxes ne font pas tout à faut la même chose, et qu'elles ne répondent pas exactement à la demande initiale)
    On ne jouit bien que de ce qu’on partage.

  18. #18
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour

    Attention, avec COLUMNS_UPDATED(), le test sera positif même si les valeurs n'ont pas changé. Le test est vrai dés que la requete vise la colonne, mais si aucune mise à jour effective n'a lieu (d'où ma question quelques posts plus haut).
    Le teste sera vrai même avec une requête qui ne met a jour aucune ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    UPDATE LaTable 
    SET LaColonne = xxx 
    WHERE 1 = 0


    StringBuilder, concernant le coté user friendly, miscrosoft propose en effet le la petite sœur de cette fonction, mais qui prend en paramètre le nom de la colonne a tester :
    UPDATE(LaColonne) (lien msdn)

  19. #19
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 146
    Points : 7 388
    Points
    7 388
    Billets dans le blog
    1
    Par défaut
    Ouf ! Quelqu'un est repassé derrière le stagiaire Oracle
    On ne jouit bien que de ce qu’on partage.

  20. #20
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 736
    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 736
    Points : 52 447
    Points
    52 447
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par StringBuilder Voir le message
    ...
    Ne faudrait-il pas remplacer :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    IF COLUMNS_UPDATED() = 0x1 OR COLUMNS_UPDATED() = 0x2

    Par
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    IF COLUMNS_UPDATED() > 0 AND COLUMNS_UPDATED() <= 3

    Ou même :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    IF COLUMNS_UPDATED() & 3 > 0

    Ou encore :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    IF COLUMNS_UPDATED() & 0x1 > 0 OR COLUMNS_UPDATED() & 0x2 > 0

    Non ?

    (sachant que les différentes syntaxes ne font pas tout à faut la même chose, et qu'elles ne répondent pas exactement à la demande initiale)

    NON, NON et NON… Il veut que :
    Soit la colonne 1 est modifiée ET AUCUNE AUTRE !
    Soit la colonne 2 est modifiée ET AUCUNE AUTRE !

    Donc seul le test que j'ai donné est bon.

    Citation Envoyé par aieeeuuuuu Voir le message
    Bonjour

    Attention, avec COLUMNS_UPDATED(), le test sera positif même si les valeurs n'ont pas changé. Le test est vrai dés que la requete vise la colonne, mais si aucune mise à jour effective n'a lieu (d'où ma question quelques posts plus haut).
    Le teste sera vrai même avec une requête qui ne met a jour aucune ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    UPDATE LaTable 
    SET LaColonne = xxx 
    WHERE 1 = 0
    StringBuilder, concernant le coté user friendly, miscrosoft propose en effet le la petite sœur de cette fonction, mais qui prend en paramètre le nom de la colonne a tester :
    UPDATE(LaColonne) (lien msdn)
    Même chose pour la fonction UPDATE(…)

    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/ * * * * *

Discussions similaires

  1. [trigger] update inserted?
    Par cosminutza dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 01/06/2005, 10h37
  2. Réponses: 2
    Dernier message: 10/05/2005, 19h15
  3. update avec condition sur autre table
    Par allowen dans le forum Langage SQL
    Réponses: 5
    Dernier message: 01/04/2005, 16h02
  4. UPDATE avec condition sur d'autres tables
    Par guda dans le forum Langage SQL
    Réponses: 7
    Dernier message: 10/03/2005, 12h20
  5. Trigger Update et Column_Updated
    Par Pm dans le forum Développement
    Réponses: 2
    Dernier message: 16/06/2004, 10h07

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