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 :

[Debutant] Trigger d'insert


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Avril 2007
    Messages
    76
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Avril 2007
    Messages : 76
    Par défaut [Debutant] Trigger d'insert
    Bonjour a tous.

    Voila je decouvre les trigger et je souhaiterai réaliser la chose suivante :

    Tout d'abords je dispose de 3 tables

    INTERFACE_RESEAU [AdresseMAC, AdresseIP, ID_Machine_FK]
    MACHINE [ID_Machine, xxxx, xxxx, xxxx ...]
    recep_ip_new_machine [ip, mac]

    Mon but etant d'inserer pour chaque ligne de ma table recep_ip_new_machine les données dans ma table INTERFACE_RESEAU (donc au fur et a mesure que ma table recep_ip se remplit, executer le trigger d'insertion qui suit pour remplir la table INTERFACE)

    Pour cela je suis obligé de faire un insert dans la table MACHINE afin d'incrémenter un ID_Machine pour le recuperer puis l'inserer avec ip et mac dans la table INTERFACE_RESEAU (car champ obligatoire).

    Voila le trigger que j'ai réalisé en suivant les infos glanées sur le net mais ca ne fonctionne pas.

    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
    USE [test_2_IDHI8430]
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
     
    CREATE TRIGGER testouille
       ON recep_ip_new_machine
       FOR INSERT
    AS 
    BEGIN
     
        DECLARE @IP NCHAR(15)
        DECLARE @MAC NCHAR(17)
        DECLARE @max_id INT
     
           SET @IP = (SELECT ip FROM recep_ip_new_machine)
           SET @MAC = (SELECT mac FROM recep_ip_new_machine)
     
     
    		   INSERT INTO MACHINE (NomDNS, NomNetBIOS, NomHote, Role, DateIntegration_FK,
    		   DateDerniereMAJ_FK, ID_Infrastructure_FK, ID_ResponsableMachine_FK, ID_SystemeExploitation_FK)
    		   VALUES ('temp', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL)
     
    		   SET @max_id = (SELECT MAX(ID_MACHINE) FROM MACHINE)
     
    		   INSERT INTO INTERFACE_RESEAU (AdresseMAC, AdresseIP, ID_Machine_FK)
    		   values (@MAC, @IP, @max_id)
     
    END

    Si vous pouviez m'aider ce serait formidable

  2. #2
    Membre confirmé
    Inscrit en
    Avril 2007
    Messages
    76
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Avril 2007
    Messages : 76
    Par défaut
    Lors d'un insert dans ma table recep_ip_new_machine, voila le message d'erreur que j'obtiens :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Msg 512, Level 16, State 1, Procedure testouille, Line 12
    Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
    The statement has been terminated.

    Il semble que cela provienne de l'attribution de valeur de mes deux variable @IP et @MAC. Je pensais que par definition le trigger s'effectuait sur chacune des ligne de la table dès leurs insertions

  3. #3
    Membre confirmé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Octobre 2006
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 127
    Par défaut
    Je suis pas un cador en sql et server, mais il me semble que
    -tu ne peux pas affecter le résultat d'une requête SQL ensembliste
    à une variable sauf si elle ne renvoie qu'une ligne
    -Tu dois utiliser la pseudo table INSERTED pour avoir les dernieres lignes
    insérées dans ta table "recep_ip_new_machine"
    - Un trigger ne se déclenche qu'une fois par requête ensembliste qui touche une table

    En cherchant sur TRIGGER tu devrais obtenir beaucoup d'info

  4. #4
    Membre confirmé
    Inscrit en
    Avril 2007
    Messages
    76
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Avril 2007
    Messages : 76
    Par défaut
    Merci de ces premières précisions, je vais continuer mes recherches.


    ps: Faudrait-il que je rajoute un FOR EACH ROW en debut de trigger ? (chose que je croyais implicite au trigger justement)

  5. #5
    Membre Expert
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    1 056
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 056
    Par défaut
    dans ton trigger tu peux tester la variable @@rowcount pour savoir combien de lignes ont été inserées. S'il y en a eu plusieurs, il faudrait déclarer un curseur pour parcourir ton jeu de lignes de la table inserted.
    Etant donné que tu incrémentes un identifiant manuellement, tu ne pourras pas facilement utiliser un INSERT/SELECT, ce qui aurait évité le curseur.

    ex (c'est juste un draft sans test mais pour te donner une idée du truc )

    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
     if @@rowcount = 1
    begin
                --tu geres ta partie tel que le fait dans ton trigger actuellement
    end
    else
     begin
     DECLARE @IP NCHAR(15)
        DECLARE @MAC NCHAR(17)
        DECLARE @max_id INT
     
     
                declare letsgo cursor for select ip, mac from inserted for read only
     
                open letsgo 
     
                fetch letsgo  into @IP, @MAC
     
                while @@ FETCH_STATUS=0
                 begin
     
                 INSERT INTO INTERFACE_RESEAU (AdresseMAC, AdresseIP, ID_Machine_FK)
    		   VALUES (@MAC, @IP, @max_id)
     
                  fetch letsgo  into @IP, @MAC
     
                end
     
    end

  6. #6
    Membre confirmé
    Inscrit en
    Avril 2007
    Messages
    76
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Avril 2007
    Messages : 76
    Par défaut
    Merci a toi.

    Cependant etant débutant j'ai pas tout compris de ta solution et j'ai finalement reussi en procedant comme ceci :

    J'ai ajouté un champ id (en auto increment dans recep_ip_new_machine) et j'ai ensuite modifié le trigger comme suit :

    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
    31
    32
    33
    34
    35
    36
    37
    38
    USE [test_2_IDHI8430]
    GO
    /****** Object:  Trigger [dbo].[test1]    Script Date: 07/02/2007 10:45:37 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
     
    ALTER TRIGGER [dbo].[test1]
       ON [dbo].[recep_ip_new_machine]
       AFTER INSERT
     
    AS 
    BEGIN
     
    	DECLARE @IP NCHAR(15)
        DECLARE @MAC NCHAR(17)
        DECLARE @max_id_machine INT
        DECLARE @max_ip_new_machine INT
     
           SET @max_ip_new_machine = (SELECT MAX(id) FROM recep_ip_new_machine)
           SET @IP = (SELECT ip FROM recep_ip_new_machine where id = @max_ip_new_machine)
           SET @MAC = (SELECT mac FROM recep_ip_new_machine where id = @max_ip_new_machine)
     
     
     
    		   INSERT INTO MACHINE (NomDNS, NomNetBIOS, NomHote, Role, DateIntegration_FK,
    		   DateDerniereMAJ_FK, ID_Infrastructure_FK, ID_ResponsableMachine_FK, ID_SystemeExploitation_FK)
    		   VALUES (NULL, NULL, @IP, NULL, NULL, NULL, NULL, NULL, NULL)
     
    		   SET @max_id_machine = (SELECT MAX(ID_MACHINE) FROM MACHINE)
     
    		   INSERT INTO INTERFACE_RESEAU (AdresseMAC, AdresseIP, ID_Machine_FK)
    		   values (@MAC, @IP, @max_id_machine)
     
     
     
    END

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

Discussions similaires

  1. Insert avec select sur table avec Trigger d'insertion
    Par bran_noz dans le forum Développement
    Réponses: 5
    Dernier message: 23/12/2005, 14h38
  2. [debutant][Applet] problèmes insertion applet java
    Par mlequim dans le forum Applets
    Réponses: 5
    Dernier message: 11/07/2005, 09h50
  3. [trigger] update inserted?
    Par cosminutza dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 01/06/2005, 09h37
  4. [Debutant]Probleme d'insert sur sequence !
    Par Tchinkatchuk dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 19/04/2005, 15h37
  5. Trigger et insert
    Par jf-nigou dans le forum Oracle
    Réponses: 5
    Dernier message: 16/02/2005, 16h45

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