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 :

Probleme de trigger instead of


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1
    Par défaut Probleme de trigger instead of
    Bonsoir à tous,

    Je suis à la recherche d'un exemple concernant les relations d'héritage. Je suis tomber sur le petit guide de Transact SQL (v2000) de SQLpro (super) J'ai donc essayé de mettre en oeuvre l'exemple présenté (septieme exemple).

    J ai donc créer :
    - Les tables suivantes :
    <B>create table PERSONNE_PRS (
    PRS_ID int IDENTITY NOT NULL PRIMARY KEY,
    PRS_NOM char(32) NOT NULL,
    PRS_PRENOM VARCHAR(16))

    create table EMPLOYES_EMP (
    PRS_ID int NOT NULL PRIMARY KEY REFERENCES PERSONNE_PRS(PRS_ID),
    EMP_MAT VARCHAR(8))</b>

    -La vue suivante:
    <b>CREATE VIEW V_EMP
    AS
    SELECT P.PRS_ID,P.PRS_NOM,P.PRS_PRENOM,E.EMP_MAT
    FROM PERSONNE_PRS P INNER JOIN EMPLOYES_EMP E
    ON P.PRS_ID=E.PRS_ID</b>

    -Et le trigger
    <b>CREATE TRIGGER TGR_INS_EMP
    ON V_EMP
    INSTEAD OF INSERT
    AS
    BEGIN
    INSERT INTO PERSONNE_PRS (PRS_NOM,PRS_PRENOM)
    SELECT PRS_NOM,PRS_PRENOM FROM INSERTED

    INSERT INTO EMPLOYES_EMP (PRS_ID,EMP_MAT)
    SELECT @@IDENTITY,EMP_MAT FROM INSERTED
    END</b>

    Seulement lorsque je remplis ma vue, j ai le droit à un message d'erreur :
    "Impossible d'inserer la valeur null dans la colonne 'PRS_ID' de la table 'EMPLOYES_EMP' cette colonne n'accepte pas les valeurs nulles. INSERT à échoué".

    Si je comprends bien, @@IDENTITY vaut null ici.
    Comment me sortir de cette histore ?

    Merci d'avance !

    A +

  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 997
    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 997
    Billets dans le blog
    6
    Par défaut
    Deux erreurs :
    1) il faut passer un ID (de n'importe quelle valeur) pour l'insertion, car c'est une colonne obligatoire)
    2) vous supposez dans votre trigger qu'il n'y aura jamais que des insertions monoligne. Ce qui est faux. De ce fait il faut utiliser un curseur dans le trigger.

    Exemple :

    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
    CREATE DATABASE DB_TEST_HERITAGE
    GO
     
    USE  DB_TEST_HERITAGE
    GO
     
    create table PERSONNE_PRS 
    (
    PRS_ID int IDENTITY NOT NULL PRIMARY KEY,
    PRS_NOM char(32) NOT NULL,
    PRS_PRENOM VARCHAR(16)
    )
    GO
     
    create table EMPLOYES_EMP 
    (
    PRS_ID int NOT NULL PRIMARY KEY REFERENCES PERSONNE_PRS(PRS_ID),
    EMP_MAT VARCHAR(8)
    )
    GO
     
    --La vue suivante:
    CREATE VIEW V_EMP
    AS
    SELECT P.PRS_ID, P.PRS_NOM, P.PRS_PRENOM, E.EMP_MAT
    FROM   PERSONNE_PRS P 
           INNER JOIN EMPLOYES_EMP E
                 ON P.PRS_ID=E.PRS_ID
    GO
     
    --Et le trigger
    CREATE TRIGGER TGR_INS_EMP
    ON V_EMP
    INSTEAD OF INSERT
    AS
    BEGIN
     
    DECLARE @PRS_NOM char(32), @PRS_PRENOM VARCHAR(16), 
            @EMP_MAT VARCHAR(8), @NEWID INT
     
    DECLARE C INSENSITIVE CURSOR 
    FOR    
       SELECT PRS_NOM, PRS_PRENOM, EMP_MAT
       FROM   inserted
    FOR READ ONLY
     
    OPEN C
     
    FETCH C INTO @PRS_NOM, @PRS_PRENOM, @EMP_MAT
     
    WHILE @@FETCH_STATUS = 0
    BEGIN
     
       INSERT INTO dbo.PERSONNE_PRS (PRS_NOM,PRS_PRENOM)
       VALUES (@PRS_NOM, @PRS_PRENOM);
     
       SET @NEWID = SCOPE_IDENTITY();
     
       INSERT INTO dbo.EMPLOYES_EMP (PRS_ID, EMP_MAT)
       VALUES (@NEWID, @EMP_MAT);
     
       FETCH C INTO @PRS_NOM, @PRS_PRENOM, @EMP_MAT
     
    END
     
    CLOSE C;
     
    DEALLOCATE C;
     
    END
    GO
     
    -- test :
     
    INSERT INTO V_EMP
    SELECT 0, 'DUPONT', 'Claude', '0987'
    UNION ALL
    SELECT 0, 'DUVAL', 'Pierre', '1234'
    UNION ALL
    SELECT 0, 'DUPOND', 'Marcel', '007'
     
     
    SELECT * FROM V_EMP
     
    PRS_ID      PRS_NOM                          PRS_PRENOM       EMP_MAT
    ----------- -------------------------------- ---------------- --------
    1           DUPONT                           Claude           0987
    2           DUVAL                            Pierre           1234
    3           DUPOND                           Marcel           007
    A +
    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/ * * * * *

Discussions similaires

  1. Probleme de trigger
    Par luciemacherie dans le forum Oracle
    Réponses: 4
    Dernier message: 16/01/2006, 17h21
  2. Problem Trigger instead of
    Par bubi dans le forum Développement
    Réponses: 1
    Dernier message: 01/12/2005, 23h31
  3. [JDBC]Probleme avec trigger Oracle
    Par aurel89 dans le forum JDBC
    Réponses: 2
    Dernier message: 02/08/2005, 11h53
  4. [Trigger] Trigger instead of , after ?
    Par |DUCATI| DesMo dans le forum Développement
    Réponses: 5
    Dernier message: 05/10/2004, 10h02
  5. [TADOTable] reconnaitre le trigger INSTEAD OF d'une vue...
    Par littledoudou dans le forum C++Builder
    Réponses: 2
    Dernier message: 15/12/2003, 12h39

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