2009-03-03 9 views
1

Les index et les contraintes dans MS SQL Server sont locaux à la table dans laquelle ils sont définis. Vous pouvez donc créer le même nom d'index ou de contrainte dans plusieurs tables sans problème. Les contraintes de clé étrangère (qui, comme tout le monde devrait le savoir, ne sont PAS des clés, mais des contraintes) apparaîtront dans le sous-dossier Keys et leurs noms sembleront avoir une portée globale.Les clés dans SQL Server sont globales - Pourquoi?

Quelqu'un sait pourquoi les "clés" ont des noms globaux? Je comprends les différences entre les clés et les index. Je ne comprends pas pourquoi il devrait y avoir une telle différence dans la délimitation du nom. Dans tous les cas, ils sont "locaux" à la table pour laquelle ils sont définis.

TIA

Répondre

3

Selon « SQL-99 complet, vraiment » par Peter Gulutzan et Trudy Pelzer, les noms de contrainte sont qualifiés par le schéma dans lequel ils vivent, et la table que la contrainte affecte doit vivre le même schéma. Mais le nom de la contrainte n'est pas qualifié par ce nom de table. Le nom de contrainte doit être unique dans le schéma, il vit dans

  • OUI:. myschema.some_primary_key
  • NO: myschema.mytable.some_primary_key

Quant au « pourquoi » tel est le cas, je suppose qu'il est lié à un type de contrainte dans SQL-99 appelé ASSERTION. Une assertion "n'appartient pas" à une seule table, comme c'est le cas pour les contraintes de clé primaire, de clé étrangère et de vérification. Une assertion déclare une condition qui doit être vraie pour tout succès INSERT/UPDATE/DELETE, et l'assertion peut référencer plusieurs tables. Il ne serait pas logique de qualifier ces noms de contraintes par n'importe quelle table. Je ne sais pas combien de marques de SGBDR implémentent des assertions SQL (en fait je n'en connais pas une seule), mais elles pourraient aussi bien se conformer aux règles SQL standard pour les noms de contraintes, donc à l'avenir elles peuvent choisir implémenter la fonction d'assertion selon la norme.

+0

Merci Bill ... Il semble que je me suis fait attraper par le "échec de rafraîchir" probelm quand je testais mes noms de contraintes en double ... L'interface utilisateur semblait l'accepter, mais pas la base de données sous-jacente. Donc, mon observation initiale était, en fait, incorrecte. – PaoloFCantoni

Questions connexes