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 d'insertion après une requête INSERT


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Développeur Web
    Inscrit en
    Septembre 2007
    Messages
    173
    Détails du profil
    Informations personnelles :
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Septembre 2007
    Messages : 173
    Par défaut TRIGGER d'insertion après une requête INSERT
    Bonjour à tous,
    Je n'avais jamais fait de Trigger auparavant et là je dois vous avouer que je suis perdu.

    J'ai une table articles et une table url, comme vous l'aurez sûrement compris ces tables sont liées sur le principe q'un article peut avoir plusieurs url.

    Voici la structure de la table articles:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    CREATE TABLE articles (
      article_id INT IDENTITY(1,1) NOT NULL,
      id_produits_ INT NOT NULL,
      id_acces_ INT NOT NULL,
      id_titre_traduction_ INT NULL,
      id_commentaire_traduction_ INT NULL,
      titre VARCHAR(250) NULL,
      commentaire VARCHAR(8000) NULL,
      date_publication DATETIME NULL,
      date_maj DATETIME NULL,
      PRIMARY KEY(article_id),
    );
    Voici la structure de la table url:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    CREATE TABLE url (
      id_url INT IDENTITY(1,1) NOT NULL,
      article_id_ INT NOT NULL,
      titre_url VARCHAR(200) NULL,
      lien_url VARCHAR(200) NULL,
      PRIMARY KEY(id_url),
    );
    Je précise que j'ai créer une contrainte de clé étrangère à part sur articles.article_id=url.article_id_

    Ce que je fais et souhaite faire pour le moment:
    • A partir d'un formulaire je récupère les données pour les 2 tables.
    • Je fais dans un premier temps ma requête d'insertion dans la table article
    • A l'aide du Trigger je génère une seconde requête d'insertion pour la table url en récupérant l'id de l'article créé précédemment.


    J'espère avoir été assez claire.
    Merci d'avance pour votre aide.

  2. #2
    Membre confirmé
    Profil pro
    Développeur Web
    Inscrit en
    Septembre 2007
    Messages
    173
    Détails du profil
    Informations personnelles :
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Septembre 2007
    Messages : 173
    Par défaut
    Je suis en train de faire queque chose comme ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    CREATE TRIGGER article_url ON [articles] AFTER INSERT
    AS
    SET NOCOUNT OFF 
     
    SELECT MAX(article_id) FROM articles AS lastID
     
    INSERT INTO [url] ([titre_id_],[titre_url],[lien_url]) VALUES (lastID,titre,lien)
    Dite ce vous en pensé.

  3. #3
    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 pense avoir compris ce que vous voulez faire mais pas la façon dont vous l'avez implémenté.

    Vous pouvez par exemple écrire :

    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
    CREATE TRIGGER TR_A_I_article_url
    	ON dbo.articles
    AFTER INSERT
    AS
    BEGIN
    	SET NOCOUNT ON
     
    	INSERT INTO dbo.url
    	(
    		article_id_,
    		titre_url,
    		lien_url
    	)
    	SELECT article_id
    			titre,
    			'http://monSite/' + titre + '.JPG'
    	FROM INSERTED
    END
    Dans un trigger AFTER INSERT, vous avez accès à la table virtuelle INSERTED, qui vous fournit les données que vous venez d'insérer dans la table.
    INSERTED a strictement la même structure que la table cible de l'insertion.

    Dans votre cas vous devez vous servir des données insérées dans article pour insérer dans url, c'est bien ça ?

    Si vous spécifiez SET NOCOUNT OFF, vous allez retourner à l'application cliente le nombre de ligne affectées par le trigger.
    Avec SET NOCOUNT ON, c'est l'inverse

    @++

  4. #4
    Membre confirmé
    Profil pro
    Développeur Web
    Inscrit en
    Septembre 2007
    Messages
    173
    Détails du profil
    Informations personnelles :
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Septembre 2007
    Messages : 173
    Par défaut
    Merci elsuket pour la qualité de ta réponse, tu a compris exactement ce que je voulais faire.
    Mais j'ai d'autres questions qui pourra te semblé un peu bette.
    Où dois-je utiliser ce code?
    A la suite de chaque requête, ce qui je crois est la solution?
    ou
    dois-je exécuter ce code une seule fois dans l'interface de gestion de ma Base de données?

    Peut-tu m'expliquer:
    SELECT article_id
    titre,
    'http://monSite/' + titre + '.JPG'
    FROM INSERTED
    J'ai compris que cette requête récupère les données de la précédente requete.
    Mais dans mon cas je n'ai besoin que de l'id. Le titre et le lien je les est déjà à partir de mon formulaire.

    Merci encore

  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
    Si tu as déjà tout dans ton formulaire, alors n'utilise pas de trigger, ils sont gourmands en ressources.

    Utilises plutôt une procédure stockée à laquelle tu passes tous les paramètres nécessaires pour ajouter un article proprement dans les deux tables.
    Cette procédure stockée comportera donc deux instructions INSERT, la première dans articles, la seconde dans url.

    @++

  6. #6
    Membre confirmé
    Profil pro
    Développeur Web
    Inscrit en
    Septembre 2007
    Messages
    173
    Détails du profil
    Informations personnelles :
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Septembre 2007
    Messages : 173
    Par défaut
    J'ai pensé à cette solution, mais le fait qu'il y est une contrainte de clé étrangère ne va t-il pas posé problème?
    Peut-être pas si je fais ma requête dans une transaction.
    Et faudrait-il encore que je puisse récupérer l'id du dernier article créé dans le cadre de cette même transaction.

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

Discussions similaires

  1. Réponses: 12
    Dernier message: 29/11/2011, 16h06
  2. Récupérer l'id après une requête INSERT
    Par arngrimur dans le forum C#
    Réponses: 6
    Dernier message: 27/09/2011, 09h12
  3. [VBA] difficultés avec une requête INSERT
    Par elias dans le forum Access
    Réponses: 7
    Dernier message: 06/09/2005, 14h53
  4. Réponses: 4
    Dernier message: 05/04/2005, 18h28
  5. Problème sur une requête INSERT
    Par Marion dans le forum Langage SQL
    Réponses: 3
    Dernier message: 17/06/2003, 08h45

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