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 :

Insérer dans vue avec un déclencheur


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2011
    Messages
    255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2011
    Messages : 255
    Par défaut Insérer dans vue avec un déclencheur
    Bonjour a tous,

    J'ai créer une vue qui porte sur plusieurs table :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT     dbo.produit.idprod, dbo.produit.nom, dbo.produit.prix, dbo.produit.description, dbo.produitfourni.prixachat, dbo.produitfourni.idfrs
    FROM         dbo.produit INNER JOIN
                          dbo.produitfourni ON dbo.produit.idprod = dbo.produitfourni.id
    Je voudrai maintenant créer un Trigger me permettant d’insérer des données dans cette vue et bien sur les données seront automatiquement insérer dans les deux tables "réels".

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    CREATE TRIGGER InsertProduitFourni ON V_produitfourni
    INSTEAD OF INSERT 
    AS
    BEGIN
    INSERT INTO V_produitfourni SELECT  nom, prix,description, prixachat,idfrs
    FROM V_produitfourni
    END
    GO
    Lorsque j’exécute la requête j’obtiens cette erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Msg*4405, Niveau*16, État*1, Procédure*InsertProduitFourni, Ligne*5
    La vue ou la fonction 'V_produitfourni' ne peut pas être mise à jour car la modification porte sur plusieurs tables de base.
    Je comprend pas. Merci pour votre aide.

  2. #2
    Expert confirmé
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Par défaut
    Il faut mettre à jour les tables sous jascentes de ta vue. En gros :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    CREATE TRIGGER InsertProduitFourni ON V_produitfourni
    INSTEAD OF INSERT 
    AS
    BEGIN
    INSERT INTO dbo.produit (...) VALUES (...)
    INSERT INTO dbo.produitfourni (...) VALUES (...)
    END
    GO
    Il faudrait en connaitre un peu plus sur le schéma de tes tables pour compléter ce code.

    ++

  3. #3
    Membre très actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2011
    Messages
    255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2011
    Messages : 255
    Par défaut
    Bonjour mikedavem et merci de votre réponse.

    J'ai donc modifier mon 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
    24
    25
    26
    ALTER TRIGGER [dbo].[InsertProduitFourni] ON [dbo].[V_produitfourni]
    INSTEAD OF INSERT 
    AS
    	BEGIN TRY	
     
    				--	INSERTION DANS LA TABLE PRODUIT
    				BEGIN TRY
    					INSERT INTO produit SELECT  p.nom, p.prix,p.description
    					FROM inserted p
    				END TRY
    				BEGIN CATCH
    					PRINT ('Insertion impossible dans la table produit');
    				END CATCH
    				-- INSERTION DANS LA TABLE PRODUIT FOURNI
    				BEGIN TRY
    					INSERT INTO produitfourni SELECT pf.idfrs,pf.prixachat
    					FROM inserted pf
    				END TRY
    				BEGIN CATCH
    					PRINT ('Insertion impossible dans la table produitFourni');
    				END CATCH
     
    	END TRY
    	BEGIN CATCH
    	PRINT ('Erreur');
    	END CATCH
    Je teste donc mon déclencheur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO V_produitfourni(nom,prix,description,idfrs,prixachat) VALUES ('testNom',50,'Desc',1,20)
    Voici l'erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    (1*ligne(s) affectée(s))
     
    (0*ligne(s) affectée(s))
    Insertion impossible dans la table produitFourni
    Msg*3616, Niveau*16, État*1, Ligne*1
    Une erreur est survenue lors de l'exécution du déclencheur. Le lot a été abandonné et la transaction utilisateur éventuelle a été restaurée.
    Voici la création de mes table et leurs contraintes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    /* -----------------------------------------------------------------------------
          table : produitfourni
    ----------------------------------------------------------------------------- */
     
    create table produitfourni
      (
         idprod int  not null  IDENTITY (1,1),
         idfrs int  not null  ,
         prixachat decimal(10,2)  null  
         ,
         constraint pk_produitfourni primary key (idprod)
      ) 
    go
    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
     
    /* -----------------------------------------------------------------------------
          table : produit
    ----------------------------------------------------------------------------- */
     
    create table produit
      (
         idprod int  not null  IDENTITY (1,1),
         nom varchar(128)  null  ,
         prix decimal(10,2)  null  ,
         description varchar(255)  null  
         ,
         constraint pk_produit primary key (idprod)
      ) 
    go
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    /* -----------------------------------------------------------------------------
          table : fourniseur
    ----------------------------------------------------------------------------- */
     
    create table fourniseur
      (
         idfrs int  not null  IDENTITY (1,1),
         nom varchar(128)  null  ,
         adresse varchar(255)  null  
         ,
         constraint pk_fourniseur primary key (idfrs)
      ) 
    go
    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
     
     
    /* -----------------------------------------------------------------------------
          references sur les tables
    ----------------------------------------------------------------------------- */
     
    alter table produitfourni 
         add constraint fk_produitfourni_fourniseur foreign key (idfrs) 
                   references fourniseur (idfrs)
    go
     
     
     
     
    alter table produitfourni 
         add constraint fk_produitfourni_produit foreign key (idprod) 
                   references produit (idprod)
    go
    Merci par avance pour votre aide.

    [Edit] J'ai enlevé dans le déclencheur tout les bloc Try Catch et voici l'erreur qui me génère après le test d'insertion :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    (1*ligne(s) affectée(s))
    Msg*547, Niveau*16, État*0, Procédure*InsertProduitFourni, Ligne*19
    L'instruction INSERT est en conflit avec la contrainte FOREIGN KEY "fk_produitfourni_produit". Le conflit s'est produit dans la base de données "gestiontraiteur", table "dbo.produit", column 'idprod'.
    L'instruction a été arrêtée.
    [/Edit]

  4. #4
    Rédacteur
    Avatar de WOLO Laurent
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Mars 2003
    Messages
    2 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Congo-Brazzaville

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 2 741
    Par défaut
    Conflit d'integrite referentielle !
    Tu dis ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ALTER TABLE produitfourni 
         ADD constraint fk_produitfourni_produit FOREIGN KEY (idprod) 
                   REFERENCES produit (idprod)
    et tu te contredis ici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    INSERT INTO produitfourni 
    SELECT pf.idfrs,pf.prixachat
    FROM inserted pf
    A faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    CREATE TABLE produitfourni
      (
         idprod int  NOT NULL ,--Pas besoin de l'identity ici
         idfrs int  NOT NULL  ,
         prixachat decimal(10,2)  NULL  
         ,
         constraint pk_produitfourni PRIMARY KEY (idprod)
      )
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    INSERT INTO produitfourni(idprod,idfrs,prixachat)
    SELECT  idprod,pf.idfrs,pf.prixachat
    FROM inserted pf
    Et le tour est joue.


    NB: Desole pour les accents, mon clavier n'est pas approprie.

    Découvrez la FAQ de MS SQL Server.
    La chance accorde ses faveurs aux esprits avertis !

  5. #5
    Membre très actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2011
    Messages
    255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2011
    Messages : 255
    Par défaut
    Bonjour WOLO Laurent et merci de votre réponse.

    Mais j'ai toujours la même erreur.

    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
    ALTER TRIGGER [dbo].[InsertProduitFourni] ON [dbo].[V_produitfourni]
    INSTEAD OF INSERT 
    AS
    BEGIN 	
     
    	INSERT INTO produit SELECT  p.nom, p.prix,p.description
    	FROM inserted p
     
    	INSERT INTO produitfourni(idprod,idfrs,prixachat) SELECT idprod,pf.idfrs,pf.prixachat
    	FROM inserted pf
     
    END
    Voici mon test :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO V_produitfourni(nom,prix,description,idprod,idfrs,prixachat) VALUES ('nom',20,'desc',1,1,50)
    Et l'erreur : la même que toute a l'heure :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    (1*ligne(s) affectée(s))
    Msg*547, Niveau*16, État*0, Procédure*InsertProduitFourni, Ligne*19
    L'instruction INSERT est en conflit avec la contrainte FOREIGN KEY "fk_produitfourni_produit". Le conflit s'est produit dans la base de données "gestiontraiteur", table "dbo.produit", column 'idprod'.
    L'instruction a été arrêtée.

  6. #6
    Rédacteur
    Avatar de WOLO Laurent
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Mars 2003
    Messages
    2 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Congo-Brazzaville

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 2 741
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    ALTER TRIGGER [dbo].[InsertProduitFourni] ON [dbo].[V_produitfourni]
    INSTEAD OF INSERT 
    AS
    BEGIN 	
     
    	INSERT INTO produit SELECT  p.nom, p.prix,p.description
    	FROM inserted p
     
    	INSERT INTO produitfourni(idprod,idfrs,prixachat) 
                 SELECT SCOPE_IDENTITY(),pf.idfrs,pf.prixachat
    	FROM inserted pf
     
    END

    Découvrez la FAQ de MS SQL Server.
    La chance accorde ses faveurs aux esprits avertis !

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

Discussions similaires

  1. [XL-2010] insérer dans combobox avec textboxvalue
    Par fidecourt dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 31/12/2010, 14h26
  2. Lire excel et les insérer dans access avec vbscript
    Par regisyves dans le forum VBScript
    Réponses: 3
    Dernier message: 19/06/2010, 07h27
  3. Réponses: 1
    Dernier message: 31/01/2007, 11h59
  4. Incapable d'insérer dans MySQL avec JDBC
    Par guillo14 dans le forum Requêtes
    Réponses: 4
    Dernier message: 11/06/2006, 01h26
  5. Insérer dans une Vue ordonnée
    Par biroule dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 27/09/2004, 15h27

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