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 :

Déclencheur qui insert des valeur nul


Sujet :

Développement SQL Server

  1. #1
    Membre régulier
    Homme Profil pro
    consultant BI
    Inscrit en
    Mai 2011
    Messages
    182
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suède

    Informations professionnelles :
    Activité : consultant BI
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2011
    Messages : 182
    Points : 95
    Points
    95
    Par défaut Déclencheur qui insert des valeur nul
    Bonjour a tous

    j'ai un déclencheur nommé "tg_insertMvtTest" qui a comme Action c'est de copier le contenu d'une table nommé "PickLists"vers un deuxième table nommé "MvtTest"

    ci joint le script de ce déclencheur
    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 [dbo].[tg_insertMvtTest]
       ON  [dbo].[PickLists]
       AFTER  INSERT,DELETE,UPDATE
    AS 
    BEGIN
     
    declare 
    @numserie nvarchar(50),
    @idTransaction int,
    @idligne int,
    @idStatut int
     
    	-- SET NOCOUNT ON added to prevent extra result sets from
    	-- interfering with SELECT statements.
    	SET NOCOUNT ON;
    	select @numserie=Num_PickList ,@idStatut=id_Status ,@idligne=id_LigneProduction   from inserted 
     
    	select @idTransaction = id_Transaction  from Transactions where CodeTransaction in (select Code  from Status where id_Status =@idStatut )
        -- Insert statements for trigger here
    	insert into MvtTest (NumSerie,Type_NumSerie,id_Transaction,Ligne ) values (@numserie,'PICKLIST',@idTransaction ,@idligne )
    END
     
    GO
    le problème que ces déclencheur est entrain d'insérer des valeurs nul dans le table Mvttests dans le colonne NumSerie, id_Transaction,Ligne alors que le colonne Type_NumSerie recoit ses propres valeur
    aussi le table source "PickLists" ne contiens pas des valeur nuls

    ci joint le script de création du table source piklists
    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
    USE [SuiviMatiere]
    GO
     
    /****** Object:  Table [dbo].[PickLists]    Script Date: 09/16/2014 11:01:31 ******/
    SET ANSI_NULLS ON
    GO
     
    SET QUOTED_IDENTIFIER ON
    GO
     
    CREATE TABLE [dbo].[PickLists](
    	[id_PickList] [int] IDENTITY(1,1) NOT NULL,
    	[Num_PickList] [nvarchar](50) NULL,
    	[id_LigneProduction] [int] NULL,
    	[id_Status] [int] NULL,
    	[Magasin] [nvarchar](200) NULL,
    	[DateCreation] [datetime] NULL,
    	[DateMAj] [datetime] NULL,
    	[TypePickList] [nvarchar](50) NULL,
    	[CodeProduit] [nvarchar](50) NULL,
    	[DateLivraison] [datetime] NULL,
    	[DateServi] [datetime] NULL,
    	[NbUSServi] [int] NULL,
    	[NbUSRecept] [int] NULL,
    	[Hostame] [nvarchar](50) NULL,
    	[Observation] [nvarchar](250) NULL,
    	[id_CauseServi] [int] NULL,
     CONSTRAINT [PK_PickLists] PRIMARY KEY CLUSTERED 
    (
    	[id_PickList] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON, FILLFACTOR = 4) ON [PRIMARY]
    ) ON [PRIMARY]
     
    GO
     
    ALTER TABLE [dbo].[PickLists]  WITH CHECK ADD  CONSTRAINT [FK_PickLists_CauseServi] FOREIGN KEY([id_CauseServi])
    REFERENCES [dbo].[CauseServi] ([id_CauseServi])
    GO
     
    ALTER TABLE [dbo].[PickLists] CHECK CONSTRAINT [FK_PickLists_CauseServi]
    GO
     
    ALTER TABLE [dbo].[PickLists]  WITH CHECK ADD  CONSTRAINT [FK_PickLists_LigneProduction] FOREIGN KEY([id_LigneProduction])
    REFERENCES [dbo].[LigneProduction] ([id_LigneProduction])
    GO
     
    ALTER TABLE [dbo].[PickLists] CHECK CONSTRAINT [FK_PickLists_LigneProduction]
    GO
     
    ALTER TABLE [dbo].[PickLists]  WITH CHECK ADD  CONSTRAINT [FK_PickLists_Status] FOREIGN KEY([id_Status])
    REFERENCES [dbo].[Status] ([id_Status])
    GO
     
    ALTER TABLE [dbo].[PickLists] CHECK CONSTRAINT [FK_PickLists_Status]
    GO
     
    ALTER TABLE [dbo].[PickLists] ADD  CONSTRAINT [DF_PickLists_DateCreation]  DEFAULT (getdate()) FOR [DateCreation]
    GO
     
    ALTER TABLE [dbo].[PickLists] ADD  CONSTRAINT [DF_PickLists_DateMAj]  DEFAULT (getdate()) FOR [DateMAj]
    GO
     
    ALTER TABLE [dbo].[PickLists] ADD  CONSTRAINT [DF_PickLists_NbUSServi]  DEFAULT ((0)) FOR [NbUSServi]
    GO
     
    ALTER TABLE [dbo].[PickLists] ADD  CONSTRAINT [DF_PickLists_NbUSRecept]  DEFAULT ((0)) FOR [NbUSRecept]
    GO
     
    ALTER TABLE [dbo].[PickLists] ADD  CONSTRAINT [DF_PickLists_Hostame]  DEFAULT (host_name()) FOR [Hostame]
    GO
    ainsi que la table destination MVtest
    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
    USE [SuiviMatiere]
    GO
     
    /****** Object:  Table [dbo].[MvtTest]    Script Date: 09/16/2014 11:02:02 ******/
    SET ANSI_NULLS ON
    GO
     
    SET QUOTED_IDENTIFIER ON
    GO
     
    CREATE TABLE [dbo].[MvtTest](
    	[id_MvtTest] [int] IDENTITY(1,1) NOT NULL,
    	[NumSerie] [nvarchar](50) NULL,
    	[Type_NumSerie] [nvarchar](50) NULL,
    	[id_Transaction] [int] NULL,
    	[DatePassage] [datetime] NULL,
    	[UF] [nvarchar](50) NULL,
    	[Ligne] [nvarchar](50) NULL,
    	[DateCreation] [datetime] NULL,
    	[DateMaj] [datetime] NULL,
    	[Observation] [nvarchar](250) NULL,
    	[Matricule] [nvarchar](10) NULL
    ) ON [PRIMARY]
     
    GO
     
    ALTER TABLE [dbo].[MvtTest] ADD  CONSTRAINT [DF_MvtTest_DatePassage]  DEFAULT (getdate()) FOR [DatePassage]
    GO
     
    ALTER TABLE [dbo].[MvtTest] ADD  CONSTRAINT [DF_MvtTest_DateCreation]  DEFAULT (getdate()) FOR [DateCreation]
    GO
     
    ALTER TABLE [dbo].[MvtTest] ADD  CONSTRAINT [DF_MvtTest_DateMaj]  DEFAULT (getdate()) FOR [DateMaj]
    GO
    ce qui m’inquiète que ce phénomène est aléatoire et parfoix il est entrain d'insérer des valeur qui sont NOT NULL

    donc comment je peux contrôler que mon déclencheur est entrain d’être exécuter de façon correcte et pourquoi ces valeur null ???

  2. #2
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 146
    Points : 7 388
    Points
    7 388
    Billets dans le blog
    1
    Par défaut
    Tu récupères tes valeurs de la table virtuelle "inserted".
    Hors, dans le cas du DELETE (qui est handler par ton trigger) cette table est vide.

    Ils viennent de là tes NULL.

    Sinon, que se passe-t-il si tu fais :
    - des insertions multiples (insert from select)
    - des mises à jour multiple (update de plusieurs lignes à la fois)

    Car là, tu récupère que la première ligne de inserted à chaque fois...
    On ne jouit bien que de ce qu’on partage.

  3. #3
    Membre régulier
    Homme Profil pro
    consultant BI
    Inscrit en
    Mai 2011
    Messages
    182
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suède

    Informations professionnelles :
    Activité : consultant BI
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2011
    Messages : 182
    Points : 95
    Points
    95
    Par défaut
    Citation Envoyé par StringBuilder Voir le message
    Tu récupères tes valeurs de la table virtuelle "inserted".
    Hors, dans le cas du DELETE (qui est handler par ton trigger) cette table est vide.

    Ils viennent de là tes NULL.

    Sinon, que se passe-t-il si tu fais :
    - des insertions multiples (insert from select)
    - des mises à jour multiple (update de plusieurs lignes à la fois)

    Car là, tu récupère que la première ligne de inserted à chaque fois...
    donc je doit éliminer le mot deleted de mon déclencheur afin de ne plus avoir un valeur nul dans mon table virtuelle inserted

  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 736
    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 736
    Points : 52 448
    Points
    52 448
    Billets dans le blog
    5
    Par défaut
    Au final votre déclencheur devrait ressembler à cela :

    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
    CREATE TRIGGER [dbo].[tg_insertMvtTest]
       ON  [dbo].[PickLists]
       AFTER  INSERT, DELETE, UPDATE
    AS 
    BEGIN
     
    SET NOCOUNT ON;
     
    	INSERT INTO MvtTest (id_Transaction, NumSerie, Type_NumSerie, Ligne )
    	SELECT T.id_Transaction, 
    	       'PICKLIST',
    	       COALESCE(d.Num_PickList, i.Num_PickList),
    	       COALESCE(d.id_LigneProduction, i.id_LigneProduction)
    	FROM Transactions AS T LEFT OUTER JOIN inserted AS i ON T.id_Status = i.id_Status
    	                       LEFT OUTER JOIN deleted  AS d ON T.id_Status = d.id_Status;
     
    END
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  5. #5
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 146
    Points : 7 388
    Points
    7 388
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par joujousagem2006 Voir le message
    donc je doit éliminer le mot deleted de mon déclencheur afin de ne plus avoir un valeur nul dans mon table virtuelle inserted
    Tout dépends de ce que vous voulez stocker dans la table MvtTest.

    Si vous voulez une trace des suppression, alors il faut garder le DELETE. Mais traiter aussi la table virtuelle DELETED.

    Le code de SQLpro devrait vous donner une bonne base pour savoir quoi faire.

    Rappel :

    INSERT => inserted remplie avec les nouvelles lignes / deleted vide
    UPDATE => inserted remplie avec les nouvelles données / deleted remplie avec les anciennes données
    DELETE => inserted vide / deleted remplie avec les donnée supprimées
    On ne jouit bien que de ce qu’on partage.

Discussions similaires

  1. Requête qui demande des valeurs
    Par iks22 dans le forum SQL
    Réponses: 11
    Dernier message: 27/05/2008, 12h51
  2. [MySQL] Insertion des valeurs des checkbox choisies en BDD
    Par jacksummer dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 08/05/2008, 15h45
  3. Réponses: 2
    Dernier message: 25/03/2008, 14h32
  4. insertion des valeurs dans une colonne
    Par freestyler1982 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 24/01/2007, 17h38
  5. [JDBC]Probleme d'insertion des valeurs !!
    Par tarik75 dans le forum JDBC
    Réponses: 6
    Dernier message: 27/07/2005, 13h41

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