Dienstag, 31. März 2015

Liste der SQL Server Fehlercodes

Eine Liste der Fehlercodes, die der SQL Server ausgeben kann, findet sich in der Dokumentation. Wenn Sie jedoch gerade keinen Zugriff aufs Internet haben, können Sie auch den SQL Server direkt fragen:

select * from sys.messages

Das ist sehr praktisch, wenn Sie einen Fehlercode  haben und den vollständigen Text der Fehlermeldung nachschlagen möchten. Oder wenn Sie die deutsche Fehlermeldung kennen und den englischen Text wissen möchten um ihn zum Beispiel in einer Suchmaschine einzugeben. Das ist möglich, weil die Tabelle sys.messages alle Fehlermeldungen in 22 verschiedenen Sprachen enthält.


Tabelle sys.messages enthält jede Fehlermeldung in verschiedenen Sprachen
Welche language_id zu welcher Sprache gehört, können Sie in einer anderen Systemtabelle nachschlagen:

select *
from sys.syslanguages


In der Spalte msglangid dieser Tabelle finden Sie den zu language_id korrespondierenden Wert. In welcher Sprache Sie die Fehlermeldungen sehen, hängt von den Ländereinstellungen auf dem Betriebssystem des Clients ab, der die Verbindung zum SQL Server aufgebaut hat. Wenn Sie die Sprache für eine Verbindung umstellen möchten, können Sie das mit diesem Befehl machen:

SET LANGUAGE FRENCH; 

Mehr zur SET LANGUAGE Anweisung finden Sie in der MSDN.

Sonntag, 1. März 2015

SQL Server Migration Assistant (SSMA) und die Sortierreihenfolge der Datenbanken

Bei der Migration einer größeren Oracle Datenbank nach MS SQL Server haben wir den SQL Server Migration Assistant (SSMA) for Oracle in der Version 6 eingesetzt. Wirklich ein sehr hilfreiches Tool!

Laufzeitprobleme nach Umzug der Datenbank


Ein größeres Problem trat auf, nachdem wir die migrierte SQL Server Datenbank gesichert und auf einer anderen SQL Server Instanz wiederhergestellt hatten. Beim Ausführen von gespeicherten Prozeduren, die der SSMA generiert hatte, gab es auf einmal diesen Laufzeitfehler:

Msg 217, Level 16, State 1, Line 1
Maximum stored procedure, function, trigger, or view nesting level exceeded (limit 32).

Auf dem alten SQL Server funktionierten dieselben Funktionsaufrufe weiterhin fehlerfrei. Die Ursache musste also irgend etwas mit dem neuen Server zu tun haben.

Sortierreihenfolge als Fehlerursache


Um es kurz zu machen: Die Sortierreihenfolge der neuen SQL Server Instanz (Server Collation) war eine andere als auf dem alten Server. Dadurch hatte auch die Systemdatenbank master eine andere Sortierreihenfolge (Database Collation) als die auf dem alten Server. Erst einmal ist nicht ersichtlich, warum das zu Problemen führen könnte. Der Hintergrund ist Folgender: In der master Datenbank werden durch das SSMA Extension Pack drei Extended Stored Procedures installiert. Der vom SSMA generierte T-SQL Code verwendet Kompatibilitätsfunktionen (das sind die im Schema ssma_oracle), welche ihrerseits wiederum diese Extended Stored Procedures in master aufrufen.

Wenn die master Datenbank und die Benutzerdatenbank mit vom SSMA generierten T-SQL Code unterschiedliche Sortierreihenfolgen aufweisen, dann tritt reproduzierbar dieser Fehler auf.

Das Aufspüren dieser Fehlerursache hat unser Team viel Zeit gekostet. Vielleicht hilft diese Erläuterung ja jemandem, der ebenfalls auf dieses etwas exotische Problem stößt. Wir haben es übrigens beseitigt, indem wir die Sortierreihenfolge der Benutzerdatenbank umgestellt haben. Das ist einen weiteren Blog-Post wert, den ich in den nächsten Tagen schreiben werde.