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

MS SQL Server Discussion :

Séquence, generator, compteur..


Sujet :

MS SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Décembre 2002
    Messages
    438
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 438
    Par défaut Séquence, generator, compteur..
    Bonjour,

    Je suis un petit nouveau sur la BD MS SQL-Server 7.
    Je voudrais réaliser l'équivalent d'une séquence (ORACLE) ou d'un generator (Interbase) c.a.d un compteur unique quelque soit la session.

    Mon but est d'avoir un numéro d'expédition unique sachant que plusieurs PC (session) peuvent en generer et en même temps.

    Je vous remiercie d'avance

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 50
    Par défaut
    Bonjour,

    Quel est le but ? Avoir un identificateur qui s'incrémente automatiquement à chaque nouvel enregistrement dans une table ?

    Si c'est le cas, alors tu peux créer une colonne de type IDENTITY sous SQL Server 2000, mais je sais pas si ça existait sous la version 7

  3. #3
    Membre éclairé
    Inscrit en
    Décembre 2002
    Messages
    438
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 438
    Par défaut Imagine...
    La clé primaire de la table où sont enregistrés mes numéros d'expedition est composé de deux champs :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    /*==============================================================*/
    /* Table: [GROUP]                                               */
    /*==============================================================*/
    create table [GROUP] (
    S_TYPECOLIS          varchar(1)           not null
         constraint CKC_S_TYPECOLIS_GROUP check (S_TYPECOLIS in ('P','E','C')),
    S_IDGROUP            varchar(10)          not null,
    constraint PK_GROUP primary key  (S_TYPECOLIS, S_IDGROUP)
    )
    mais S_IDGROUP doit s'incrementer selon le S_TYPECOLIS. Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    S_TYPECOLIS  S_IDGROUP
    P                    1
    P                    2
    P                    3
    E                    1
    E                    2
    E                    3
    C                   1
    C                   2
    C                   3
    Si c'est le cas, alors tu peux créer une colonne de type IDENTITY sous SQL Server 2000, mais je sais pas si ça existait sous la version 7
    Oui le type IDENTITY est géré dans la version 7

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 50
    Par défaut
    par un trigger peut-être ?

  5. #5
    Membre éclairé
    Inscrit en
    Décembre 2002
    Messages
    438
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 438
    Par défaut oui
    oui

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 50
    Par défaut
    euh pardon, "oui" à quoi ?

    est-ce que c'est cette clé que tu veux gérer ?
    si c'est le cas, je proposais de le faire par un trigger

  7. #7
    Membre éclairé
    Inscrit en
    Décembre 2002
    Messages
    438
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 438
    Par défaut Trigger or not trigger !
    Oui, le trigger me semble une bonne solution.
    Je vois ce que tu veux faire.
    Un select max(S_IDGROUP) where S_TYPECOLIS = XXX

    Sous oracle, tu as un objet nommé séquence qui sont des compteurs qui s'incrementent dès qu'ils sont appellés (NextValues). Si deux sessions en même temps demande une valeur, ORACLE ne donnera jamais la même. Cela permet de l'afficher à l'écran et tu as tout le temps pour inserer tes données. En SQL Server, tu peux toujours aller chercher le Max dans la table, mais si deux programmes le font en même temps, tu risques d'inserer deux fois le même id. Cela t'oblige donc à le verifier juste avant insertion ou de le faire par trigger. Dans ce cas, le numéro affiché n'était pas le bon.

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 50
    Par défaut
    Je pense que ma colonne IDENTITY correspond à peu près à ton objet séquence (je connais assez mal oracle).

    Mais comment tu faisais pour qu'il te donne un numéro en fonction de S_TYPECOLIS ?

  9. #9
    Rédacteur/Modérateur

    Avatar de Fabien Celaia
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2002
    Messages
    4 228
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2002
    Messages : 4 228
    Billets dans le blog
    25
    Par défaut
    Citation Envoyé par yan77
    Si c'est le cas, alors tu peux créer une colonne de type IDENTITY sous SQL Server 2000, mais je sais pas si ça existait sous la version 7
    la notion d'identity a été introduite par Sybase - à ma connaissance - dès la version 4.2 de SQL Server.
    Sr DBA Oracle / MS-SQL / MySQL / Postgresql / SAP-Sybase / Informix / DB2

    N'oublie pas de consulter mes articles, mon blog, les cours et les FAQ SGBD

    Attention : pas de réponse technique par MP : pensez aux autres, passez par les forums !

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 50
    Par défaut
    fiuuuu, ça date

  11. #11
    Membre éclairé
    Inscrit en
    Décembre 2002
    Messages
    438
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 438
    Par défaut Comment faire ltrigger !!
    Voici le trigger qui doit mettre à jour le S_IDGROUP :

    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
    CREATE TRIGGER INSERTGROUP ON [GROUP] FOR INSERT AS
    SET NOCOUNT ON
     
    Declare @TypeColis varchar(1) 
    SELECT @TypeColis = S_TYPECOLIS from INSERTED
     
    if @TypeColis in ('P', 'E')
      BEGIN
      Declare @LastId varchar(10) 
      SELECT @LastId =MAX(S_IDGROUP) 
      FROM [GROUP] where S_TYPECOLIS=@TypeColis
     
      IF @LastId IS null
        BEGIN 
        SET @LastId='0000000001' 
        END
      ELSE
        BEGIN
        SET @LastId=replace(str(cast(@LastId as int) + 1,10),' ', '0')
        END
     
      --Comment faire pour modifier le S_IDGROUP ici qui fait partie de la clé primaire ?
      --S_IDGROUP = @LastId 
      END
    GO
    Comment faire pour mettre à jour la colonne inserée S_IDGROUP ? Les triggers FOR INSERT se produisent avant ou après l'insertion ?

    Je suis en SQLServer 7

    Merci d'avance

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 50
    Par défaut
    Implicitement c'est après (mot clé AFTER par défaut).

    Si S_IDGROUP fait partie de la clé, tu peux pas faire un insert qui le laisse à NULL. Donc soit tu insères d'abord une valeur par défaut, puis tu le update, soit tu fais un trigger INSTEAD OF.

    Il sera déclenché avant la modif effective.
    Incovénient, il faut retaper ta requête sql insert.
    Avantage, tu peux sans doute faire une petite boucle qui traite éventuellement les doublons, au cas ou 2 utilisateurs font insert exactement au même moment.

  13. #13
    Membre éclairé
    Inscrit en
    Décembre 2002
    Messages
    438
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 438
    Par défaut Merci
    Merci beaucoup pour tes conseils. Je vais essayer cela.

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

Discussions similaires

  1. Compteur generation pulse
    Par cedji dans le forum LabVIEW
    Réponses: 1
    Dernier message: 24/06/2010, 12h22
  2. Compteur de Generation
    Par Danyel dans le forum VB.NET
    Réponses: 5
    Dernier message: 24/08/2007, 19h43
  3. diagrm de séquence et la generation de code
    Par abdo.1980 dans le forum UML
    Réponses: 14
    Dernier message: 10/08/2007, 16h04
  4. Réponses: 2
    Dernier message: 21/03/2007, 11h03
  5. passage du compteur en séquence oracle
    Par hariri dans le forum Oracle
    Réponses: 12
    Dernier message: 17/11/2006, 14h29

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