Abfrage ohne Angabe des Tabellenschemas


10

Ich habe eine Reihe von Tabellen aus SQL Server 2000 in meine 2008-Datenbank importiert. Allen importierten Tabellen wird mein Benutzername vorangestellt, z erpadmin.tablename. B.: .

In den Tabelleneigenschaften wird 'erpadmin' als Datenbankschema aufgeführt. Wenn ich eine Abfrage schreibe, muss ich jetzt 'erpadmin' einfügen. vor allen Tabellennamen, was verwirrend ist.

Aktuelles Ergebnis:

select *
from erpadmin.tablename

Erwünschtes Ergebnis:

select *
from  tablename

Antworten:


23

Wenn Sie das dbo-Schema wieder wie in SQL Server 2000 verwenden möchten, können Sie die Tabelle wieder in das dbo-Schema verschieben:

ALTER SCHEMA dbo TRANSFER erpadmin.tablename;

Eine Alternative, wenn Sie das Nicht-Dbo-Schema haben möchten, besteht darin, das Standardschema Ihres Benutzers auf erpadminfestzulegen. Wenn Sie kein Schema angeben, wird dieses als Standard verwendet. (Mitglieder der festen Serverrolle sysadmin ignorieren die DEFAULT_SCHEMAund verwenden sie dbostandardmäßig.)

ALTER USER erpadmin WITH DEFAULT_SCHEMA = erpadmin;

Der zweiteilige Name, den Sie haben (schema.table), ist jedoch eine gute Angewohnheit, sodass Sie explizit angeben können, auf welche Tabelle Sie sich beziehen. Für einige Funktionen müssen Sie einen zweiteiligen Namen verwenden. Indizierte Ansichten sind ein Beispiel.


17

Dies ist ein klassischer Fall, warum Sie beim Zugriff auf Datenbankobjekte den Schemanamen angeben sollten . Wenn es nicht angegeben ist und Sie versuchen, auf ein Objekt in einem nicht standardmäßigen Schema zuzugreifen, werden Sie auf das Problem stoßen, das Sie gerade sehen.

Die eigentliche Lösung besteht darin, Ihre Anwendung (oder den Abfrageagenten, über den Sie gerade verfügen und der das Problem verursacht) explizit zu ändern.

Wenn ich eine Abfrage schreibe, muss ich jetzt 'erpadmin' einfügen. vor allen Tabellennamen, was verwirrend ist.

Das ist nicht verwirrend, das ist eine explizite Namenskonvention . Ich empfehle, dass Sie sich an diese Nomenklatur halten, um das Mischen von Objekten und Inkonsistenzen zu vermeiden.


3
Ein weiterer Grund für die Verwendung immer zweiteiliger Namen besteht darin, die Situation zu vermeiden, in der mehrere Benutzer (zum Beispiel select ... from table5 ;) denselben Code ausführen und unterschiedliche Ergebnisse erzielen. Dies ist schlecht für das Plan-Caching und auch schlecht für die Fehlerbehebung (Cue-Support-Person, "diese Abfrage läuft hier einwandfrei"). Für die Schemabindung, die für die Indizierung von Funktionen und Ansichten erforderlich ist, sind zwei Teilenamen erforderlich. TLDR: Hören Sie auf, faul zu sein - verwenden Sie zwei Teilenamen.
Greenstone Walker

7

Als Ergänzung zu @AdamWenger Antwort. Um Skripte für die Übertragung in ein anderes Schema zu erstellen, können Sie das folgende Skript verwenden

select 'ALTER SCHEMA dbo TRANSFER '+s.name+'.'+t.name
from sys.schemas s
     join sys.tables t on t.schema_id=s.schema_id
where s.name='erpadmin'

4

Ihr Problem ist wahrscheinlich darauf zurückzuführen, wie die Migration durchgeführt wurde. Sachen sollten nicht an Ihren Benutzer angehängt werden, es sei denn, Sie gelten als Eigentümer.

Schemata helfen Ihnen dabei, Tabellen nach Belieben zu trennen. Angenommen, Sie haben eine Ressourcentabelle für die Personalabteilung und möchten eine separate für die Produktionsabteilung, während beide in derselben Datenbank gespeichert sind. In diesem Fall können Sie zwei Tabellen mit dem Namen Ressourcen haben, eine im Produktionsschema und eine im HR-Schema. Aus diesem Grund müssen shcemas angegeben werden, es sei denn, Sie bringen Inhalte in das Standardschema.

Wenn Sie die Migration aus einem anderen Grund nicht wiederholen, sollte die Übertragung von Adam Wenger eine sinnvolle Option sein.


-2

Starten Sie Ihren Befehl mit dem USE [tablename] Ihrer Abfrage ist keine Datenbank zugeordnet, auf die verwiesen werden kann, und die Datenbank, die Sie anzeigen, ist nicht die Standardeinstellung für den angemeldeten Benutzer. Am oberen Rand des Abfragefensters steht wahrscheinlich "master".


3
Du meinst [database_name], richtig?
Dekso
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.