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 (trigger) insertion avec l'héritage


Sujet :

Développement SQL Server

  1. #1
    Futur Membre du Club
    Inscrit en
    Août 2009
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 5
    Par défaut Déclencheur (trigger) insertion avec l'héritage
    Bonjour,

    J'ai trouvé des difficultés pour créer un trigger d'insertion...

    J'ai fait l'héritage dans la conception de ma base de données.
    Soit M la table mère, A et B deux tables filles de M (Héritage avec exclusion mutuelle).

    Si je veux insérer un enregistrement dans A ou B, alors une exception se déclenche pour indiquer que la clé ne se trouve pas dans M. Donc j'ai décidé de créer un déclencheur (FOR INSERT) sur chaque table fille qui permet d'insérer d'abord la clé dans M avant de l'insérer dans la table fille !

    J'ai fait ce décelencheur (sachant que je ne maitrise pas le développement des déclencheurs !!), mais ça marche pas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    CREATE TRIGGER [INSERTION_HERITAGE] ON [dbo].[A] 
    FOR INSERT
    AS
    BEGIN
     
    DECLARE @ID NUMERIC
     
    SELECT @ID=ID FROM INSERTED
     
    INSERT INTO M (ID) VALUES ( @ID)
     
    END

  2. #2
    Membre expérimenté
    Inscrit en
    Février 2009
    Messages
    224
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 224
    Par défaut
    bonjour,
    qu'entendez vous par héritage ??? car cette notion n'existe pas dans les bases de données relationnelles.
    Si je veux insérer un enregistrement dans A ou B, alors une exception se déclenche pour indiquer que la clé ne se trouve pas dans M. Donc j'ai décidé de créer un déclencheur (FOR INSERT) sur chaque table fille qui permet d'insérer d'abord la clé dans M avant de l'insérer dans la table fille !
    Je pense qu'ici vous devez passer par une contrainte d'intégrité référentielle avec par exemple la structure de table suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    create table M(
    idM int constraint pk_m primary key);
    create table A(
    idA int constraint pk_a primary key,
    idM int constraint rf_a_m references M(idM));
    create table B(
    idB int constraint pk_b primary key,
    idM int constraint rf_b_m references M(idM));

  3. #3
    Futur Membre du Club
    Inscrit en
    Août 2009
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 5
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    CREATE TABLE M(
    idM int constraint pk_m PRIMARY KEY);
    CREATE TABLE A(
    idA int constraint pk_a PRIMARY KEY,
    idM int constraint rf_a_m REFERENCES M(idM));
    CREATE TABLE B(
    idB int constraint pk_b PRIMARY KEY,
    idM int constraint rf_b_m REFERENCES M(idM));
    dans ce cas, comment créer le déclencheur (sur A ou B) qui permet d'insérer idM sur M, avant de l'insérer sur A (ou B) ?

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 26
    Par défaut
    Bonjour,


    ton trigger semble correct (même s'il peut être simplifié par un INSERT...SELECT)

    Le code suivant fonctionne :

    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
    create table A(ID numeric)
    create table M(ID numeric)
    GO
     
    CREATE TRIGGER [INSERTION_HERITAGE] ON [dbo].[A] 
    FOR INSERT
    AS
    BEGIN
     
    DECLARE @ID NUMERIC
     
    SELECT @ID=ID FROM INSERTED
     
    INSERT INTO M (ID) VALUES ( @ID)
     
    END
     
    GO
     
    insert into A values (123)
     
     
    select * from A
    select * from M
    En mettant des clé primaires, il te faudra faire l'INSERT dans M avant l'INSERT dans A.

    Tu risques par contre d'avoir des soucis au niveau de ta clé primaire dans M, car il faut que les clés dans A et B soient distinctes ...

    Il me parait plus judicieux :
    - de mettre une contrainte d'intégrité entre M et A et B
    - de commencer par l'insert dans M, et de recopier l'ID de M dans A ou B

    ou sinon de gérer dans M un code identifiant la table fille + l'ID de la table fille, et d'avoir une PK de type IDENTITY.

    Cordialement

  5. #5
    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 : 44
    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
    Par défaut
    Bonjour,

    Je vous conseille de regarder cet article de SQLPro sur la modélisation par héritage, notamment le paragraphe intitulé "5. Héritage avec exclusion mutuelle".

    Les triggers qui ont été donnés en exemple sont faux parce qu'ils ne sont pas ensemblistes

    @++

  6. #6
    Membre éprouvé

    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 448
    Par défaut
    S'il te faut créer l"entrée dans la table M avant que celle dans la table A, il te faut utiliser un trigger INSTEAD OF, plutôt qu'un FOR (équivalent de AFTER) qui aurait lieu trop tard.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    CREATE TRIGGER [INSERTION_HERITAGE] ON [dbo].[A] 
    INSTEAD OF ....
    BEGIN
    *insertion dans M*
     
    *insertion dans A*
    END
    GO

  7. #7
    Futur Membre du Club
    Inscrit en
    Août 2009
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 5
    Par défaut
    Bonjour,

    Sergejack:
    S'il te faut créer l"entrée dans la table M avant que celle dans la table A, il te faut utiliser un trigger INSTEAD OF, plutôt qu'un FOR (équivalent de AFTER) qui aurait lieu trop tard.
    Je ne pense pas. J'ai trouvé sur Help Transact-SQL:
    Les déclencheurs INSTEAD OF sont exécutés en lieu et place de l'action de déclenchement (INSERT, UPDATE, DELETE par exemple).
    elsuket:
    Je vous conseille de regarder cet article de SQLPro sur la modélisation par héritage, notamment le paragraphe intitulé "5. Héritage avec exclusion mutuelle".
    Les triggers de cet article ne traitent que le contrôle d'insertion, et ne donnent aucune solution pour mon problème concernant l'insertion dans la table mere avant l'insertion dans la table fille.

    Merci.

  8. #8
    Membre éprouvé

    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 448
    Par défaut
    Tu ne penses pas mais j'insiste.

  9. #9
    Futur Membre du Club
    Inscrit en
    Août 2009
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 5
    Par défaut
    INSTEAD OF ne permet pas d'exécuter l'insertion déclenchant ce trigger, mais il execute, à la place, les instructions de trigger..

    Je l'ai testé !! je suis sûr !!

  10. #10
    Membre éprouvé

    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 448
    Par défaut
    Tu peux évidemment faire les insertions dans la table concernée par le trigger instead of que tu fais.

    Faire l'insertion dans M puis dans A grâce à un trigger à l'insertion sur A, ne peux se faire qu'avec un trigger INSTEAD OF.

    Sois-en sûr.

  11. #11
    Futur Membre du Club
    Inscrit en
    Août 2009
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 5
    Par défaut
    Maintenant, je suis d'accord avec vous Sergejack, je dois reécrire l'instruction de l'insertion sur A.
    Dans ma base de données les tables filles A et B possedent plusieurs champs, et je veux les implemnter par des valeurs saisis par l'utilisateur (dans un formulaire de l'application web), donc je dois écrire l'instruction de l'insertion sur A avec des parametres, mais le trigger n'accepte pas des parametres.

Discussions similaires

  1. TRIGGER insert AVEC GESTION ERREURS
    Par pepitoluna dans le forum PL/SQL
    Réponses: 2
    Dernier message: 16/01/2011, 23h17
  2. [TRIGGER] insertion avec clef auto-increment dupliquer
    Par TheBlackReverand dans le forum SQL Procédural
    Réponses: 10
    Dernier message: 27/03/2009, 13h06
  3. insertion avec trigger!
    Par JauB dans le forum Développement
    Réponses: 3
    Dernier message: 14/06/2006, 11h43
  4. Insert avec select sur table avec Trigger d'insertion
    Par bran_noz dans le forum Développement
    Réponses: 5
    Dernier message: 23/12/2005, 15h38
  5. Créer un trigger "before insert" avec SQL Server
    Par bubi dans le forum Développement
    Réponses: 2
    Dernier message: 14/11/2005, 11h12

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