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 ??


Sujet :

Développement SQL Server

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2003
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 6
    Points : 5
    Points
    5
    Par défaut [RESOLU] Trigger ??
    Bonjour,

    Je cherche à metre en place un trigger et il ne sert strictement à rien(pour le moment), j'aurais eu besoin de vos grande lumières.

    Voila comment je l'ai é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
    16
    17
    18
    19
    20
    21
    CREATE TRIGGER [Trig_RallyTarif] ON [RALLYTARIF] 
    FOR INSERT
    AS
    declare @temp as int, @id_tarfourn as int, @id_tarref as int, @gencod as varchar(13), 
    @ref as varchar(15), @libelle as varchar(30), @famille as varchar(30), 
    @cond as varchar(30),
    @pt as decimal(12,2), @Zl1 as varchar(30), @Zl2 as varchar(30), @Zl3 as varchar(30)
     
    select @id_tarfourn = id_tarfourn, @id_tarref = id_tarref, @gencod = gencod, @ref = reference,
    @libelle = libelle, @famille = famille, @cond = cond, @pt = pt, @Zl1 = zl1, @Zl2 = zl2, @Zl3 = zl3
    from inserted
     
    select @temp = R.id_tarif from rallytarif R
    where R.id_tarfourn = @id_tarfourn and R.id_tarref = @id_tarref and R.reference  = @ref
     
    begin
    	update rallytarif
    	set gencod = @gencod, libelle = @libelle, famille = @famille, cond = @cond, pt = @pt, zl1 = @zl1, zl2 = @zl2, zl3 = @zl3
    	 where id_tarif = @temp
    	commit tran
    end
    Je cherche à vérifier "avant" d'insérer un nouvel enregistrement si celui ci existe déjà. Si il existe je veux le metre à jour mais apparement ca ne fonctionne pas, ca empeche meme toutes nouvelles insertions (ce qui est logique).

    J'ai peut etre oublier quelque chose, c'est meme surement ca mais je vois pas Quoi ??

    Merci de votre aide.

    X-Deus.

  2. #2
    En attente de confirmation mail
    Inscrit en
    Novembre 2002
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 51
    Points : 58
    Points
    58
    Par défaut Re: Trigger ??
    Citation Envoyé par XDeus
    Bonjour,

    Je cherche à metre en place un trigger et il ne sert strictement à rien(pour le moment), j'aurais eu besoin de vos grande lumières.

    Voila comment je l'ai é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
    16
    17
    18
    19
    20
    21
    CREATE TRIGGER [Trig_RallyTarif] ON [RALLYTARIF] 
    FOR INSERT
    AS
    declare @temp as int, @id_tarfourn as int, @id_tarref as int, @gencod as varchar(13), 
    @ref as varchar(15), @libelle as varchar(30), @famille as varchar(30), 
    @cond as varchar(30),
    @pt as decimal(12,2), @Zl1 as varchar(30), @Zl2 as varchar(30), @Zl3 as varchar(30)
     
    select @id_tarfourn = id_tarfourn, @id_tarref = id_tarref, @gencod = gencod, @ref = reference,
    @libelle = libelle, @famille = famille, @cond = cond, @pt = pt, @Zl1 = zl1, @Zl2 = zl2, @Zl3 = zl3
    from inserted
     
    select @temp = R.id_tarif from rallytarif R
    where R.id_tarfourn = @id_tarfourn and R.id_tarref = @id_tarref and R.reference  = @ref
     
    begin
    	update rallytarif
    	set gencod = @gencod, libelle = @libelle, famille = @famille, cond = @cond, pt = @pt, zl1 = @zl1, zl2 = @zl2, zl3 = @zl3
    	 where id_tarif = @temp
    	commit tran
    end
    Je cherche à vérifier "avant" d'insérer un nouvel enregistrement si celui ci existe déjà. Si il existe je veux le metre à jour mais apparement ca ne fonctionne pas, ca empeche meme toutes nouvelles insertions (ce qui est logique).

    J'ai peut etre oublier quelque chose, c'est meme surement ca mais je vois pas Quoi ??

    Merci de votre aide.

    X-Deus.
    Le trigger que tu définis est en "FOR INSERT", et donc il se déclenche après l'instruction insert, c'est-à-dire que les lignes ont déjà été insérées dans ta table.

    Ensuite si on regarde ton trigger, tu récupères les données de la dernière ligne insérée via la table inserted (ne pas oublier qu'un INSERT peut insérer plusieurs lignes à la fois mais que le trigger ne se déclenche qu'une fois), puis ensuite tu cherches à mettre à jour la ligne en question dans ta table RALLYTARIF, mais cette ligne a déjà ces données-là, puisque la table inserted n'est qu'une copie des lignes que tu viens d'insérer.

    Si tu veux faire un traitement avant l'insertion, tu fais un trigger "INSTEAD OF", tu fais tes vérifications, et ensuite tu refais ton instruction INSERT dans le trigger lui-même.

  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 862
    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 862
    Points : 53 015
    Points
    53 015
    Billets dans le blog
    6
    Par défaut
    Le mieux dans ce cas n'est pas d'utiliser un trigger mais une procédure stockée qui fera indifféremment l'insert ou l'update.

    A +

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 7
    Points : 7
    Points
    7
    Par défaut
    jte donne le code d'une procedure stocker que jai fait pour ajouter ou modifier un produit. Jespere que ca va pouvoir taider.
    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
     
    CREATE PROCEDURE dbo.addModProduct 
    	@FK_Groupe 		SMALLINT = 1,
    	@noLongProduit 	CHAR(7) = '',
    	@noShortProduit 	VARCHAR(5) = '',
    	@strNomProduit		VARCHAR(50) = '',
    	@strDescProduit 	VARCHAR(50) = '',
    	@curPrixCANProduit	SMALLMONEY = 0,
    	@curPrixUSDProduit 	SMALLMONEY = 0,
    	@fPoidProduit		DECIMAL(5,3) = 0,
    	@iQtePicProduit		TINYINT = 0,
    	@bShowOnSite		BIT = 1
    AS
    IF 	(SELECT Count(*)
    	 FROM tblProduit
    	 WHERE noLongProduit = @noLongProduit) <> 0
    BEGIN
    	UPDATE tblProduit
    	SET 	noShortProduit = @noShortProduit,
    		strNomProduit = @strNomProduit,
    		curPrixCADProduit = @curPrixCANProduit,
    		curPrixUSDProduit = @curPrixUSDProduit,
    		bModified = 1
    	WHERE noLongProduit = @noLongProduit
    	RETURN 0
    END
    ELSE
    BEGIN
    	INSERT INTO
    	tblProduit (FK_Groupe,
    		noLongProduit, 
    		noShortProduit, 
    		strNomProduit, 
    		strDescProduit,
    		curPrixCADProduit, 
    		curPrixUSDProduit,
    		fPoidProduit, 
    		iQtePicProduit, 
    		bShowOnSite, 
    		bModified)
    	VALUES (@FK_Groupe,
    		@noLongProduit,
    		@noShortProduit,
    		@strNomProduit,
    		@strDescProduit,
    		@curPrixCANProduit,
    		@curPrixUSDProduit,
    		@fPoidProduit,
    		@iQtePicProduit,
    		@bShowOnSite,
    		1)
    	RETURN 1
    END
    GO

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2003
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    Ok je vais donc modifier ma procedure stockée actuelle pour y inserer le traitement directement.

    J'avais fait une procedure stockée pour insérer des transactions de 100 enregistrements afin de pas surcharger mon réseau qu'est loin d'etre une fleche.

    Merci encore.

    Ps: A quoi te-servent les instructions 'return 0' et 'return 1'.

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 7
    Points : 7
    Points
    7
    Par défaut
    je men sert pour savoir s'il a été ajouté ou modifier

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2003
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    Bon ca marche j'ai modifié ma procédure stockée et ajouté quelques index.

    Je remercie tous les gens qui m'ont fournis des réponses.
    ENCORE UN GRAND MERCI.

    X-Deus.

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

Discussions similaires

  1. [power designer et Sybase] trigger
    Par mr_qno dans le forum Sybase
    Réponses: 4
    Dernier message: 12/07/2006, 18h32
  2. historique via trigger
    Par rgz dans le forum SQL
    Réponses: 6
    Dernier message: 25/06/2003, 19h12
  3. [Interbase6] Trigger : Post_event
    Par Andry dans le forum InterBase
    Réponses: 2
    Dernier message: 13/05/2003, 09h27
  4. [PostgreSQL] Refus de STATEMENT dans un trigger
    Par alex2205 dans le forum Requêtes
    Réponses: 3
    Dernier message: 10/03/2003, 12h51
  5. [Comparatif] Procédures stockées, triggers, etc.
    Par MCZz dans le forum Décisions SGBD
    Réponses: 3
    Dernier message: 28/08/2002, 12h27

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