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

Réplications SQL Server Discussion :

[SQL Server 2008 R2]Identifiants uniques


Sujet :

Réplications SQL Server

  1. #1
    Membre confirmé
    Avatar de Higgins
    Inscrit en
    Juillet 2002
    Messages
    520
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 520
    Points : 543
    Points
    543
    Par défaut [SQL Server 2008 R2]Identifiants uniques
    Bonjour,

    Je cherche une alternative aux GUID. J'ai plusieurs bases similaires avec des données qui doivent pouvoir être échangées entre les différentes tables. Pour identifier chaque enregistrement de manière unique, j'ai pensé utiliser des clés (int ou bigint) sur deux colonnes: une fixe pour l'ensemble de la base de données que j'attribue pour chaque nouvelle base et une autre en autoincrement. Le problème est que j'ai besoin d'identifier, en plus, sur chaque base l'utilisateur(ou groupe d'utilisateur) à qui a créé les données.
    Je me retrouverais alors avec une clé sur 3 colonnes pour chaque table. J'ai l'impression que ce sera lourd. Est-ce la meilleure solution ? Est-ce la seule ? Comment feriez-vous ?
    7 fois à terre, 8 fois debout

  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 766
    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 766
    Points : 52 561
    Points
    52 561
    Billets dans le blog
    5
    Par défaut
    Sur chaque serveur/utilisateur, mettez un autoincrément avec un pas et une graine décalée.
    Par exemple : 250 serveurs
    Prenez un BIGINT et :
    • sur le serveur 1 faites toutes vos tables en IDENTITY(1, 250)
    • sur le serveur 2 faites toutes vos tables en IDENTITY(2, 250)
    • sur le serveur 3 faites toutes vos tables en IDENTITY(3, 250)

    ...
    Pour savoir d'où vient la ligne :
    ID % 250 vous donnera le N° du serveur.

    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 confirmé
    Avatar de Higgins
    Inscrit en
    Juillet 2002
    Messages
    520
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 520
    Points : 543
    Points
    543
    Par défaut
    Merci pour votre réponse.
    J'ai peur d'avoir un problème de mise "en pratique". Chaque base de données est une extraction de la base d'origine à un instant t. L'autoincrement de la base principale aura alors "déjà vécu".
    Suffit-il d'un ALTER TABLE pour le faire partir avec un autre "pas" sur une nouvelle extraction?
    7 fois à terre, 8 fois debout

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 766
    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 766
    Points : 52 561
    Points
    52 561
    Billets dans le blog
    5
    Par défaut
    Comme toute solution d'architecture de données, il fallait y avoir penser avant au niveau de la modélisation de la base.
    Maintenant, oui, vous pouvez modifier tout cela, mais c'est loin d'être simple du fait de l'IR.

    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/ * * * * *

  5. #5
    Membre confirmé
    Avatar de Higgins
    Inscrit en
    Juillet 2002
    Messages
    520
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 520
    Points : 543
    Points
    543
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    Comme toute solution d'architecture de données, il fallait y avoir penser avant au niveau de la modélisation de la base.
    Justement, j'y pense avant
    Il s'agit du portage-refonte d'une application existante et ça nous permets d'envisager toutes les demandes faites sur l'ancienne version.
    La question subsidiaire que je me pose en plus est la suivante:
    Dans les versions précédentes de SQL-Server, on ne pouvait pas insérer de données dans une colonne autoincrément. Si c'est toujours le cas, comment vont se passer les échanges entre les bases?
    Si j'ai un id=251 sur le serveur 1 et 252 sur le serveur 2 vais-je pouvoir insérer les données d'une base dans une autre?
    En fait, je pense ne pas utiliser l'autoincrement automatique et le gérer moi-même pour éviter ce type de soucis. Pour tout simplifier, je gérerai une table qui contient tous les identifiants de toutes les tables et chaque table aurait une Foreign key qui pointerait sur celle-là. Chaque ID serait alors unique dans la base.
    7 fois à terre, 8 fois debout

  6. #6
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 766
    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 766
    Points : 52 561
    Points
    52 561
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par Higgins Voir le message
    Dans les versions précédentes de SQL-Server, on ne pouvait pas insérer de données dans une colonne autoincrément. Si c'est toujours le cas, comment vont se passer les échanges entre les bases?
    Si j'ai un id=251 sur le serveur 1 et 252 sur le serveur 2 vais-je pouvoir insérer les données d'une base dans une autre?
    Même si c'est peu connu, c'est depuis au moins la version 7 qu'on peut le faire... Est-te vous si dynosaureque ???
    Lisez ce que j'ai écrit à ce sujet : http://blog.developpez.com/sqlpro/p6...ec-sql-server/

    Citation Envoyé par Higgins Voir le message
    En fait, je pense ne pas utiliser l'autoincrement automatique et le gérer moi-même pour éviter ce type de soucis. Pour tout simplifier, je gérerai une table qui contient tous les identifiants de toutes les tables et chaque table aurait une Foreign key qui pointerait sur celle-là. Chaque ID serait alors unique dans la base.
    Oulala !! Pensez aux problème de performance et notamment au parallélisme d'exécution... Si vous voulez pourrir les performances de votre base et générer un max de verrous, et des dead lock, c'est dans cette voie qu'il faut aller !!!

    Lisez ce que j'ai écrit à ce sujet : http://sqlpro.developpez.com/cours/clefs/

    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/ * * * * *

  7. #7
    Membre confirmé
    Avatar de Higgins
    Inscrit en
    Juillet 2002
    Messages
    520
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 520
    Points : 543
    Points
    543
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    Même si c'est peu connu, c'est depuis au moins la version 7 qu'on peut le faire... Est-te vous si dynosaureque ???
    C'était avec la version 2005, mais il est vrai qu'il s'agissait d'une "première approche" où je me contentais de remonter des tables provenant d'une base Sybase et je n'avais pas utilisé SET IDENTITY_INSERT #MaTable { ON | OFF }

    Citation Envoyé par SQLpro Voir le message
    Oulala !! Pensez aux problème de performance et notamment au parallélisme d'exécution... Si vous voulez pourrir les performances de votre base et générer un max de verrous, et des dead lock, c'est dans cette voie qu'il faut aller !!!
    Je pensais n'utiliser cette table que comme "base d'information" et pas forcément l'inclure dans des requêtes.Ce serait une sorte de table des clés avec le nom de la table concernée. La foreign key entre la table cible et la table des clés aurait comme seule fonction de garantir que la clé ne peut pas être supprimée et que l'importation de données dans une table est conditionnée par la présence d'un identifiant unique dans la table des clés. Le risque de de verrous, et de dead-lock est-il aussi important dans ce cas?
    7 fois à terre, 8 fois debout

  8. #8
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 766
    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 766
    Points : 52 561
    Points
    52 561
    Billets dans le blog
    5
    Par défaut
    Il est moindre, mais il faut quand même pratiquer le niveau d'isolation SERIALIZABLE et commencer par l'UPDATE.
    Cependant, ce ne sera pas aussi rapide que le IDENTITY, ce qui conduira certainement à un point de contention dans les chargements massif, à moins de préréverser une plage de clef via la procédure de calcule de clef et l'utilisation combinée avec un ROW_NUMBER par exemple.

    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/ * * * * *

  9. #9
    Membre confirmé
    Avatar de Higgins
    Inscrit en
    Juillet 2002
    Messages
    520
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 520
    Points : 543
    Points
    543
    Par défaut
    Merci pour toutes vos réponses. Il me reste deux dernières questions sur IDENTITY:
    Puis-je laisser l'option SET IDENTITY_INSERT #MaTable ON à demeure ou dois-je l'activer/désactiver pour chaque opération d'insertion?
    Lorsque j'insère des données dans une colonne IDENTITY, l'autoincrement repart-il bien de "là où on avait laissé"?
    7 fois à terre, 8 fois debout

  10. #10
    Membre émérite

    Homme Profil pro
    Chargé de Développement et d'Analyse de données
    Inscrit en
    Mars 2010
    Messages
    1 278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé de Développement et d'Analyse de données
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 278
    Points : 2 856
    Points
    2 856
    Par défaut
    Citation Envoyé par Higgins Voir le message
    Merci pour votre réponse.
    J'ai peur d'avoir un problème de mise "en pratique". Chaque base de données est une extraction de la base d'origine à un instant t. L'autoincrement de la base principale aura alors "déjà vécu".
    Suffit-il d'un ALTER TABLE pour le faire partir avec un autre "pas" sur une nouvelle extraction?
    1 ) Attention, il est impossible (en tout jusqu'à ce jour) de faire
    un "ALTER TABLE" sur une table avec colonne IDENTITY. ça il faut le savoir. Bien sûr il existe une méthode de contournement pour modifier une table avec IDENTITY. mais ça c'est une autre histoire...

    2 ) La proposition de SQLPRO
    Sur chaque serveur/utilisateur, mettez un autoincrément avec un pas et une graine décalée.
    est excellente.
    Si tu n'as que 2 BASES, tu peux tout simplement appliquer des valeurs paires sur le 1er et des valeurs impaires sur le 2ème.
    c-a-d :
    • sur la BASE1 appliquée IDENTITY (2,2) pour les colonnes IDENTITY des tables
    • sur la BASE2 appliquée IDENTITY (3,2) pour les colonnes IDENTITY des tables


    A+
    Etienne ZINZINDOHOUE
    Billets-Articles

  11. #11
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 766
    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 766
    Points : 52 561
    Points
    52 561
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par zinzineti Voir le message
    1 ) Attention, il est impossible (en tout jusqu'à ce jour) de faire
    un "ALTER TABLE" sur une table avec colonne IDENTITY. ça il faut le savoir. Bien sûr il existe une méthode de contournement pour modifier une table avec IDENTITY. mais ça c'est une autre histoire...
    Petite précision : il est possible de faire un ALTER TABLE, mais pas un ALTER COLUMN sur le colonne ayant la propriété IDENTITY.

    Puis-je laisser l'option SET IDENTITY_INSERT #MaTable ON à demeure ou dois-je l'activer/désactiver pour chaque opération d'insertion?
    Non (1), oui (2), car vous ne pouvez avoir qu'un seul IDENTITY_INSERT à ON en même temps dans la même session.

    Lorsque j'insère des données dans une colonne IDENTITY, l'autoincrement repart-il bien de "là où on avait laissé"?
    A la valeur la plus haute si le pas est positif, ou la plus basse si le pas est négatif.

    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/ * * * * *

  12. #12
    Membre confirmé
    Avatar de Higgins
    Inscrit en
    Juillet 2002
    Messages
    520
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 520
    Points : 543
    Points
    543
    Par défaut
    Citation Envoyé par zinzineti Voir le message
    Si tu n'as que 2 BASES, tu peux tout simplement appliquer des valeurs paires sur le 1er et des valeurs impaires sur le 2ème.
    c-a-d :
    • sur la BASE1 appliquée IDENTITY (2,2) pour les colonnes IDENTITY des tables
    • sur la BASE2 appliquée IDENTITY (3,2) pour les colonnes IDENTITY des tables


    A+
    Le problème est que je ne connais pas le nombre de bases. Chaque fois que j'ai un nouveau client, je lui fournis une extraction de la base pré-remplie avec des données. Je voudrais lors d l'extraction de cette base imposer un nouveau pas, pour que les données de ce client ne télescopent ni les miennes, ni celles des clients existants.
    Supposons que j'ai un pas de 250 comme dans l'exemple de SQLpro, ma base démarre à 1 et celle du client à 2.
    Mes données seront les suivantes:

    • ID
    • -----
    • 1
    • 251
    • 501

    J'envoie cette base à mon client et je voudrais que ses propres données démarrent à 2 avec un pas de 250 également pour obtenir ça:
    • ID
    • -----
    • 1
    • 2
    • 251
    • 252
    • 501
    • 502
    7 fois à terre, 8 fois debout

  13. #13
    Membre émérite

    Homme Profil pro
    Chargé de Développement et d'Analyse de données
    Inscrit en
    Mars 2010
    Messages
    1 278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé de Développement et d'Analyse de données
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 278
    Points : 2 856
    Points
    2 856
    Par défaut
    Je suis d'accord
    Précision : le 250 dont il est question correspond au nombre maximal de client (de base de données) que tu peux avoir !!!
    A+
    Etienne ZINZINDOHOUE
    Billets-Articles

  14. #14
    Membre confirmé
    Avatar de Higgins
    Inscrit en
    Juillet 2002
    Messages
    520
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 520
    Points : 543
    Points
    543
    Par défaut
    Citation Envoyé par zinzineti Voir le message
    Je suis d'accord
    Précision : le 250 dont il est question correspond au nombre maximal de client (de base de données) que tu peux avoir !!!
    A+
    C'est exactement ça. Dans la pratique se sera sûrement plus mais c'était pour l'exemple.
    7 fois à terre, 8 fois debout

Discussions similaires

  1. SQL Server 2008 - index unique ou non unique ?
    Par drouhne dans le forum Administration
    Réponses: 3
    Dernier message: 12/10/2010, 15h45
  2. SQL Server 2008 : les nouveautés . . .
    Par SQLpro dans le forum MS SQL Server
    Réponses: 51
    Dernier message: 12/05/2010, 16h10
  3. Erreur Installation SQL Server 2008 Katmai
    Par jowsuket dans le forum MS SQL Server
    Réponses: 0
    Dernier message: 25/01/2008, 11h40
  4. Date officielle de la sortie de SQL Server 2008
    Par snoopy69 dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 10/09/2007, 18h29
  5. Sql Server Express - Probleme index unique et valeurs null
    Par Fayoul dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 17/02/2006, 17h22

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