Benutzer mit den meisten Antworten
Tabelle "syslogins" wird von System View überlagert

Frage
-
Hallo,
ich habe ein etwas kurioses Problem, das ich nicht verstehe: Ich habe in einer Datenbank eine Tabelle "SysLogins". Das Anlegen funktioniert ohne Probleme, aber wenn ich nun versuche Daten abzufragen (z.B. ganz simpel im ManagementStudio über "Oberste 1000 Zeilen auswählen") kommen Fehlermeldungen, dass die Spaltennamen ungültig wären. Nach längerer Suche habe ich nun bemerkt, dass es eine System View "sys.syslogins" gibt. Scheinbar wird mein SELECT irgendwie auf diese Ansicht "umgeleitet" - und das obwohl ich den Namen meiner Tabelle "voll-qualifiziert" angebe:
SELECT TOP 1000 [GGUID]
,[USERGGUID]
,[LOGINCLIENT]
,[LASTLOGINTIMESTAMP]
,[LOGINCOUNT]
,[DOMAINID]
,[LOGINCLIENTVERSION]
,[META]
FROM [teamcrm1].[dbo].[SysLogins]Mache ich hier irgendwas falsch oder ist das ein Fehler im SQL Server? Übrigens tritt das Problem erst mit SQL Server 2012 auf - unter SQL Server 2008 hat es noch funktioniert, obwohl es die View "sys.syslogins" da auch schon gab.
Kann mit irgendwer weiter helfen?
Vielen Dank im Voraus!
Antworten
-
Hallo Andreas,
das dürfte schwierig werden, da diese Sichten in jede Datenbank eingeblendet werden.
Auch wenn es "weh tut", Due solltest es ändern und auf "sys" auf jeden Fall verzichten, da kann es immer mal was "Neues" geben.
Hintergrund ist der letzten Abschnitt in Compatibility Views:
When referenced in a user database, system tables which were announced as deprecated in SQL Server 2000 (such as syslanguages or syscacheobjects), are now bound to the back-compatibility view in the sys schema. Since the SQL Server 2000 system tables have been deprecated for multiple versions, this change is not considered a breaking change.
Example: If a user creates a user-table called syslanguages in a user-database, in SQL Server 2008, the statement SELECT * from dbo.syslanguages; in that database would return the values from the user table. Beginning in SQL Server 2012, this practice will return data from the system view sys.syslanguages.
Leider nur in der englischen Dokumentation zu finden.
Gruß Elmar
- Als Antwort vorgeschlagen Stefan FalzModerator Samstag, 28. Juni 2014 10:01
- Als Antwort markiert bubiboeller Montag, 30. Juni 2014 08:39
Alle Antworten
-
Hallo,
syslogins war eine alte Sicht/ Pseudo-Tabelle beim SQL Server 2000 und früher... Sie existiert aus Kompatibilitätsgründen auch noch bei den aktuellen SQL Server Versionen, nur dass das Schema für Systemsichten auf "sys" geändert wurde - aber auch "dbo" wird der Kompatibilität zu Liebe gefunden.
Moral von der Geschichte ist:
Nenne Deine Sicht anders. Dabei sollte man beim Namen das Präfix "sys" generell vermeiden, da es weitere Sichten in dem Bereich gibt - siehe Kompatibilitätssichten.Gruß Elmar
-
Hallo,
danke für die Antwort!
Verstehe ich das richtig, dass es also bei diesen Kompatibilitätssichten egal ist, ob ich als Schema "sys" oder "dbo" verwende? Dann wundert mich jetzt nur noch, dass es unter SQL Server 2008 noch funktioniert hatte - da bin ich mit demselben SELECT auf meiner Tabelle und nicht auf der System View gelandet ...
Das Umbenennen der Tabelle ist leider nicht so einfach, weil das Ganze eben schon ein bestehendes System ist. Gibt es vielleicht eine Möglichkeit die View "sys.syslogins" irgendwie auszublenden?
Viele Grüße
Andreas
-
Hallo Andreas,
das dürfte schwierig werden, da diese Sichten in jede Datenbank eingeblendet werden.
Auch wenn es "weh tut", Due solltest es ändern und auf "sys" auf jeden Fall verzichten, da kann es immer mal was "Neues" geben.
Hintergrund ist der letzten Abschnitt in Compatibility Views:
When referenced in a user database, system tables which were announced as deprecated in SQL Server 2000 (such as syslanguages or syscacheobjects), are now bound to the back-compatibility view in the sys schema. Since the SQL Server 2000 system tables have been deprecated for multiple versions, this change is not considered a breaking change.
Example: If a user creates a user-table called syslanguages in a user-database, in SQL Server 2008, the statement SELECT * from dbo.syslanguages; in that database would return the values from the user table. Beginning in SQL Server 2012, this practice will return data from the system view sys.syslanguages.
Leider nur in der englischen Dokumentation zu finden.
Gruß Elmar
- Als Antwort vorgeschlagen Stefan FalzModerator Samstag, 28. Juni 2014 10:01
- Als Antwort markiert bubiboeller Montag, 30. Juni 2014 08:39