it-swarm.com.de

Standardschema für eine SQL-Abfrage festlegen

Gibt es eine Möglichkeit, das Schema für eine Abfrage so festzulegen, dass ich im Rest der Abfrage auf Tabellen nur anhand ihres Namens verweisen kann, ohne dass ihnen ein Schemaname vorangestellt wird?

Zum Beispiel möchte ich so etwas machen:

Use [schemaName]
select * from [tableName]

im gegensatz dazu:

select * from [schemaName].[tableName]
57
Chev

Ein kurzer Blick auf Google zeigte mir diese Seite . Ab SQL Server 2005 können Sie das Standardschema eines Benutzers mit der Anweisung ALTER USER festlegen. Das bedeutet leider, dass Sie es dauerhaft ändern. Wenn Sie also zwischen Schemas wechseln müssen, müssen Sie es jedes Mal festlegen, wenn Sie eine gespeicherte Prozedur oder einen Stapel von Anweisungen ausführen. Alternativ können Sie die beschriebene Technik verwenden hier .

Wenn Sie SQL Server 2000 oder älter verwenden diese Seite erklärt, dass Benutzer und Schemata gleichwertig sind. Wenn Sie Ihrem Tabellennamen kein Schema\user voranstellen, überprüft sql server zuerst die Tabellen des aktuellen Benutzers und anschließend die Tabellen des dbo, um den Tabellennamen aufzulösen. Es scheint, dass Sie für alle anderen Tabellen das Schema\user voranstellen müssen.

36
Sem Vanmeenen

Ich glaube nicht, dass es einen "pro Abfrage" Weg gibt, dies zu tun. (Sie können das Schlüsselwort use verwenden, um das Datenbank - nicht das Schema - anzugeben. Dies ist jedoch technisch gesehen eine separate Abfrage, da Sie anschließend den Befehl go eingeben müssen.)

Denken Sie daran, dass in SQL Server vollständig qualifizierte Tabellennamen im folgenden Format vorliegen:

[Datenbank]. [Schema]. [Tabelle]

In SQL Server Management Studio können Sie alle Standardeinstellungen konfigurieren, nach denen Sie fragen.

  • Sie können den Standardwert database für jeden Benutzer (oder in Ihrer Verbindungszeichenfolge) festlegen:

    Sicherheit> Anmeldungen> (Rechtsklick) Benutzer> Eigenschaften> Allgemein

  • Sie können den Standardwert schema auf Benutzerbasis festlegen (aber ich glaube nicht, dass Sie ihn in Ihrer Verbindungszeichenfolge konfigurieren können, obwohl dies immer der Standardwert ist, wenn Sie dbo verwenden):

    Sicherheit> Anmeldungen> (Rechtsklick) Benutzer> Eigenschaften> Benutzerzuordnung> Standardschema

Kurz gesagt, wenn Sie dbo für Ihr Schema verwenden, werden Sie wahrscheinlich am wenigsten Kopfschmerzen haben.

15
mpontillo

Was ich manchmal tue, wenn ich viele Tabellennamen brauche, bekomme ich sie einfach plus ihr Schema aus der Systemtabelle INFORMATION_SCHEMA: value


select  TABLE_SCHEMA + '.' + TABLE_NAME from INFORMATION_SCHEMA.TABLES where TABLE_NAME in
(*select your table names*)

1
olafk

SETUSER könnte funktionieren, wenn ein Benutzer oder sogar ein geschriebener Benutzer in der Datenbank mit dem erforderlichen Standardschema vorhanden ist. Aber SETUSER ist auf dem Erbe nicht für immer Liste unterstützt. Eine ähnliche Alternative wäre es, eine Anwendungsrolle mit dem erforderlichen Standardschema einzurichten, sofern kein Cross-DB-Zugriff erforderlich ist

1
Moogaloo

Sehr alte Frage, aber da Google mich hierher geführt hat, werde ich eine Lösung hinzufügen, die ich nützlich fand:

Schritt 1. Erstellen Sie einen Benutzer für jedes Schema, das Sie verwenden können müssen. Z.B. "user_myschema"

Schritt 2. Verwenden Sie EXECUTE AS, um die SQL-Anweisungen als den erforderlichen Schema-Benutzer auszuführen.

Schritt 3. Verwenden Sie REVERT, um zum ursprünglichen Benutzer zurückzukehren.

Beispiel: Nehmen wir an, Sie haben eine Tabelle "mytable" im Schema "otherschema", das nicht Ihr Standardschema ist. Das Ausführen von "SELECT * FROM mytable" funktioniert nicht.

Erstellen Sie einen Benutzer mit dem Namen "user_otherschema" und legen Sie das Standardschema dieses Benutzers auf "otherschema" fest.

Jetzt können Sie dieses Skript ausführen, um mit der Tabelle zu interagieren:

EXECUTE AS USER = 'user_otherschema';
SELECT * FROM mytable
REVERT

Die revert-Anweisungen setzen den aktuellen Benutzer zurück, sodass Sie wieder Sie selbst sind.

Link zur EXECUTE AS-Dokumentation: https://docs.Microsoft.com/en-us/sql/t-sql/statements/execute-as-transact-sql?view=sql-server-2017

0
Culme