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 (#). */
Partager