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 :

Trigger insert dans une table


Sujet :

MS SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 11
    Par défaut Trigger insert dans une table
    Bonjour,

    j'ai une table Pointage "X" je veux Copier dans ma table Personnel "Y" lorsqu'il y a une insertion dans Pointage
    voici le code que j'ai confectionné

    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
     Create TRIGGER trg_insertPerso
    ON  Pointage
    For INSERT as 
     
    declare @matPoint varchar(max)
    declare @nomPoint varchar(max)
     
    declare c_insertPerso scroll cursor for select matricule,nom from Pointage
     
    open c_insertPerso
    fetch next from c_insertPerso into @matPoint ,@nomPoint 
     
    while (@@Fetch_Status =0)
    begin 
     
    insert into Personnel 
    (matricule,nom)
    values (@matPoint ,@nomPoint )
    fetch next from trg_insertPerso into @matPoint ,@matPerso 
     
    end 
    close c_insertPerso
    deallocate c_insertPerso
    ce code s'exécute dans le SQL server mais quand j'ajoute dans mon application VB une erreur :" l'instruction a été arrêtée .violation de contrainte PRIMARY KEY impossible d'insérer une clé en double dans Personnel" si vous pouvez m'aider je serais très reconnaissant,merci d'avance

  2. #2
    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
    Par défaut
    Bonjour,

    Tout d'abord votre trigger est faux pour parce qu'il n'est pas ensembliste, puisque vous avez considéré que vous n'inséreriez qu'une seule ligne à la fois, ce qui ne sera pas toujours le cas.
    Quand c'est le cas, seule la première ligne sera traitée par le trigger.

    Ensuite, n'utilisez jamais de curseur quand vous codez en SQL :

    - SQL est un langage ensembliste : il est donc conçu et optimisé pour traiter les données par ensembles, et non pas ligne à ligne comme vous l'avez fait avec un curseur
    - SQL est un langage déclaratif : le développeur ne pas (trop) se soucier de ce que va faire le moteur de base de données pour exécuter la requête; il écrit seulement le résultat qu'il souhaite obtenir.
    Si les performances ne sont pas au rendez-vous, c'est le travail du DBA d'aider le moteur de base de données.

    Dès lors votre trigger devient :

    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 trg_insertPerso
    	ON dbo.Pointage
    FOR INSERT AS
    BEGIN
    	SET NOCOUNT ON
     
    	INSERT INTO dbo.Personnel
    	(
    		matricule
    		, nom
    	)
    	SELECT	matricule
    		, nom
    	FROM	inserted
    END
    En effet les triggers mettent à disposition deux tables virtuelles :

    - dans les triggers sur INSERT, la table virtuelle INSERTED reflète les lignes que l'on va (cas des triggers INSTEAD OF) ou que l'on vient (cas des triggers AFTER ou FOR) ajouter à la table
    - dans les triggers sur DELETE, la table virtuelle DELETED reflète les lignes que l'on va (cas des triggers INSTEAD OF) ou que l'on vient (cas des triggers AFTER ou FOR) supprimer de la table
    - dans les triggers sur UPDATE, les deux tables virtuelles INSERTED et DELETED reflètent les lignes qui ont été affectées par la mise à jour, avec respectivement leurs nouvelles et anciennes valeurs.

    En ce qui concerne votre problème de clé primaire, il aurait été judicieux de donner la définition de la table dbo.Personnel, sans laquelle nous n'avons pas la définition de la clé primaire, même si on peut supposer que c'est le matricule.

    Dans ce cas il suffit de changer la clause SELECT de l'INSERT :

    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
    CREATE TRIGGER trg_insertPerso
    	ON dbo.Pointage
    FOR INSERT AS
    BEGIN
    	SET NOCOUNT ON
     
    	INSERT INTO dbo.Personnel
    	(
    		matricule
    		, nom
    	)
    	SELECT		I.matricule
    			, I.nom
    	FROM		dbo.Personnel AS P
    	LEFT JOIN	inserted AS I
    				ON I.matricule = P.matricule
    	WHERE		P.matricule IS NULL
    END
    Ou si vous préférez :

    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
    CREATE TRIGGER trg_insertPerso
    	ON dbo.Pointage
    FOR INSERT AS
    BEGIN
    	SET NOCOUNT ON
     
    	INSERT INTO dbo.Personnel
    	(
    		matricule
    		, nom
    	)
    	SELECT	I.matricule
    		, I.nom
    	FROM	inserted AS I
    	WHERE	NOT EXISTS
    		(
    			SELECT	*
    			FROM	dbo.Personnel AS P
    			WHERE	I.matricule = P.matricule
    		)
    END
    ou encore :

    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
    CREATE TRIGGER trg_insertPerso
    	ON dbo.Pointage
    FOR INSERT AS
    BEGIN
    	SET NOCOUNT ON
     
    	INSERT INTO dbo.Personnel
    	(
    		matricule
    		, nom
    	)
    	SELECT	matricule
    		nom
    	FROM	inserted AS I
    	WHERE	matricule NOT IN
    		(
    			SELECT	matricule
    			FROM	dbo.Personnel
    		)
    END
    @++

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 11
    Par défaut Merci beaucoup ça ma vraiment aidé

  4. #4
    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
    Par défaut
    Avec plaisir

    @++

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

Discussions similaires

  1. [11g] Empêcher un insert dans une table par un Trigger
    Par cmako dans le forum PL/SQL
    Réponses: 19
    Dernier message: 16/10/2013, 15h42
  2. Trigger d'insertion dans une table parente
    Par Nadinette dans le forum PL/SQL
    Réponses: 4
    Dernier message: 28/11/2012, 17h48
  3. [base 9i] trigger pour insert dans une table identique
    Par gaultier dans le forum Oracle
    Réponses: 3
    Dernier message: 18/01/2012, 11h07
  4. Extraction d'un .txt et Insertion dans une table
    Par PoPmiSiR dans le forum Access
    Réponses: 8
    Dernier message: 28/10/2004, 19h13
  5. Détection insertion dans une Table
    Par abelman dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 06/07/2004, 14h24

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