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 avec mise à jour sur jointure + aggrégat [2008R2]


Sujet :

Développement SQL Server

  1. #1
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 166
    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 166
    Points : 7 418
    Points
    7 418
    Billets dans le blog
    1
    Par défaut Trigger avec mise à jour sur jointure + aggrégat
    Bonjour,

    Je tente d'écrire un trigger sur SQL Server 2008 R2.

    J'ai deux tables :

    CRM_AR : Contient les colonnes (ID, ID_04, F7042)
    Contient des produits

    CRM_04 : Contient les colonnes (ID, ID_04, Text)
    Contient les traductions des libellés des produits

    La colonne ID_04 est une sorte de clé étrangère à l'envers : si CRM_04.ID_04 = CRM_AR.ID_04 alors les colonnes sont liées.

    Le logiciel qui utilise la base de donnée est très mal foutu (autant que le modèle des données, c'est pour dire) et ne sait pas utiliser la table CRM_04 pour effectuer des recherche sur les articles (donc pas de recherche pas nom dans la langue de l'utilisateur).

    J'ai donc truandé en créant une colonne dans CRM_AR qui contient la concaténation de tous les libellés traduits de l'article. Et lors d'une recherche, je fais une recherche dessus.
    Je sais, c'est crade, et discutable d'un point de vue résultat, mais c'est tout ce que j'ai sous la main.

    Seulement voilà... Les produits ne sont pas seulement intégrés par moulinette (sur laquelle nous avons la main) mais aussi créés en interactif.
    Et évidement, dans le logiciel, aucun mécanisme pour mettre à jour le libellé concaténé.

    Voici donc le trigger que je tente d'écrire :

    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
     
    create trigger trg_crm_04_a_iud
    on crm_04
    after insert, update, delete
    begin
    	update CRM_AR
    	set F7042 = dbo.group_concat(crm_04.Text)
    	from CRM_04
    	where ID_04 in (
    		select id_04
    		from inserted
    		union
    		select id_04
    		from deleted
    	)
    	group by crm_ar.id_04;
    end;

    Et ça compile pas.

    Ca non plus d'ailleurs :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    update CRM_AR
    set F7042 = dbo.group_concat(crm_04.Text)
    from CRM_04
    where ID_04 in (
    	select id_04
    	from crm_04
    )
    group by crm_ar.id_04;

    Ca semble venir du group by...

    Une idée pour rectifier le truc ?

    Faites pas attention à group_concat, c'est une fonction de mon cru, qui fonctionne très bien (cf. la section contribution).

    Imaginez que je cherche à mettre à jour l'entête du'ne commande avec le SUM() du prix des lignes dont elle est constituée à chaque fois que je fais une modification sur les postes.
    On ne jouit bien que de ce qu’on partage.

  2. #2
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 166
    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 166
    Points : 7 418
    Points
    7 418
    Billets dans le blog
    1
    Par défaut
    Ah ben en fait c'est bon, suffisait de faire une sous-requête

    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
    19
    20
    21
    22
     
    create trigger trg_crm_04_a_iud
    on crm_04
    after insert, update, delete
    as
    begin
    	update CRM_AR
    	set F7042 = tmp.zzz
    	from (
    		select id_04, dbo.group_concat(text) zzz
    		from CRM_04
    		where ID_04 in (
    			select id_04
    			from inserted
    			union
    			select id_04
    			from deleted
    		)
    		group by crm_04.id_04
    	) tmp
    	where crm_ar.ID_04 = tmp.id_04;
    end;
    On ne jouit bien que de ce qu’on partage.

  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 847
    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 847
    Points : 52 961
    Points
    52 961
    Billets dans le blog
    6
    Par défaut
    Pourquoi ne pas faire une vue indexée et faire les recherches dessus plutôt que d'alourdir la table ?

    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
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 166
    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 166
    Points : 7 418
    Points
    7 418
    Billets dans le blog
    1
    Par défaut
    Parce que je ne maîtrise pas le code client, et que le programme ne sais pas utiliser autre-chose que des tables qu'ils gère lui-même.

    Déjà faire un trigger en SQL, ça relève du miracle que ça foute pas tout en l'air.

    ... enfin... miracle pas si miraculeux, puisque j'ai pour le moment été obligé de désactiver mon trigger, car ça fait planter le programme, de façon aléatoire ! :/
    On ne jouit bien que de ce qu’on partage.

  5. #5
    Membre expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Points : 3 173
    Points
    3 173
    Par défaut
    attention je ne vois pas de SET NOCOUNT ON au début du TRIGGER, c'est peut-être la source de vos ennuis...

    En effet ajouter un trigger sans le NOCOUNT activé peut perturber certains programmes (notamment ceux utilisant des ORM) qui exploitent le nombre ligne affecté...
    Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
    MCTS Database Development
    MCTS Database Administration

  6. #6
    Membre expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Points : 3 173
    Points
    3 173
    Par défaut
    Parce que je ne maîtrise pas le code client, et que le programme ne sais pas utiliser autre-chose que des tables qu'ils gère lui-même.
    Sauf erreur de ma part, sur les éditions ENTERPRISE de SQL SERVER le moteur peut utiliser une vue indéxée sans qu'elle soit appelée explicitement... Fred tu confirmes?
    Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
    MCTS Database Development
    MCTS Database Administration

  7. #7
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 166
    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 166
    Points : 7 418
    Points
    7 418
    Billets dans le blog
    1
    Par défaut
    Oui, sauf que c'est le programme qui crée les tables/colonnes.
    Donc déjà, le trigger, je vais devoir vérifier qu'il a pas sauté à chaque modification.

    Si je fais ce que vous proposez, il faut que je crée la table avec le programme, puis que le la remplace par une vue indexée.

    Sauf que si on fait ensuite une modification, un ordre ALTER est lancé sur la table : si c'est une vue, je vais planter l'outil de design, ce qui est tout sauf une bonne idée : je vais corrompre la base.
    On ne jouit bien que de ce qu’on partage.

  8. #8
    Membre expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Points : 3 173
    Points
    3 173
    Par défaut
    Je connais très bien le problème des ERP, travaillant avec:
    • SAGE L100
    • SAGE X3
    • DYNAMICS NAVISION
    • DYNAMICS AX
    • DYNAMICS CRM



    En effet il faut toujours scripter les modifications "externes" : index, triggers etc...

    Ce que je voulais dire c'est: si la vue indexée est la solution créez la à coté, si informix fait des requêtes sur les tables cibles, SQL SERVER tirera avantage de la présence de la vue indexée de manière transparente.
    Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
    MCTS Database Development
    MCTS Database Administration

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

Discussions similaires

  1. Affichage graphique sur softools avec mises à jour de windows 7
    Par fouineur dans le forum Autres Logiciels
    Réponses: 0
    Dernier message: 27/12/2014, 15h42
  2. Réponses: 6
    Dernier message: 28/11/2013, 11h55
  3. TRIGGER de mise à jour sur coordonnées
    Par Qosmio dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 02/06/2010, 16h28
  4. UpdatePanel avec Trigger (Empêcher mise à jour)
    Par Erakis dans le forum ASP.NET
    Réponses: 7
    Dernier message: 21/01/2010, 16h50
  5. Réponses: 2
    Dernier message: 21/09/2009, 14h20

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