Discussion:
SQL und Schema-Angabe
(zu alt für eine Antwort)
ChristianH
vor 15 Jahren
Permalink
Hi,

ich habe eine C# Anwendung, die mittels den ODBC-Klassen auf verschiedene
ODBC-Datenquellen zugreifen kann.

Bei den Abfragen wird ein SQL wie folgt generiert:
SELECT * FROM MyTable;

Ein Kunde hat Probleme mit der Komponente. Es fehlt im SQL die Angabe des
Schemas:
Select * from SOA.MyTable

Im Microsoft SQL Server Management Studio habe ich auf eine Tabelle den
Kontextmenübefehl "SELECT TOP 1000 ROWS" gewählt. Generiertes SQL:
SELECT * FROM [MyDB].[dbo].[MyTable]

Frage:
Wie muss die Angabe im der Tabelle bzw. View in der SQL Abfrage aussehen,
damit diese mit jeder ODBC-Datenquelle funktioniert? Nur der Tabellenname
reicht offensichtlich nicht immer aus.

Vielen Dank
Christian
Elmar Boye
vor 15 Jahren
Permalink
Hallo Christian,
Post by ChristianH
ich habe eine C# Anwendung, die mittels den ODBC-Klassen auf verschiedene
ODBC-Datenquellen zugreifen kann.
SELECT * FROM MyTable;
Ein Kunde hat Probleme mit der Komponente. Es fehlt im SQL die Angabe des
Select * from SOA.MyTable
Wenn die Schema Angabe fehlt, so wird das Standard-Schema
des Datenbank-Benutzers verwendet. Für Benutzer, die über eine
Windows-Gruppe authentifiziert werden, gibt es kein Standard-Schema.
http://msdn.microsoft.com/de-de/library/ms173463.aspx
"CREATE USER"
Post by ChristianH
Wie muss die Angabe im der Tabelle bzw. View in der SQL Abfrage aussehen,
damit diese mit jeder ODBC-Datenquelle funktioniert? Nur der Tabellenname
reicht offensichtlich nicht immer aus.
Deswegen und weil der Zugriff inkl. qualifiziertem Schema schneller ist,
solltest Du das Schema immer mit angeben, also
SELECT ... FROM Schema.Tabelle

Die Datenbankangabe kann entfallen, solange sich die Schema / Tabelle
in der aktuellen Datenbank befinden. Siehe
http://msdn.microsoft.com/de-de/library/ms175821.aspx
"Regeln für die Sichtbarkeit und Kennzeichnung von Objekten"

und auch: http://msdn.microsoft.com/de-de/library/ms190387.aspx
"Trennung von Benutzer und Schema"

Gruß Elmar
ChristianH
vor 15 Jahren
Permalink
Hi Elmar,

vielen Dank für die Hilfe!

Verstehe ich es richtig, dass mehrere Schemas für den Zugriff auf eine
Tabelle verwendet werden können?

Meine C# app bietet dem User die vorhandenen Tabellen zur Verfügung an, auf
welche er zugreifen möchte. Ich ermittle diese über den Funktionsaufruf
OPCConnection.GetSchema(..):DataTable
Im Result des obigen Aufrufs erhalte ich auch das Schema. Wenn es möglich
ist, dass mehrere Schemas für den Zugriff auf eine Tabelle verwendet, liefert
der obige Aufruf dann auch diese Informationen (Zugriff auf Tabelle1 ist mit
Schema1 und Schema2 möglich; Result enthält Einträge für beide Schemas)?

Grüße
Christian
...
Elmar Boye
vor 15 Jahren
Permalink
Hallo Christian,
Post by ChristianH
Verstehe ich es richtig, dass mehrere Schemas für den Zugriff auf eine
Tabelle verwendet werden können?
Nein. Nur kann ein Tabellen-/Objekt-Name jedem Schema erneut verwendet werden.
Und wird ein Name nicht mit dem Schema qualifiziert, so verwendet der SQL Server
das Standard-Schema des Benutzers, wie es in den bereits zitierten
"Regeln für die Sichtbarkeit und Kennzeichnung von Objekten" beschrieben wird.
Post by ChristianH
Meine C# app bietet dem User die vorhandenen Tabellen zur Verfügung an, auf
welche er zugreifen möchte. Ich ermittle diese über den Funktionsaufruf
OPCConnection.GetSchema(..):DataTable
Die Auflistung für Tabellen enthält dabei auch das Schema
(und den Katalog => Datenbank):
http://msdn.microsoft.com/de-de/library/cc668760.aspx
Post by ChristianH
Im Result des obigen Aufrufs erhalte ich auch das Schema.
das solltest Du dann mit anzeigen, z. B. wie im SSMS
Schema.Tabellenname
alternativ (für eine alphabetische Auflistung):
Tabellenname (Schema)

Und wenn Du anhand dessen SQL erzeugst, immer den Schemanamen
voranstellen.

Gruß Elmar
ChristianH
vor 15 Jahren
Permalink
Hi Elmar,

vielen Dank für die Infos und die Links.

Viele Grüße
Christian
...
Loading...