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 :

Problème Trigger SQL Server


Sujet :

Développement SQL Server

  1. #1
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    131
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 131
    Points : 54
    Points
    54
    Par défaut Problème Trigger SQL Server
    Salut à tous, j'ai un gros soucis sur un trigger sous SQL Server 2000, le fonctionnement d'un trigger étant tout bête j'ai du mal à comprendre ce qui cloche mais peut être qu'un détail n'échappera pas aux yeux d'experts de certains

    Alors voilà j'ai une requête basique comme ceci :

    DELETE FROM MATCH WHERE NUM_MATCH=:id_match;
    (c'est une requête SQL sous delphi mais cela n'a pas grande importance)

    et j'ai le trigger suivant censé s'esxécuter lors d'un Delete sur la table MATCH (ce qui est évidemment le cas ici)

    CREATE TRIGGER suppr_match ON MATCH
    FOR DELETE
    AS

    DECLARE @num_match INT

    SELECT @num_match = num_match

    FROM DELETED


    DELETE FROM JOUEUR WHERE NUM_JOUEUR IN (SELECT MATCH.NUM_JOUEUR2
    FROM MATCH
    WHERE NUM_MATCH=@num_match)

    DELETE FROM CLUB WHERE NUM_CLUB IN (SELECT CLUB.NUM_CLUB
    FROM JOUEUR, CLUB
    WHERE JOUEUR.NUM_CLUB = CLUB.NUM_CLUB
    AND JOUEUR.NUM_JOUEUR in ( SELECT NUM_JOUEUR2
    FROM MATCH
    WHERE NUM_MATCH=@num_match))

    Voilà donc en fait la requête principale Delete From Match est correctement executée mais les 2 requêtes à l'intérieur du trigger ne s'execute pas alors qu'en les testant individuellement dans l'analyseyr de requête sql elles marchent très bien. Quelqu'un saurait-il pkoi les 2 requêtes du trigger ne sont pas executées ??

  2. #2
    Expert confirmé
    Avatar de rudib
    Homme Profil pro
    Fakir SQL Server & NoSQL
    Inscrit en
    Mai 2006
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Fakir SQL Server & NoSQL

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 573
    Points : 4 043
    Points
    4 043
    Par défaut
    Bonjour,

    le trigger que tu crées est appelé un AFTER trigger, cad qu'il s'exécute après la suppression. C'est pour cette raison que tu as à disposition la table deleted pour retrouver les lignes supprimées.
    Comme tu utilises la ligne de ta table MATCH supprimée comme critère pour tes DELETE, il ne trouve rien.
    Tu dois utiliser la table deleted, et ne pas passer par une variable, parce qu'un trigger peux s'appliquer sur plusieurs lignes. Par exemple un DELETE FROM MATCH supprimerait toutes les lignes, et donc toute la table se retrouverait dans la table deleted du trigger.

    Code du trigger réécrit :
    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
     
    CREATE TRIGGER suppr_match ON MATCH
    FOR DELETE
    AS
     
    DELETE FROM JOUEUR 
    FROM JOUEUR j 
    JOIN deleted d ON j.NUM_JOUEUR = d.NUM_JOUEUR2
    -- pour un exemple de syntaxe étendue t-sql
     
    DELETE FROM CLUB WHERE NUM_CLUB IN (SELECT CLUB.NUM_CLUB
    FROM JOUEUR, CLUB
    WHERE JOUEUR.NUM_CLUB = CLUB.NUM_CLUB
    AND JOUEUR.NUM_JOUEUR in ( SELECT NUM_JOUEUR2
    FROM deleted))
    Code non testé, mais l'idée est là
    Rudi Bruchez
    Rudi Bruchez EIRL, solutions MS SQL Server et NoSQL
    LinkedIn - [Outil libre de diagnostic SQL Server : Sql Trismegiste]
    LIVRES : Optimiser SQL Server -
    Microsoft SQL Server 2012 Security Cookbook
    - les bases de données NoSQL

    e-learning : LinkedIn Learning - Pluralsight

  3. #3
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    131
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 131
    Points : 54
    Points
    54
    Par défaut
    Merci on a déjà fait un grand pas puisque la première requête du trigger s'execute nickel cependant la deuxième ne fonctionne pas encore et pourtant elle est tout simple avec le from deleted donc je vois pas tro ce qui cloche

  4. #4
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    131
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 131
    Points : 54
    Points
    54
    Par défaut
    De plus bien que la première requête fonctionne très bien à présent, j'ai du mal à comprendre la syntaxe. Pourquoi y'a-t-il 2 FROM successifs ? (DELETE FROM JOUEUR FROM JOUEUR j). Je n'avais jamais vu de telle syntaxe pourtant ça fonctionne très bien. et si j'enlève le premier FROM ça ne fonctionne plus.

  5. #5
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    131
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 131
    Points : 54
    Points
    54
    Par défaut
    C bon g résolu le problème de la 2ème requête car il me fallait de toute façon crée un autre trigger qui permette de supprimer le classement et le club du joueur à sa suppression. Ce qui m'a donné une requête beaucoup plus simple pour le club.

    En revanche ma quastion sur les 2 FROM successifs est toujours d'actualité pour ma culture perso

  6. #6
    Expert confirmé
    Avatar de rudib
    Homme Profil pro
    Fakir SQL Server & NoSQL
    Inscrit en
    Mai 2006
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Fakir SQL Server & NoSQL

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 573
    Points : 4 043
    Points
    4 043
    Par défaut
    Il s'agit d'une extension transact sql, donc une spécificité de SQL Server. C'était juste pour en montrer l'existence. Maintenant, tu souhaites peut-être l'éviter si tu veux créer du code portable vers d'autres SGBD.
    Regarde l'aide en ligne sur l'instruction DELETE pour les détails de syntaxe.
    Rudi Bruchez
    Rudi Bruchez EIRL, solutions MS SQL Server et NoSQL
    LinkedIn - [Outil libre de diagnostic SQL Server : Sql Trismegiste]
    LIVRES : Optimiser SQL Server -
    Microsoft SQL Server 2012 Security Cookbook
    - les bases de données NoSQL

    e-learning : LinkedIn Learning - Pluralsight

  7. #7
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    131
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 131
    Points : 54
    Points
    54
    Par défaut
    Non non moi tant que ça marche c'est ce qui compte, je passe l'épreuve pratique du BTS lundi donc ce qui compte maintenant c'est que ça marche C'était juste pour savoir parceque je trouvais étonnant de voir deux FROM à la suite dans une requête. En tout cas merci bien.

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

Discussions similaires

  1. Problème installation SQL server express
    Par Guennec.Yannick dans le forum MS SQL Server
    Réponses: 10
    Dernier message: 22/03/2006, 19h26
  2. Problème Curseur SQL SERVER
    Par Yanmeunier dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 07/12/2005, 19h19
  3. Attaquer une base externe à partir d'un trigger SQL Server
    Par stephpr44 dans le forum Développement
    Réponses: 5
    Dernier message: 29/10/2005, 15h40
  4. Problème installation SQL Server 2000 (programme antérieur)
    Par 404Found dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 25/04/2005, 10h24
  5. Problème réplication SQL Server et SQL Server CE (RDA)
    Par didix11 dans le forum Réplications
    Réponses: 2
    Dernier message: 15/04/2004, 11h10

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