it-swarm.com.de

SQL-Punktnotation

Kann mir jemand bitte erklären, wie SQL Server die Punktnotation zur Identifizierung verwendet
die Position eines Tisches? Ich dachte immer, dass der Ort Database.dbo.Table ist
Aber ich sehe Code, der etwas anderes als dbo hat, etwas wie:
DBName.something.Table Kann das bitte jemand erklären? 

13
user2343837

Dies ist ein Datenbankschema. Der vollständige dreiteilige Name einer Tabelle lautet:

databasename.schemaname.tablename

Bei einem Standardschema des Benutzers können Sie auch den Schemanamen weglassen:

databasename..tablename

Sie können auch einen Verbindungsservernamen angeben:

servername.databasename.schemaname.tablename

Weitere Informationen zur Verwendung von Bezeichnern als Tabellennamen finden Sie unter MSDN :

Die Server-, Datenbank- und Eigentümernamen werden als Qualifizierer des Objektnamens bezeichnet. Wenn Sie auf ein Objekt verweisen, müssen Sie den Server, die Datenbank und den Eigentümer nicht angeben. Die Qualifier können weggelassen werden, indem Sie ihre Positionen mit einem Punkt markieren. Die gültigen Formen von Objektnamen umfassen Folgendes:

server_name.database_name.schema_name.object_name

server_name.database_name..object_name

servername..Schema_Name.Objektname

servername ... Objektname

datenbankname.Schema_Name.Objektname

datenbankname..Objektname

schemaname.Objektname

objektname 

Ein Objektname, der alle vier Teile angibt, wird als vollständig qualifizierter Name bezeichnet. Jedes in Microsoft SQL Server erstellte Objekt muss einen eindeutigen, vollständig qualifizierten Namen haben. Beispielsweise können zwei Tabellen mit dem Namen xyz in derselben Datenbank vorhanden sein, wenn sie unterschiedliche Eigentümer haben.

Die meisten Objektverweise verwenden dreiteilige Namen. Der Standardservername ist der lokale Server. Der Standarddatenbankname ist die aktuelle Datenbank der Verbindung. Der Standardschemaname ist das Standardschema des Benutzers, der die Anweisung übergibt. Wenn nicht anders konfiguriert, ist das Standardschema neuer Benutzer das Dbo-Schema.

28
Szymon

Was @Szymon gesagt hat. Sie sollten auch einen Punkt von always schema-qualifizierenden Objektreferenzen angeben (ob Tabelle, Ansicht, gespeicherte Prozedur usw.). Nicht qualifizierte Objektreferenzen werden auf folgende Weise aufgelöst:

  • Prüfen Sie den Namespace der aktuellen Datenbank auf ein Objekt mit dem angegebenen Namen, das zum Standardschema der Berechtigungsnachweise gehört, unter denen die aktuelle Verbindung ausgeführt wird.

  • Wenn nicht gefunden, prüfen Sie den Namespace der aktuellen Datenbank nach einem Objekt mit dem angegebenen Namen, das zum Schema dbo gehört.

Wenn sich die Objektreferenz auf eine gespeicherte Prozedur bezieht, deren Name mit sp_ beginnt, ist es noch schlimmer, da zwei weitere Schritte zum Auflösungsprozess hinzugefügt werden (sofern die Referenzen nicht für die Datenbank qualifiziert sind): Die beiden obigen Schritte werden wiederholt, diesmal jedoch Suchen in der Datenbank master anstelle der aktuellen Datenbank.

Also eine frage wie

select *
from foo

erfordert, dass foo zwei Sonden des Namensraums auflöst (vorausgesetzt, dass die Tabelle/Sicht tatsächlich dbo.foo ist): zuerst unter Ihrem Standardschema (john_doe.foo) und dann unter dbo (dbo.foo ') nicht gefunden

select *
from dbo.foo

wird sofort mit einem einzigen Test des Namespaces aufgelöst.

Dies hat 3 Auswirkungen:

  1. Die redundanten Lookups sind teuer.

  2. Es verhindert das Zwischenspeichern von Abfrageplänen, da jede Ausführung erneut ausgewertet werden muss, was bedeutet, dass die Abfrage für jede Ausführung neu kompiliert werden muss (wodurch Kompilierzeiten gesperrt werden).

  3. Sie schießen sich irgendwann in den Fuß und erstellen aus Versehen etwas unter Ihrem Standardschema, das unter dem dbo-Schema existieren soll (und vielleicht bereits existiert). Jetzt sind zwei Versionen im Umlauf.

    Irgendwann führen Sie oder eine andere Person (normalerweise in der Produktion) will eine Abfrage aus oder führen eine gespeicherte Prozedur aus und erhalten ... unerwartete Ergebnisse. Sie werden einige Zeit benötigen, um herauszufinden, dass es zwei [unterschiedliche] Versionen desselben Objekts gibt, und welche davon ausgeführt wird, hängt von ihren Benutzeranmeldeinformationen und davon ab, ob der Verweis schemaqualifiziert war oder nicht.

Immer Schema-Qualifizierung, es sei denn, Sie haben einen Grund, es nicht zu tun.

Allerdings kann es manchmal zu Entwicklungszwecken nützlich sein, die "neue" Version von etwas unter Ihrem persönlichen Schema und die "aktuelle" Version unter dem "Dbo" - Schema zu verwalten. Es macht es einfach, nebeneinander zu testen. Es ist jedoch nicht ohne Risiko (siehe oben).

4
Nicholas Carey

Wenn SQL die Syntax erkennt, wird zuerst das aktuelle Benutzerschema untersucht, um festzustellen, ob die Tabelle vorhanden ist, und wird diese dann verwenden. Wenn dies nicht der Fall ist, wird das dbo-Schema betrachtet und die Tabelle von dort verwendet

0
yogeshwar gutte