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 update sql server 2008


Sujet :

MS SQL Server

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Juillet 2010
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 5
    Points : 1
    Points
    1
    Par défaut Trigger update sql server 2008
    Bonjour à tous,

    Je viens vers vous car je n'arrive pas à solutionner mon problème!

    En fait j'ai 2 tables, une table contenant un ensemble d'appels telephoniques et
    dans laquelle se fait des update sur le statut de l'appel et une autre contenant l'historique sur les changements de statuts.

    Voici la structure de mes 2 tables:
    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
    55
    56
    57
    58
    59
    60
    61
    62
    63
    USE [MessageService]
    GO
    /****** Object:  Table [dbo].[Appels]    Script Date: 07/01/2010 09:02:25 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    TABLE [dbo].[Appels](
    	[Id_Appels] [int] IDENTITY(1,1) NOT NULL,
    	[DateIntegration] [nvarchar](10) NULL,
    	[HeureIntegration] [nvarchar](4) NULL,
    	[FK_Campagnes] [int] NOT NULL,
    	[FK_Prestataires] [int] NULL,
    	[TelAppelant] [nvarchar](15)  NULL,
    	[Tel] [nvarchar](15) NULL,
    	[CodeMessagesClients] [nvarchar](5) NOT NULL,
    	[MessageClient] [ntext]  NULL,
    	[Id_Statuts] [int] NOT NULL,
    	[LibelleClientsStatuts] [nvarchar](50)  NOT NULL,
    	[NombreMessage] [int] NOT NULL,
    	[SVI_Indice] [int] NOT NULL,
    	[SVI_Table] [nvarchar](50)  NULL,
    	[NombreEssai] [int] NOT NULL,
    	[DateHeureStatut] [datetime] NOT NULL,
    	[NomFichier] [nvarchar](50)  NULL,
    	[LigneFichier] [nvarchar](500)  NULL,
    	[TraitementEnCours] [bit] NOT NULL,
                 [DF_Appels_Traitement]  DEFAULT ((0)),
    	[Push_Id] [nvarchar](40) NULL,
                  [DF_Appels_Push_Id]  DEFAULT (N'NC')
    )
    Clef primaire sur l'identifiant Id_appels
     
    Et la table historique:
    TABLE [dbo].[Histo_Appels](
    	[Id_AppelsHisto] [int] IDENTITY(1,1) NOT NULL,
    	[FK_Appels] [int] NOT NULL,
    	[DateAppels] [datetime] NOT NULL,
    	[HeureAppels] [nvarchar](4) NULL,
    	[DateHisto] [datetime] NOT NULL,
    	[FK_Campagnes] [int] NULL,
    	[LibelleCampagnes] [nvarchar](50)  NULL,
    	[ModeCampagnes] [nvarchar](50)  NULL,
    	[TelAppelantCampagnes] [nvarchar](15)  NULL,
    	[FK_Clients] [int] NULL,
    	[NomClients] [nvarchar](50)  NULL,
    	[FK_Prestataires] [int] NULL,
    	[NomPrestataires] [nvarchar](50)  NULL,
    	[FK_PrestatairesDefinition] [int] NULL,
    	[NomPrestatairesDefinition] [nvarchar](50)  NULL,
    	[DateIntegration] [datetime] NULL,
    	[StatutIntegration] [int] NULL,
    	[LibelleStatutIntegration] [nvarchar](50)  NULL,
    	[Tel] [nvarchar](15) NULL,
    	[MessageClient] [ntext]  NULL,
    	[NombreMessage] [int] NULL,
    	[SVI_Indice] [int] NULL,
    	[SVI_Table] [nvarchar](50)  NULL,
    	[NombreEssai] [int] NULL,
    	[NomFichier] [nvarchar](50)  NULL,
    	[LigneFichier] [nvarchar](500)  NULL,
    	[Push_Id] [nvarchar](40)  NULL
    )
    Clef primaire sur l'identifiant Id_AppelsHisto

    Je souhaiterai insérer dans la table Histo_Appels toutes les lignes qui font l'objet d'un changement de statut (StatutIntegration) dans la table Appels
    (Il 'y a pas de suppression de lignes dans la table Appels)

    Voici mon 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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    TRIGGER [dbo].[AppelsHisto]
    ON [dbo].[Appels]
    AFTER INSERT, UPDATE 
    AS
     
    	IF (UPDATE (Id_Statuts)) --Test si la colonne Id_Statuts est modifie
    	BEGIN
    		DECLARE @Id_Appels int
    		DECLARE @FK_Campagnes int
    		DECLARE @DateIntegration nvarchar(10)
    		DECLARE @HeureIntegration nvarchar(4)
    		DECLARE @StatutIntegration int
    		DECLARE @Tel nvarchar(15)
    		DECLARE @NombreMessage int
    		DECLARE @SVI_Indice int
    		DECLARE @SVI_Table nvarchar(50)
    		DECLARE @NombreEssai int
    		DECLARE @NomFichier nvarchar(50)
    		DECLARE @LigneFichier nvarchar(500)
    		DECLARE @Push_Id nvarchar(40)
    		DECLARE @TraitementEnCours bit
     
    		SELECT @Id_Appels = Id_Appels,
    			@FK_Campagnes = FK_Campagnes,
    			@DateIntegration = DateIntegration,
    			@HeureIntegration = HeureIntegration,
    			@StatutIntegration = Id_Statuts,
    			@Tel = Tel,
    			@NombreMessage = NombreMessage,
    			@SVI_Indice = SVI_Indice,
    			@SVI_Table = SVI_Table,
    			@NombreEssai = NombreEssai,
    			@NomFichier = NomFichier,
    			@LigneFichier = LigneFichier,
    			@Push_Id = Push_Id,
    			@TraitementEnCours = TraitementEnCours
    		FROM INSERTED
     
    		DECLARE @MessageClient nvarchar(4000)
    		DECLARE @LibelleCampagnes nvarchar(50)
    		DECLARE @ModeCampagnes nvarchar(50)
    		DECLARE @TelAppelantCampagnes nvarchar(15)
    		DECLARE @FK_Clients int
    		DECLARE @NomClient nvarchar(50)
    		DECLARE @LibelleStatutIntegration nvarchar(50)
    		DECLARE @FK_Prestataires int
    		DECLARE @NomPrestataires nvarchar(50)
    		DECLARE @FK_PrestatairesDefinition int	
     
    		-- Infos appels
    		SELECT @MessageClient = MessageClient
    			FROM Appels
    			WHERE Id_Appels = @Id_Appels
     
    		-- Infos campagnes
    		SELECT @LibelleCampagnes = Nom, 
    			@ModeCampagnes = Mode, 
    			@TelAppelantCampagnes = TelAppelant,
    			@FK_Clients = Fk_Clients,
    			@FK_Prestataires = Fk_Prestataires
    			FROM Campagnes WHERE Id_Campagnes =                                     @FK_Campagnes
     
    		-- Infos Clients
    		SELECT @NomClient = Nom
    			FROM Clients
    			WHERE ID_Clients = @FK_Clients
     
    		-- Infos statuts
    		SELECT @LibelleStatutIntegration = Libelle
    			FROM clientsStatuts
    			WHERE FK_clients = @FK_Clients
    			AND CodeStatuts = @StatutIntegration
     
    		-- Infos Prestataires
    		SELECT @NomPrestataires = Nom,
    			@FK_PrestatairesDefinition = FK_PrestatairesDefinition
    			FROM Prestataires
    			WHERE Id_Prestataires = @FK_Prestataires
     
     
    		-- Insertion table historique sauf update sur le flag traitement en cours
    		IF @TraitementEnCours = 0
    		BEGIN
    		INSERT INTO Histo_Appels (FK_appels, DateAppels, datehisto, fk_campagnes, libellecampagnes, modecampagnes,
    			TelAppelantCampagnes, FK_Clients, NomClients, FK_Prestataires, NomPrestataires,
    			FK_PrestatairesDefinition, DateIntegration, StatutIntegration, LibelleStatutIntegration, Tel, MessageClient, 
    			NombreMessage, SVI_Indice, SVI_Table, NombreEssai, NomFichier, LigneFichier, Push_Id)
    		VALUES (@Id_Appels, @DateIntegration, getdate(), @FK_Campagnes, @LibelleCampagnes, @ModeCampagnes,
    			@TelAppelantCampagnes, @FK_Clients, @NomClient, @FK_Prestataires, @NomPrestataires,
    			@FK_PrestatairesDefinition, convert(datetime, @DateIntegration + ' ' + substring(@HeureIntegration,1,2) + ':' + substring(@HeureIntegration,4,2), 108), @StatutIntegration, @LibelleStatutIntegration, @Tel, @MessageClient, 
    			@NombreMessage, @SVI_Indice, @SVI_Table, @NombreEssai, @NomFichier, @LigneFichier, @Push_Id)
    		END
    	END
    Probleme:
    En fait j'ai 2 process Webservice qui viennent 1) inserer les nouvelles lignes dans la table d'appels et 2) celui qui vient mettre a jour les statuts.

    Or il s'avere que j'ai des doublons de lignes dans la table historiques!!!
    J'ai en effet plusieurs fois le même StatutIntegration sur des lignes differentes evidemmenent.

    Pourquoi un tel phénomène?

    Quand j'essaye manuellement le trigger semble fonctionner mais une fois dans son contexte je n'ai pas le résultat attendu!

    D'avance merci pour votre aide sur mon soucis.

    A+
    lesapo

    PS: Il s'agit de mon premier trigger donc...

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 849
    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 849
    Points : 52 978
    Points
    52 978
    Billets dans le blog
    6
    Par défaut
    Votre trigger est totalement faux. En effet un trigger SQL Server est par nature ensembliste. Il ne se déclenche qu'une seule fois quelque soit le nombre de lignes mise à jour. La présence de variables locale indique que vous n'allez traiter qu'une seule ligne au hasard.
    Vous ne devez avoir dans votre trigger que des requêtes ensemblistes....
    Du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    INSERT INTO [dbo].[Histo_Appels]
    SELECT ... 
    FROM inserted AS I 
         LEFT OUTER JOIN deleted AS d 
              ON i.LaClef = d.LaClef
    WHERE i.StatutIntegration <> d.StatutIntegration 
        OR d.StatutIntegration IS NULL
    A +

  3. #3
    Nouveau Candidat au Club
    Inscrit en
    Juillet 2010
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Oulala merci pour votre réponse!
    Me voila bien...

    Pourriez-vous svp me donner le trigger complet que je devrais avoir a la place de celui que j'ai crée?
    Je vous en demande beaucoup mais cela m'aiderait enormement!

    Merci
    lesapo

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 849
    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 849
    Points : 52 978
    Points
    52 978
    Billets dans le blog
    6
    Par défaut
    Mon tarif est de 1250 euro HT par jour et avec un minimum d'une journée....

    A +

  5. #5
    Nouveau Candidat au Club
    Inscrit en
    Juillet 2010
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Merci

  6. #6
    Nouveau Candidat au Club
    Inscrit en
    Juillet 2010
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Re,

    Y aurait-il une autre personne prête a m'aider sans me donner son tarif?

    Merci
    lesapo

    PS: Personnellement je pensais qu'il s'agissait d'un forum "d'entraide" et pas un service payant!

  7. #7
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 849
    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 849
    Points : 52 978
    Points
    52 978
    Billets dans le blog
    6
    Par défaut
    Il y a une nette différence entre faire votre boulot à votre place et gratuitement et vous donner des conseils !!!!

    A +

    PS : méditez sur le proverbe : aide toi et le ciel t'aidera !

  8. #8
    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 : 42
    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,

    Si vous aviez regardé le nombre de posts de SQLPro, et que vous connaissiez sont esprit de partage de la connaissance, vous n'auriez pas écrit le PS.
    Si SQLPro vous a répondu de cette façon, c'est parce qu'il veut vous pousser à chercher.

    Néanmoins je comprend que cela ne soit pas simple, mais notez qu'une recherche vous aurait probablement conduit vers ce billet que j'ai écrit, et vous aurait donc permis d'écrire le trigger suivant :

    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
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    ALTER TRIGGER dbo.AppelsHisto
    	ON dbo.Appels
    AFTER INSERT, UPDATE 
    AS
    BEGIN
    	SET NOCOUNT ON
     
    	IF UPDATE (Id_Statuts) --Test si la colonne Id_Statuts est modifie
    	BEGIN
    		INSERT INTO dbo.Histo_Appels
    		(
    			FK_appels
    			, DateAppels
    			, datehisto
    			, fk_campagnes
    			, libellecampagnes
    			, modecampagnes
    			, TelAppelantCampagnes
    			, FK_Clients
    			, NomClients
    			, FK_Prestataires
    			, NomPrestataires
    			, FK_PrestatairesDefinition
    			, DateIntegration
    			, StatutIntegration
    			, LibelleStatutIntegration
    			, Tel
    			, MessageClient
    			, NombreMessage
    			, SVI_Indice
    			, SVI_Table
    			, NombreEssai
    			, NomFichier
    			, LigneFichier
    			, Push_Id
    		)
    		SELECT		I.Id_Appels
    				, I.DateIntegration
    				, GETDATE()
    				, I.FK_Campagnes
    				, CP.Nom
    				, CP.Mode
    				, CP.TelAppelant
    				, CP.Fk_Clients
    				, CL.Nom
    				, CP.Fk_Prestataires
    				, P.Nom
    				, P.FK_PrestatairesDefinition
    				, CONVERT(DATETIME, I.DateIntegration + ' ' + SUBSTRING(I.HeureIntegration,1,2) + ':' + SUBSTRING(I.HeureIntegration,4,2), 108) 
    				, I.Id_Statuts
    				, CS.Libelle
    				, I.Tel
    				, A.MessageClient
    				, I.NombreMessage
    				, I.SVI_Indice
    				, I.SVI_Table
    				, I.NombreEssai
    				, I.NomFichier
    				, I.LigneFichier
    				, I.Push_Id
    		FROM		INSERTED AS I
    		INNER JOIN	dbo.Campagnes AS CP
    					ON I.FK_Campagnes = CP.Id_Campagnes
    		INNER JOIN	dbo.Clients AS CL
    					ON CL.ID_Clients = CP.Fk_Clients
    		INNER JOIN	dbo.Prestataires AS P
    					ON P.Id_Prestataires = CP.Fk_Prestataires
    		INNER JOIN	dbo.ClientsStatuts AS CS
    					ON CS.FK_clients = CP.Fk_Clients
    					AND CS.CodeStatuts = I.Id_Statuts
    		INNER JOIN	dbo.Appels AS A
    					ON A.Id_Appels = I.Id_Appels
    		WHERE		I.TraitementEnCours = 0
    	END
    END
    @++

  9. #9
    Nouveau Candidat au Club
    Inscrit en
    Juillet 2010
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 5
    Points : 1
    Points
    1
    Par défaut Remerciements
    Bonjour,

    Je tiens à remercier Elsuket pour son esprit d'entraide.
    Je tiens juste à lui dire que si j'ai ajouté ce 'PS' c'est uniquement pour montrer ma surprise sur la réponse directe de tarif de SQLPro!!! Il aurait été plus intelligent de me dire qu'il voulait que je cherche au lieu de me donner ses prétentions salariales.

    J'ai déjà eu des retours sur ce forum avec un autre pseudo et à chaque fois j'ai eu réponse ou bien un commencement de réponse de la part d'autres membres.

    Developpez est un très bon forum.

    Merci à tous ou presque lol...
    lesapo

  10. #10
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 849
    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 849
    Points : 52 978
    Points
    52 978
    Billets dans le blog
    6
    Par défaut
    Il faut apprendre à me connaître !!!

    ;-)

    A +

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Août 2002
    Messages
    141
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : Tunisie

    Informations forums :
    Inscription : Août 2002
    Messages : 141
    Points : 97
    Points
    97
    Par défaut trigger update sur une colonne
    Bonjour tout le monde,
    Je tiens a remercier elsuket pour son aide sans oublier SQLpro pour encourager les gents a améliorer leur esprit de recherche.
    J'ai réussi a créer mon trigger after update sur une colonne bien déterminée avec succès
    Merci,

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

Discussions similaires

  1. Création de trigger sous SQL Server 2008
    Par lessoy dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 22/04/2013, 12h49
  2. Tester la performance d'un trigger sous SQL Server 2008
    Par lerieure dans le forum MS SQL Server
    Réponses: 8
    Dernier message: 14/02/2011, 18h04
  3. Erreurs dans le rapport de SQL SERVER 2008 Update Advisor
    Par dens19 dans le forum Administration
    Réponses: 6
    Dernier message: 08/09/2010, 11h33

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