Insertion auatomatique de GUID sous sql serveur 2000

Résolu
Arthenius Messages postés 1182 Date d'inscription mercredi 21 janvier 2004 Statut Membre Dernière intervention 6 septembre 2011 - 30 mai 2005 à 10:05
Arthenius Messages postés 1182 Date d'inscription mercredi 21 janvier 2004 Statut Membre Dernière intervention 6 septembre 2011 - 31 mai 2005 à 09:16
Salut tout le monde,

voila ne souhaitant plus utiliser les compteurs auto-incrementer pour mes primary key (car je souhaite pouvoir intégrer dans une même BDD les Bdds de différents site et donc pour éviter les pbs de synchronisation..), je voudrais utiliser les GUID (ou unique identifier)

Seulement voila les choses que j'ai vue disais qu'il fallait générer au niveau programme le guid et faire l'insert avec le guid générer.

Moi je souhaiterais une solution plus simple, cad que la BDD ce charge de générer le guid (comme elle le fait pour les compteurs autoincrementer), la chose est -elle possible ???

Merci pour vos lumieres...


Arthenius
http://blogs.developpeur.org/Arthenius/

"Ce qui ne me tue pas, me rend plus fort..."

4 réponses

Arthenius Messages postés 1182 Date d'inscription mercredi 21 janvier 2004 Statut Membre Dernière intervention 6 septembre 2011 14
30 mai 2005 à 12:10
moui et non

cette méthode permettrait effectivement que cela fonctionne un temps...
mais il y arrivera forcement un jour ou le compteur d'un des sites arrivera au niveau du compteur d'un autre site...je pense notamanet à une gestion des mouvements de stocks qui est enormenent solicite de maniere journaliere...

et la c la cata...

après reflexion, je pense que nous allons gérer X base de données bien séparés avec réplication sur les différents sites et remontés d'infos , etc...
la chose semble plus pratique et ainsi nous eviterons les pb de synchro de BDD, et ou d'optimisation sans monter une usine pour mettre en place les guid :o)

merci en tout cas de ton interet


Arthenius
http://blogs.developpeur.org/Arthenius/

"Ce qui ne me tue pas, me rend plus fort..."
3
nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Membre Dernière intervention 15 juillet 2011 37
30 mai 2005 à 22:10
Salut,



Les GUID sont uniques,

c'est une clé 128 bits générés aléatatoirement, c'est un nombre parmis 2^128

donc il faut le faire expres pour avoir 2 GUID indentique meme dans une base de données.

http://www.microsoft.com/france/msdn/technologies/technos/windows/info/info.asp?mar=/france/msdn/technologies/technos/framework/info/2004-02-05-strongnames.html

pour plus d'infos



Les UID peuvent être généré en TSQL par NEWID()



select newid() , ....

insert newid(),...



Le probleme de la synchrosation est que la procédure stockée

si la synchro est faite par la meme procedure stockée -->

deux appels a newid() --> enregistrements différents.



Si tu compares les bases et que tes ordres insert de synchro ont les memes UID

tu n'auras pas de problemes.



Le deuxieme probleme, est surtout que si tu enregistres un ensemble
d'enregistrements il faut aller en base pour retrouver les valeurs des
GUID inserés.



Ex. pour les tables pointants sur elles meme comme les arbres.



C'est à toi de voir.

Soit tu mets les GUID dans les procs stocks et la les perf sont nmoindres, sinon

dans le programme et la le nombre de requetes peut etre optimale.



Voila
3
shaiulud Messages postés 404 Date d'inscription mardi 18 décembre 2001 Statut Membre Dernière intervention 15 juillet 2014 22
30 mai 2005 à 11:51
Il ne me semble pas possible de le faire nativement.
En effet que se soit MySQL, SQL Server, Oracle, Sybase, PostgreSQL, Access.
Le clé autoincrémentale ou séquence sont de la forme (valeur max+1).

de plus l'utilisation d'un identifiant "unique" généré doit être fait avec une méthode qui garantisse bien l'unicité de la clé (càd sans collision) sous peine d'avoir une clé en double.

Peut être devrai tu revoir tes séquences pour définir une valeur de départ pour chaque base afin de ne pas avoir de doublon. (propriété IDENTITY(nbDepart, 1))

par ex:
ALTER TABLE nomTable ADD
column_b INT IDENTITY(10000, 1)
CONSTRAINT column_b_pk PRIMARY KEY
0
Arthenius Messages postés 1182 Date d'inscription mercredi 21 janvier 2004 Statut Membre Dernière intervention 6 septembre 2011 14
31 mai 2005 à 09:16
ok merci je vais explorer cette voie :o)

et tester ce newid..
rine ne m'empeche de faire 2 procedure stockee, une pour l'utilisation "courante" qui fait appel a la fonction newid() et une pour la synchro qui prend les données tel quel et roule..

merci de ta réponse


Arthenius
http://blogs.developpeur.org/Arthenius/

"Ce qui ne me tue pas, me rend plus fort..."
0
Rejoignez-nous