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 :

[SQL-2008] Ajout d'une contrainte à une table temporaire


Sujet :

Développement SQL Server

  1. #1
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    252
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2010
    Messages : 252
    Points : 145
    Points
    145
    Par défaut [SQL-2008] Ajout d'une contrainte à une table temporaire
    Bonjour à tous,

    Configuration : SQL server 2008 express - Projet Access .adp - Win XP - Win 7 - Win server 2008 SR2.

    J'utilise des tables temporaires comme source de saisie de nombreux formulaires dans mes applications (Access 2010 .ADP) ce qui nécessite que les tables sources de ces saisies soient dotées d'une clé primaire faute de quoi toute édition ou ajout est interdit.

    Je crée mes tables temporaires d'une manière générique, en général à partir d'une instruction Select Into # où les clauses Where et, éventuellement, group by assurent la sélection des données.

    Du fait de cette manière de créer les tables, je ne peux pas explicitement désigner la clé primaire (qui ne fait pas forcément partie de la sélection de colonnes) et je recrée donc explicitement, lorsque c'est nécessaire, une contrainte sur le champ souhaité de la table tempo.

    Problème : je viens de me rendre compte (tout le monde peut être naïf) que ces contraintes ne sont pas gérées comme les tables temporaires (encapsulées dans chaque processus ou session) mais ajoutées à un niveau qui les rendent accessibles à toutes les session autorisées sur la base (ou le serveur?)

    Conséquence : lorsque 2 opérations identiques sont lancées simultanément, la création de la contrainte applicable à la deuxième occurence de la table temporaire échoue car une contrainte portant ce nom existe déjà !
    J'ai essayé de préfixer le nom de la contrainte avec # mais c'est refusé (voir code ci-dessous).

    Peut-on, et comment, résoudre ce problème sans passer par une instruction CREATE TABLE explicite ?

    Ci joint un extrait de code des séquences de constitution de la table et de la contrainte.

    Merci pour vos réponses.
    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
    select * INTO [#TmpN37Test] from N37_Demo
    go
     
    CREATE UNIQUE INDEX [TmpN37Test_IDX] ON [#TmpN37Test](IdN37)
    go
     
    ALTER TABLE [#TmpN37Test] ADD CONSTRAINT
    [TmpN37Test_PK] PRIMARY KEY CLUSTERED (IdN37)
    WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
    GO
    /*
    Msg*2714, Niveau*16, État*4, Ligne*4
    Il existe déjà un objet nommé 'TmpN37Test_PK' dans la base de données.
    Msg*1750, Niveau*16, État*0, Ligne*4
    Impossible de créer la contrainte. Voir les erreurs précédentes.
    */
    ALTER TABLE [#TmpN37Test] ADD CONSTRAINT
    [#TmpN37Test_PK] PRIMARY KEY CLUSTERED (IdN37)
    WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
    GO
    /*
    Msg*8166, Niveau*16, État*0, Ligne*6
    Nom de contrainte '#TmpN37Test_PK' non autorisé. Les noms de contraintes ne doivent pas commencer par un signe dièse (#).
    */

  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 772
    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 772
    Points : 52 735
    Points
    52 735
    Billets dans le blog
    5
    Par défaut
    1) il est idiot de créer un index primaire et une contrainte sur la même colonne. EN effet la création d'une PK crée automatiquement un index de même nom.
    2) il est inutile de nommer la contrainte, laissez faire SQL Server il trouvera un nom adéquat
    3) l'utilisation de tables temporaire nuit aux performances, préférez faire des requêtes ensemblistes y compris en utilisant par exemple de CTE.

    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 habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    252
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2010
    Messages : 252
    Points : 145
    Points
    145
    Par défaut Bien reçu
    Bonjour SQLPro,
    Merci pour votre réponse rapide et quelque peu décapante.

    On en apprend tous les jours et c'est surement l'un des premiers objectifs de ce forum.

    Pour les points 1 et 2 : rien à redire si n'est encore merci,
    Pour le 3ième point : l'utilisation de tables temporaires permet à un utilisateur d'annuler l'ensemble des saisies effectuées sur un document multilignes (lignes de bon de livraison par exemple) sans recourir à des transactions qui dureraient tout le temps de la saisie.

    Il y a probablement d'autres solutions mais celle-ci me convient bien.

    Cordialement,
    François

  4. #4
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    252
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2010
    Messages : 252
    Points : 145
    Points
    145
    Par défaut Mais comment ajouter une contrainte sans la nommer ?
    J'ai répondu un peu vite tout à l'heure car j'avais entre temps contourné mon problème en constituant un nom unique de contrainte. SQLPro me dit
    il est inutile de nommer la contrainte, laissez faire SQL Server il trouvera un nom adéquat
    mais comment ajouter la contrainte sans la nommer ?

    J'ai fait plusieurs tentatives par [ALTER TABLE xxx ADD CONSTRAINT ...] mais l'absence de nom de contrainte est rejeté à chaque fois.

    Existe-t-il un autre moyen ?

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

Discussions similaires

  1. Ajout d'une contrainte à une table
    Par ka123tn dans le forum Requêtes
    Réponses: 4
    Dernier message: 07/04/2009, 12h54
  2. Ajouter le résultat d'une requête à une table
    Par Pierre Jean-Pierre dans le forum Requêtes et SQL.
    Réponses: 24
    Dernier message: 02/10/2008, 19h25
  3. [ACCESS] Ajouter un enregistrement dans une requête multi-table
    Par access_balou dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 23/09/2008, 14h43
  4. [MySQL] comment ajouter plusieurs articles dans une BD MySql+tables temporaires
    Par forbidden_fruit dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 19/05/2008, 12h00
  5. ajouter un champ dynamiquement à une instance de table
    Par maniack dans le forum Bases de données
    Réponses: 2
    Dernier message: 28/02/2004, 23h58

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