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 :

Créer un trigger apres insertion


Sujet :

MS SQL Server

  1. #1
    Membre habitué
    Inscrit en
    Août 2008
    Messages
    1 596
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 1 596
    Points : 175
    Points
    175
    Par défaut Créer un trigger apres insertion
    Bonjour, je souhaite céer un trigger apres insertion dans une table, dans cette derniere j'enregistre une livraison de a jusqu'à a+500 fiche, et a travers le trigger je dois enregistré le idLivraison et un idFiche, donc j'aurai 500 ligne enregistré a travers ce trigger ?

  2. #2
    Membre actif
    Inscrit en
    Février 2009
    Messages
    224
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 224
    Points : 269
    Points
    269
    Par défaut
    Bonjour,
    Avec SQL Server les trigger sont tjrs des triggers AFTER. Dans le cas d'un trigger lié à l'instruction insert vous trouverez dans la table INSERTED les lignes nouvellement ajoutées.
    Si au contraire il s'agit de compléter les informations à insérer alors la solution d'un trigger INSTEAD OF est préférable.
    Pouvez vous éclairer vos propos avec un petit exemple DDL + DML?

    Merci

  3. #3
    Membre habitué
    Inscrit en
    Août 2008
    Messages
    1 596
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 1 596
    Points : 175
    Points
    175
    Par défaut
    par exemple :

    j'ai une table livraison contenant

    idLivraison NumDebut NumFin idClient
    1 1 500 x1

    Le trigger doit créer dans une autre table

    idClient NumFiche
    x1 1
    x1 2
    ....
    x1 499
    x1 500

  4. #4
    Membre actif
    Inscrit en
    Février 2009
    Messages
    224
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 224
    Points : 269
    Points
    269
    Par défaut
    Donc à supposer que les tables possèdent la structure suivante (il faut bien entendu ajouter les contraintes d'intégrités):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    create table livraison(
    idLivraison int,
    NumDebut int,
    Numfin int,
    idclient varchar(8));
    create table fiches(
    idclient varchar(8),
    numfiches int,
    );
    alors le déclencheur suivant fait le travail:
    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
     
    create trigger af_ins_livraison on livraison
    after insert  as
    begin
    	declare cLesAjouts cursor for select idClient, Numdebut, Numfin from livraison;
    	declare @debut int;
    	declare @fin int;
    	declare @idClient varchar(8);
    	declare @i int;
    	open cLesAjouts;
    	fetch cLesAjouts into @idClient, @debut, @fin;
    	while (@@fetch_status=0) begin
    		set @i=@debut;
    		while (@i<=@fin) begin
    			insert into fiches values (@idClient, @i);
    			set @i=@i+1;
    		end ;
    		fetch cLesAjouts into @idClient, @debut, @fin;
    	end;
    	close cLesAjouts;
    	deallocate cLesAjouts;
    end;

  5. #5
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    J'aurais plutôt vu :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CREATE TABLE Fiche
    (
    	IDClient INT NOT NULL CONSTRAINT PK_Fiche PRIMARY KEY,
    	NumFiche INT NOT NULL
    )
    Et pour le trigger :

    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
    CREATE TRIGGER TR_A_I_livraison
    	ON dbo.Livraison
    AFTER INSERT
    AS
    BEGIN
    	WITH
    		DEB AS
    		(
    			SELECT IDClient,
    					debut
    			FROM INSERTED
    		)
    		CTE AS
    		(
    				SELECT C.IDClient,
    						DEB.debut AS NumFiche
    				FROM dbo.Client AS C
    				JOIN DEB ON C.IDClient = DEB.IDClient
    			UNION ALL
    				SELECT C.IDClient,
    						CTE.NumFiche + 1
    				FROM dbo.Client AS C
    				JOIN CTE ON C.IDClient = CTE.IDClient
    				JOIN DEB ON C.IDClient = DEB.IDClient
    				WHERE CTE.NumFiche < DEB.debut + 500
    		)
    	INSERT INTO dbo.Fiche (IDClient, NumFiche)
    	SELECT IDClient, NumFiche
    	FROM CTE
    	OPTION (MAXRECURSION 500);
    END
    Globalement on doit éviter d'utiliser les curseurs, mais c'est encore plus vrai dans les triggers, qui sont gourmands en ressources.
    Les triggers de SQL Server, par opposition à ceux de Oracle par exemple, sont ensemblistes

    Je vous conseille vivement de stocker les clés primaires de vos tables sur des entiers plutôt que sur des chaînes de caractère, vous y gagnerez à tous les niveaux

    @++

Discussions similaires

  1. TRIGGER d'insertion après une requête INSERT
    Par nasimpat7 dans le forum Développement
    Réponses: 11
    Dernier message: 06/04/2009, 15h45
  2. Trigger Incrementation apres insertion
    Par agur29 dans le forum Développement
    Réponses: 4
    Dernier message: 02/08/2007, 18h15
  3. Trigger Incrementation apres insertion
    Par agur29 dans le forum Développement
    Réponses: 1
    Dernier message: 02/08/2007, 13h40
  4. Trigger après le commit du insert
    Par macben dans le forum PL/SQL
    Réponses: 3
    Dernier message: 22/05/2007, 11h36
  5. Créer un trigger "before insert" avec SQL Server
    Par bubi dans le forum Développement
    Réponses: 2
    Dernier message: 14/11/2005, 10h12

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