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 :

Trigger Avant une insertion


Sujet :

Développement SQL Server

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    161
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 161
    Points : 75
    Points
    75
    Par défaut Trigger Avant une insertion
    Bonjour, j'ai vu qu'il n'y avait pas de trigger before insert.

    Et je n'arrive pas à faire ce que je souhaite.

    Je voudrai avant l'insertion d'une occurrence dans une table de donnée je voudrai modifier la variable de cette occurrence.

    J'ai une table Agent:
    Avec Comme champs :
    ID
    Nom
    J'ai une autre table IMC:
    Avec comme champs:
    Nom
    Description
    L'occurrence ressemble à :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Insert into Agent values ('X','Nom');
    Je voudrais que la commande rajoute la description en plus du nom lors de l'insertion.

    Un trigger du type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Create trigger 
    before insert on Agent
    DECLARE
        desc varchar(150);
    BEGIN
     
    desc := Select description from IMC where nom = old.nom;
    insert into Agent values ('X.old',old.nom + desc);
     
    END
    Merci de votre aide.

  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 768
    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 768
    Points : 52 577
    Points
    52 577
    Billets dans le blog
    5
    Par défaut
    faites un trigger AFTER avec un UPDATE combiné à la pseudo table inserted.

    De plus dans un trigger INSERT il n'y a pas d'image avant des données (old).

    Votre code est donc incompréhensible....

    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
    CREATE TRIGGER E_I_AGENT
    AFTER INSERT 
    ON Agent
     
    INSERT INTO Agent 
    SELECT 'X.old', i.nom + description
    FROM   IMC 
           INNER JOIN inserted AS i
                 ON IMC.nom = I.nom

    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/ * * * * *

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    161
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 161
    Points : 75
    Points
    75
    Par défaut
    Merci de votre réponse,

    Je ne comprend pas complètement votre commande, vous faites un trigger after, mais il n'y a aucune commande update.

    Et si j'effectue votre commande un message d'erreur apparait.

    syntaxe incorrecte vers 'AFTER'
    Merci de votre aide.

  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 768
    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 768
    Points : 52 577
    Points
    52 577
    Billets dans le blog
    5
    Par défaut
    Commencez par respecter les règles du forum en postant le DDL de vos tables. Ainsi qu'un jeu d'essais sous forme INSERT. Sans cela difficile de vous aider.

    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/ * * * * *

  5. #5
    Membre émérite

    Homme Profil pro
    Chargé de Développement et d'Analyse de données
    Inscrit en
    Mars 2010
    Messages
    1 278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé de Développement et d'Analyse de données
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 278
    Points : 2 856
    Points
    2 856
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    faites un trigger AFTER avec un UPDATE combiné à la pseudo table inserted.

    De plus dans un trigger INSERT il n'y a pas d'image avant des données (old).

    Votre code est donc incompréhensible....

    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
    CREATE TRIGGER E_I_AGENT
    AFTER INSERT 
    ON Agent
     
    INSERT INTO Agent 
    SELECT 'X.old', i.nom + description
    FROM   IMC 
           INNER JOIN inserted AS i
                 ON IMC.nom = I.nom
    A +
    Je pense qu'on est bien sur une base ORACLE .
    Il me semble qu'un trigger AFTER avec un UPDATE combiné devrait être
    quelque chose de ce style non ? Corrigé -moi si je trompe.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CREATE TRIGGER E_I_AGENT
    AFTER INSERT 
    ON Agent
    UPDATE Agent 
    SET  nom = nom.old + description
    ....
    A+
    Etienne ZINZINDOHOUE
    Etienne ZINZINDOHOUE
    Billets-Articles

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    161
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 161
    Points : 75
    Points
    75
    Par défaut
    Merci de vos réponse :

    Excuse moi SQLPro , voici donc les DLL

    Table IMC :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[IMC]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    drop table [dbo].[IMC]
    GO
     
    CREATE TABLE [dbo].[IMC] (
    	[AgentName] [varchar] (128) COLLATE French_CI_AS NOT NULL ,
    	[Application] [varchar] (150) COLLATE French_CI_AS NULL 
    ) ON [PRIMARY]
    GO
    Plus 2 inserts :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    INSERT INTO IMC     VALUES     ('RPUOH118', 'CHIMED');
    INSERT INTO IMC     VALUES     ('RPU0S157', 'Contact');
    Table AgentTest :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[AgentTest]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    drop table [dbo].[AgentTest]
    GO
     
    CREATE TABLE [dbo].[AgentTest] (
    	[Id] [int] NOT NULL ,
    	[AgentName] [varchar] (128) COLLATE French_CI_AS NOT NULL 
    ) ON [PRIMARY]
    GO
    Les inserts qui seront fait.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    INSERT INTO AgentTest
                          (Id, AgentName)
    VALUES     (1, 'RPU0S118')

    Je voudrais donc qu'il y est dans la table

    1 | RPUOH118 CHIMED
    Merci

  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 768
    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 768
    Points : 52 577
    Points
    52 577
    Billets dans le blog
    5
    Par défaut
    en espérant que le colonne Id de Agenttest est la clef, voici le trigger :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    CREATE TRIGGER E_I_AGENT
    ON dbo.AgentTest
    AFTER INSERT
    AS
    UPDATE dbo.AgentTest
    SET AgentName = AT.AgentName + ' ' + "Application"
    FROM   dbo.AgentTest AS AT
           INNER JOIN inserted AS i
                 ON AT.Id = i.Id
           INNER JOIN IMC
                 ON AT.AgentName = IMC.AgentName;
    Et le test (faux dans votre exemple) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    INSERT INTO AgentTest (Id, AgentName)
       VALUES             (1, 'RPUOH118');
    Qui donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT * FROM AgentTest
     
    Id          AgentName
    ----------- --------------------
    1           RPUOH118 CHIMED
    Cela dit un tel trigger est inutile et contre performant, car vous pouvez obtenir la même chose sans en utilisant une vue, largement préférable !

    Démo :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    DROP TRIGGER E_I_AGENT;
    GO
     
    DELETE FROM dbo.AgentTest;
    GO
    La vue qui synthétise les données
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CREATE VIEW dbo.V_AgentTest
    AS
    SELECT Id, AT.AgentName, AT.AgentName + ' ' + "Application" AS AgentNameApplication
    FROM   dbo.AgentTest AS AT
           INNER JOIN IMC
                 ON AT.AgentName = IMC.AgentName;
    Insertion dans la vue (vous pouvez bien entendu faire l'insertion dans la table cela ne change rien) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    INSERT INTO dbo.V_AgentTest (Id, AgentName)
    VALUES (1, 'RPUOH118');
    Résultat :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT * 
    FROM dbo.V_AgentTest,
     
    Id          AgentName         AgentNameApplication
    ----------- ----------------- -------------------------
    1           RPUOH118          RPUOH118 CHIMED
    En principe on ne devrait jamais développer d'application directement avec des requêtes sur les tables, mais uniquement sur les vues (modele externe de données => IHM)

    NOTA Le nom de colonne Application étant un mot réservé de SQL Server, vous allez au devant d'ennuis? Changez ce nom par un autre et évitez tout nom de colonne, table, vue procédure ou fonction faisant partie de la liste des mots clefs de SQL et de SQL Server :
    http://sqlpro.developpez.com/cours/motsreserves/

    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/ * * * * *

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    161
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 161
    Points : 75
    Points
    75
    Par défaut
    En principe on ne devrait jamais développer d'application directement avec des requêtes sur les tables, mais uniquement sur les vues (modele externe de données => IHM)
    Oui je sais et je n'aime absolument par faire sa mais je suis dans une entreprise qui on programmé des logiciels qui ne peuvent pour l'instant être modifier et il utilise directement les tables.

    Encore beaucoup de boulot pour avoir un code clean en entreprise.

    NOTA Le nom de colonne Application étant un mot réservé de SQL Server, vous allez au devant d'ennuis? Changez ce nom par un autre et évitez tout nom de colonne, table, vue procédure ou fonction faisant partie de la liste des mots clefs de SQL et de SQL Server :
    Je n'ai pas trouvé le mot qui été déjà réservé, mais j'ai suivi votre conseil et je l'ai changé.

    Merci encore de votre aide et bonne journée.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 21/11/2013, 14h20
  2. "Trigger" sur une insertion : référence au nouveau tuple
    Par samworld dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 26/06/2007, 22h27
  3. Annuler une insertion dans un Trigger
    Par dreamanoir dans le forum Oracle
    Réponses: 2
    Dernier message: 10/01/2005, 13h04
  4. [ trigger ] avant une suppression
    Par jaimepasteevy dans le forum Requêtes
    Réponses: 1
    Dernier message: 16/12/2003, 16h21
  5. [ trigger ] avant une suppression
    Par jaimepasteevy dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 16/12/2003, 16h21

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