web-dev-qa-db-fra.com

Notation par points SQL

Quelqu'un peut-il m'expliquer s'il vous plaît comment SQL Server utilise la notation de point pour identifier
l'emplacement d'une table? J'ai toujours pensé que l'emplacement est Database.dbo.Table
Mais je vois du code qui a autre chose à la place de dbo, quelque chose comme:
DBName.something.Table Quelqu'un peut-il s'il vous plaît expliquer cela? 

13
user2343837

Ceci est un schéma de base de données. Le nom complet d'une table en trois parties est:

databasename.schemaname.tablename

Pour un schéma par défaut de l'utilisateur, vous pouvez également omettre le nom du schéma:

databasename..tablename

Vous pouvez également spécifier un nom de serveur lié:

servername.databasename.schemaname.tablename

Vous pouvez en savoir plus sur l’utilisation d’identifiants en tant que noms de tables sur MSDN :

Les noms de serveur, de base de données et de propriétaire sont appelés qualificateurs du nom d'objet. Lorsque vous faites référence à un objet, vous n'avez pas besoin de spécifier le serveur, la base de données et le propriétaire. Les qualificatifs peuvent être omis en marquant leurs positions avec un point. Les formes valides de noms d'objet sont les suivantes:

nom_serveur.dnom_base.nom_schéma.nom_objet

nom_serveur.dnom_base..nom_objet

nom_serveur..nom_schéma.nom_objet

nom_serveur ... nom_objet

nom_base_données.nom_schéma.nom_objet

nom_base_données..nom_objet

nom_schéma.nom_objet

nom_objet 

Un nom d'objet qui spécifie les quatre parties est appelé nom complet. Chaque objet créé dans Microsoft SQL Server doit avoir un nom complet et unique. Par exemple, il peut y avoir deux tables nommées xyz dans la même base de données si elles ont des propriétaires différents.

La plupart des références d'objets utilisent des noms en trois parties. Le nom_serveur par défaut est le serveur local. Nom_bdd par défaut est la base de données actuelle de la connexion. Nom_schéma par défaut est le schéma par défaut de l'utilisateur qui soumet l'instruction. Sauf configuration contraire, le schéma par défaut des nouveaux utilisateurs est le schéma dbo.

28
Szymon

Ce que @Szymon a dit Vous devez également définir le point always les références d'objet qualifiant le schéma (table, vue, procédure stockée, etc.). Les références d'objet non qualifiées sont résolues de la manière suivante:

  • Sondez l'espace de noms de la base de données actuelle pour rechercher un objet du nom spécifié appartenant au schéma par défaut des informations d'identification sous lesquelles la connexion en cours est en cours d'exécution.

  • S'il est introuvable, recherchez dans l'espace de noms de la base de données actuelle un objet du nom spécifié appartenant au schéma dbo.

Et si la référence de l'objet est à une procédure stockée dont le nom commence par sp_, c'est encore pire, car deux étapes supplémentaires sont ajoutées au processus de résolution (sauf si les références sont qualifiées de base de données): les deux étapes ci-dessus sont répétées, mais cette fois, recherche dans la base de données master au lieu de la base de données actuelle.

Donc, une requête comme

select *
from foo

nécessite deux sondes de l'espace de noms pour résoudre foo (en supposant que la table/vue est réellement dbo.foo): d'abord sous votre schéma par défaut (john_doe.foo) et ensuite, n'étant pas trouvé, sous dbo (dbo.foo '),

select *
from dbo.foo

est immédiatement résolu avec une seule sonde de l'espace de noms.

Cela a 3 implications:

  1. Les recherches redondantes sont chères.

  2. Il empêche la mise en cache du plan de requête, car chaque exécution doit être réévaluée, ce qui signifie que la requête doit être recompilée pour chaque exécution (et que les verrous au moment de la compilation sont supprimés).

  3. Vous allez, à un moment ou à un autre, vous tirer dans le pied et créer par inadvertance quelque chose dans votre schéma par défaut qui est censé exister (et le fait peut-être déjà) sous le schéma dbo. Maintenant, vous avez deux versions qui circulent.

    À un moment donné, vous ou quelqu'un d'autre (cela se produit généralement en production) allez exécuter une requête ou exécuter une procédure stockée et obtenir ... des résultats inattendus. Il vous faudra un certain temps pour comprendre qu'il existe deux versions [différentes] du même objet, et que celle qui est exécutée dépend de leurs informations d'identification utilisateur et du fait que la référence soit qualifiée ou non d'un schéma.

Toujours qualifier le schéma, sauf si vous avez une raison réelle de ne pas le faire.

Cela dit, il peut parfois être utile, pour des raisons de développement, de pouvoir conserver la "nouvelle" version de quelque chose sous votre schéma personnel et la version "actuelle" sous le schéma 'dbo'. Cela facilite les tests côte à côte. Cependant, ce n'est pas sans risque (voir ci-dessus).

4
Nicholas Carey

Lorsque SQL verra la syntaxe, il examinera d'abord le schéma des utilisateurs actuels pour voir si la table existe et l'utilisera s'il en existe une. Si ce n'est pas le cas, il examine le schéma dbo et utilise la table à partir de là.

0
yogeshwar gutte