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

Langage SQL Discussion :

Création Trigger sur INSERTION


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 25
    Par défaut Création Trigger sur INSERTION
    Bonjour,

    J'essaie de poser mon problème, relativement simple pour les néophytes !

    J'ai une table SQL :

    Table1 {
    Id int primary key auto increment,
    Nom varchar (15),
    Pren varchar (15)}

    Je souhaiterai créer un Trigger, qui se déclencherait sur l'instruction INSERT,

    Ce Trigger parcourra tous les champs id de ma table 1, et choisira un id qui par ordre croissant n'a pas de valeur, (celà de façon à ce qu'il n'y ait pas de "trous" dans l'énumération des id, si je viens à supprimer des enregistrements, comme l'id est en auto-increment)

    exemple :

    1, nom1, pren1
    3, nom3, pren3

    Le trigger choisira l'id 2 qui n'est pas écrit...

    Mon début de trigger :

    CREATE TRIGGER tr_insert_id
    BEFORE INSERT OF id
    ON table 1

    ....
    FOR EACH ROW
    BEGIN
    ...
    END


    Des idées ?

    Merci par avance

  2. #2
    Membre chevronné Avatar de elbj
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2004
    Messages
    371
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Services à domicile

    Informations forums :
    Inscription : Novembre 2004
    Messages : 371
    Par défaut
    Bonjour

    J'essaie de poser mon problème, relativement simple pour les néophytes !


    Il y a certainement une excellente raison pour laquelle vous ne souhaitez pas avoir de rupture dans la séquence des identifiants. Cela dit pourriez vous nous expliquer celle-ci ? De plus, sur quel SGBD travaillez vous ?

    Cordialement

  3. #3
    Membre éclairé Avatar de Monstros Velu
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2003
    Messages
    619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 619
    Par défaut
    Citation Envoyé par tibblou Voir le message
    Bonjour,
    Ce Trigger parcourra tous les champs id de ma table 1, et choisira un id qui par ordre croissant n'a pas de valeur, (celà de façon à ce qu'il n'y ait pas de "trous" dans l'énumération des id, si je viens à supprimer des enregistrements, comme l'id est en auto-increment)
    Je rajoute à la question Elbj que parcourir tous les champs, c'est une mauvaise idée : Une base de donnée, c'est ensembliste, on évite de "parcourir" ^^

    Celà étant, il y a un excellent article de SQLPro quelque part sur le site qui parle des identifiant, je pense que tu devrais le lire, Tibblou, tu comprendrais pourquoi Elbj te pose cette question ;o)

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 25
    Par défaut
    Bonsoir à tous,
    Merci pour ces réponses, je travaille sous SQL 2005 ^^
    La raison pour laquelle je souhaite par une procédure stockée, laisser une suite "logique" à mes identifiants, est je dirai purement esthétique, pour que quand dans une requête j'affiche mes différents champs, il n'y ait pas de "marge" entre eux... (je sais ça peut paraître bête je pensais juste par cela, m'exercer sur les procédures stockées, en vue d'un petit projet que j'ai à présenter au BTS)

    Quand à ta remarque très pertinente, Monstros Velu, je pense que tu as raison laissons les spécifités au langage.
    Je trouverai pour m'exercer une autre procédure stockée qui aura un rôle plus utile...
    En tout cas merci bien à tous deux.

  5. #5
    Membre Expert Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Par défaut
    une requete dans le style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    SELECT
      MIN (a.id)+1 
    FROM
        MaTable a
    WHERE
       NOT EXISTS (
                     SELECT 
                         1 
                     FROM 
                          MaTable b 
                     WHERE
                         a.id+1=b.id)
    peut vous aider


    Bon courage

  6. #6
    Membre éclairé Avatar de Monstros Velu
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2003
    Messages
    619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 619
    Par défaut
    Alors on peut t'expliquer brièvement pourquoi ce n'est pas une bonne idée. Par un exemple.

    Tu entres dans ta base 5 lignes, tu fais une sauvegarde, tu en effaces 2, tu recrées des lignes avec les même ID et tu recupères les lignes de ton sauvegarde... Ha non, pas de bol, les numéros ont été réutilisés.

    Les SGBD, ce n'est pas fait pour l'esthétique ^^ S'il y a des trous, c'est parce qu'il y a eu effacement. Si tu veux vraiment une colonne sans trou, ne la met pas en identifiant.

    Voilà, l'explication, c'était pour aiguiser ta curiosité; Comme dit précédement, je te propose la lecture de l'article de SqlPro à ce sujet : http://sqlpro.developpez.com/cours/clefs/
    Et j'ajoute qu'il y a des chances que dans ton cas, la méthode intégrée à ton SGBD soit suffisante (et plus simple à implémenter ! 8o) )

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 25
    Par défaut
    Merci bien !
    Je vais plus me pencher sur un Trigger qui fasse un contrôle de saisie au niveau d'un champs !

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

Discussions similaires

  1. [2008] Création déclencheur sur insertion
    Par hammouda311283 dans le forum Développement
    Réponses: 13
    Dernier message: 23/09/2014, 10h24
  2. BULK INSERT et trigger sur INSERT
    Par fufurax dans le forum Développement
    Réponses: 7
    Dernier message: 12/03/2010, 16h55
  3. Triggers sur insertion avec SQL Server 2005
    Par Naail dans le forum Développement
    Réponses: 14
    Dernier message: 01/07/2009, 15h23
  4. TRIGGER sur INSERT
    Par Jean_Benoit dans le forum Forms
    Réponses: 7
    Dernier message: 22/11/2006, 13h03
  5. 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, 14h38

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