Glorf.it

Glorf IT

Bedenkliches aus dem IT-Alltag

9. Oktober 2008 um 22:36

Mal ein Patch-Day ohne SQL Server

Nachdem uns der letzte Patch zum SQL-Server (CU9 behebt ein Problem in der GDIpluss.dll – wie kann man mit den SQL-Server-Tools manipulierte Bilddateien ansehen?) immer noch beschäftigt, bin ich ganz froh, dass beim Patchday nächste Woche kein SQL-Server_Patch dabei sein wird…

Wer mehr wissen will, findet hier die ganze Liste vorab: "Microsoft Security Bulletin Advance Notification for October 2008"

23. September 2008 um 00:03

user_id und suser_sid nicht zuverlässig

In den letzten Jahren hatten wir mehrere Fälle in denen die Funktion suser_sid am SQL-Server-2005 nicht anständig funktionierte. Ich habe ein paar Prozeduren geschrieben, die Logins anlegen. Darin wird meistens gefragt ob es den Login schon gibt ("IF suser_sid(N'LoginName') IS NULL …"). Wenn nicht, dann wird er mit CREATE-LOGIN angelegt. Alle paar Monate kommt es bei einem Kunden vor, dass genau hier die Meldung kommt, dass es den Login schon gibt. Das ist ziemlich eigenartig und bei uns intern nicht reproduzierbar. Beim Kunden auf dessen System kann man das dann aber sehr gut reproduzieren.

Deswegen bin ich wieder dazu übergegangen – wie damals – auf die System-Views zuzugreifen (z.B. sys.syslogins). Nicht schön, aber das funktioniert immer.

Heute trat das gleiche Problem erstmalig mit user_id() auf! Gleiches Szenario: Wenn es den User noch nicht gibt ("IF user_id(N'UserName') IS NULL EXEC sp_adduser …"), dann lege ihn an. Da kam bei einem Kunden die Meldung, dass es den User schon gäbe. Das finde ich ja sowas von lästig!

Ich rate daher – entgegen der Meinung von Microsoft – von der Verwendung von SUSER_SID und USER_ID ab. Dann wohl doch lieber die daten selber aus den System-Views lesen… 🙁

21. September 2008 um 17:25

Try-Catch mit Nebenwirkungen auf Cursor

Seitdem sie mit SQL-Server-2005 eingeführt wurde, bin ich ein Fan der neuen Fehlerbehandlung. Deswegen empfahl ich deren Einsatz auch gleich in unseren Richtlinien. Leider mussten wir kürzlich feststellen, dass sie unerwartete Nebenwirkungen hat.

Wir setzen bei uns ganz gerne Stored-Procedure und Functions ein. Nicht nur wegen der – in der Regel – besseren Performance gegenüber den Alternativen, sondern auch weil man deren Implementierung ändern kann ohne das Anwendungscoding anpassen zu müssen. Jetzt hat ein Kollege in seine Stored-Procedure die alte @@ERROR-Fehlerbehandlung durch die Neue mit TRY-CATCH ersetzt und bekam einen hässlichen Fehler. Wir konnten das ganz leicht reproduzieren und sind im Gespräch mit Microsoft über das Verhalten.

  • Man benötigt eine Client-Anwendung, die Daten aus einer Stored-Procedure über einen Cursor liest. In unserem Fall war das eine Windows-32-Anwendungen auf Basis MFC/ODBC, aber das ist fast egal: Mit ADO/OLEDB passiert das gleiche, weil sich der Server komisch verhält.
  • Die Anwendung öffnet einen Cursor, der auch rückwärts navigieren kann, also z.B. static. (Um das mit ODBC zu reproduzieren, muss man mit Srever-Cursors arbeiten. Man darf hier also nicht die Client-Library verwenden, weil damit die kompletten Daten in einen Cache am Client geladen werden und dann dort navigiert wird. Aber wer holt sich diese Spaßbremse schon freiwillig ins Boot, sie wurde eingeführt um ODBC-Treibern ohne Cursor-Unterstützung auf die Sprünge zu helfen. Auf Kosten der Performance…)
  • Das ResultSet kommt aus einer Procedure P1, die im einfachsten Fall nur ein einzelnes SELECT enthält.
  • Die Anwendung öffnet den Cursor, liest ein paar Sätze und springt dann wieder zum ersten Datensatz.

Wenn in der Stored-Procedure nun ein TRY-CATCH um das SELECT gemacht wird, dann treten in dem Szenario plötzlich ein Fehler auf, weil der Rücksprung auf dem Cursor nicht mehr möglich ist. Auch parallel geöffnete, andere Client-Cursor – auf der gleichen Connection – können nicht mehr parallel gelesen werden.

Das liegt daran, dass der SQL-Server anstelle des Static-Cursors auf der Server-Seite plötzlich ein Default-ResultSet ("forward-only/read-only", auch als "Firehose"-Cursor" bekannt) verwendet. Und das kann freilich keine Rücksprünge. Das Default-ResultSet belegt ja bekanntlich auch die ganze Connection und verhindert das andere Cursor ausgelesen werden bis das Default-ResultSet wieder geschlossen wurde. (MARS hilft bei Verwendung der "alten" Schnittstellen wir MFC übrigens auch nicht wirklich weiter.) Schade, dass das von Microsoft nicht dokumentiert wurde.

Wer denkt, er sei mit seiner .Net-Anwendung aus dem Schneider, den muss ich leider enttäuschen, auch hier werden unter der Haube Cursors verwendet, um die Daten auszulesen. Aber freilich kommt es in der Regel nicht vor, dass auf den Cursors rumnavigiert wird.

Daher werden wir wohl empfehlen müssen, dass die neue Fehlerbehandlung genau dann nicht eingesetzt wird, wenn das ResultSet mit einem Cursor ausgelesen wird, auf dem entweder rauf und runter navigiert wird oder parallel auf andere Cursor zugegriffen wird. Leider ist das bei den meisten unserer bestehen Windows-32-Anwendungen so. Erst die neue Programmgeneration geht anders vor…

17. September 2008 um 22:06

kostenloses eBook zum SQL-Server-2008

Mein Kollege Christian machte mich heute auf das kostenlose eBook von Microsoft aufmerksam: "Introducing Microsoft SQL Server 2008" von Peter DeBetta, Greg Low (allen SQL-Passlern vom diesjährigen "european congress" in Neuss bestens bekannt) und Mark Whitehorn. Man benötigt allerdings wieder einen Microsoft-Account (also passport, live oder so).

Ich finde es angenehm, dass in dem Buch nur die Neuigkeiten im SQL-Server 2008 beschrieben werden. Es richtet sich also an alte Hasen. Auf 231 Seiten finden sich meiner Ansicht nach alle wichtigen Dinge.

15. September 2008 um 21:58

Viel Aufregung um eine einzige Datei

Schon während meines Urlaubes bemerkte ich, dass Microsoft mit dem "Microsoft Security Bulletin MS08-052" einen weiteren Hotfix zum SQL-Server-2005 rausbrachte. Aber weil es sich dabei nur um ein Problem in der Datei "Gdiplus.dll" (Windows GDI+) handelt, sind nur die Werkzeuge des SQL-Servers betroffen, genauer vorwiegend das "SQL Server Management Studio". Deswegen gibt es den Hotfix auch nicht für die SQL-Server-Express-Edition ohne Tools. Wie ich nun hörte, macht Microsoft da einen riesen Wirbel drum.

Eigentlich würde es wohl ausreichen, wenn Microsoft die eine DLL austauscht. Statt dessen liefern die Genossen den kompletten CU9 mit 145 MBytes per Windows-Updates aus. Starke Leistung. Und so gut mitgedacht.

Die DLL wird übrigens auch noch noch im Windows, Visual-Studio, Office und Visio mitgebracht und jeweils in separaten Paketen gefixt. Auf meinem heimischen Rechner fand ich in 15 Verzeichnissen Exemplare der Datei. Aber im SQL-Server-Verzeichnis nicht. Schon komisch.

Immerhin sind die gefixten Probleme recht spektakulär: man kann durch manipulierte Bild-Dateien eine Code-Execution reinschmuggeln (in BMP-, WMF-, GIF- und EMF-Dateien, sowie durch Farbverläufe, die auf VML basieren). Klar, mit den SQL-Server-Werkzeugen werden ja auch so viele Bilder angezeigt. Gibt es überhaupt eine Stelle, in den SQL-Server-Tools, die Bild-Dateien des Anwenders anzeigen? Das muss ich verpasst haben. Ich vermute, man muss schon Dateien des SQL-Servers austauschen. Was aber ohnehin nur Admins dürfen.

4. September 2008 um 10:58

Heroes

Microsoft unterstützt die "Community"-Bildung regelmäßig durch allerlei Aktionen. Durch eine Info von Klaus Oberdalhoff wurde ich auf "Heroes happen here" aufmerksam. In diesem Rahmen werden beim nächsten SQL-Pass-Vortrag in Nürnberg (Thema "Data-Mining mit dem SQL-Server") am 9.9.08 eine ganze Reihe von Softwarepaketen verlost:

  • drei Heroes-Pakete (not for resale) mit jeweils einer 2008-er Lizenz von Visual Studio Standard, Windows Server Enterprise und SQL Server Standard,
  • ein Windows Vista Ultimate (not for resale) und
  • eine SQL Server Readiness DVD (not for resale)

Das finde ich ganz schön beachtlich! Deswegen habe ich mal geschaut, was Microsoft zu der Aktion schreibt und stieß als erstes auf eine recht amüsante Comic-Reihe von Microsoft. Die restlichen Infos fand ich nicht so ergiebig…

2. September 2008 um 14:29

Data-Mining mit dem SQL-Server in Nürnberg

Genau in einer Woche kann man sich im Rahmen des Vortrages "Data Mining als Erfolgsfaktor – Einführung in Data Mining mit dem SQL Server" über ein relativ unbekanntes Gebiet informieren. Ich denke, dass hier noch jede Mange Potential steckt, dass sich den Firmen erst langsam erschließt.

Im Rahmen der SQL-Pass Franken treffen sich wieder alle Datenbänker in Nürnberg. Hier die Details:

Ich finde es schön, dass der Ort diesmal mit den öffentlichen Verkehrsmitteln so gut zu erreichen ist. Mit ein wenig Glück ist auch da ein nettes Lokal in der Nähe in dem wir den Abend ausklingen lassen können.

25. August 2008 um 13:53

SQL-Server-Hotfix-Installation stürzt Windows in den Abgrund

Neulich stellten wir bein unseren Tests fest, dass die Installation des Cumulative update package 8 (CU8) auf einem SQL-Server-2005 mit SP2 Windows-XP mit SP2 abstürzen lässt. Und zwar so radikal, dass noch nicht mal ein Blue-Screen kommt. Das Problem war leider bei Microsoft nicht bekannt.

Vermutlich weil das Problem auf aktualisierten Systemen nicht auftritt. Mein Kollege Stefan fand aus den 163 Hotfixes den heraus, der notwendig ist, damit der CU8 auch auf WinXP mit Sp2 installiert werden kann: KB926255. Darin wird nur eine Datei geändert (sxs.dll). Schon komisch…

8. August 2008 um 17:51

Bessere Performance durch Datenkompression in Datenbanken?

Bei TecChannel.de einen Artikel zu Datenbanken zu finden, ist schon eher ungewöhnlich. Der Artikel "Datenkompression in SQL-Datenbanken" ist etwa auf Level 100 bis 200 und somit ein ganz guter Einstieg in das Thema. Weil heutzutage das Lesen und Schreiben von Daten tatsächlich noch in fast allen Fällen der Flaschenhals ist, ist das alte Thema immer noch relevant.

Folgende Aspekte werde hier unter dem Stichwort "Komprimierung" genannt, die dahin abzielen, dass auf eine Datenseite möglichst viele Datensätze passen:

  • Verwendung numerischer Typen anstelle von Zeichenketten
  • Verwendung von Unicode nur wo es wirklich nötig ist (SQL-Server speichert Unicode-Zeichen das als UTF-16): Der Platzbedarf sei typischerweise um 40 bis 60 Prozent höher.
  • Verwendung von numerischen Werten mit variablen Feldgröße (geht nur mit der SQL Server 2008 Enterprise Edition)
  • Seiten- oder Tabellen-Kompression bei vielen doppelten Werten nutzen (auch das geht nur mit der teuren SQL Server 2008 Enterprise Edition). Einen Performancevergleich findet man hier. Das beeindruckt.

Wer richtig große Datenbanken betreut und sich die Enterprise-Edition leisten kann, sollte sich die neuen Features dazu mal ansehen. Aber auch im Kleinen lohnt es sich Platz zu sparen.

7. August 2008 um 20:32

SQL Server 2008

Warum Microsoft für den Start des SQL-Servers-2008 einen Formel-1-Rennwagen gewählt hat, kann man jetzt fleißig spekulieren…

Preis, Sprittverbrauch, Bodenhaftung? Ja, OK: Vermutlich auch die Höchstgeschwindigkeit. Obwohl ja bei Datenbanken eher der Durchsatz wichtig ist und gerade die Formel-1-Piloten gerne andere am vorziehen hindern. 😉

Aber dennoch ist jetzt endlich der SQL-Server-2008 zum Download verfügbar – öffentlich und kostenlos natürlich nur die Express und die Evaluation-Edition. Mit 180-Tagen kann man das schon gründlich testen.

Ich hatte ja ehrlich gesagt im Herbst damit gerechnet. Zu dumm, dass mich die Umzugsabteilung heute in der Firma offline geschaltet hat. Aber das ist eine andere Geschichte…

PS: Und hier ist die Auflösung aus der Presseinfo von Microsoft:

Bereits im Einsatz ist der Microsoft SQL Server 2008 zum Beispiel in der Formel 1. Gemeinsam mit McLaren Electronic Systems hat Microsoft die elektronische Kontrolleinheit ECU (Electronic Control Unit) entwickelt, die Telemetriedaten im Umfang von 1 GB vom Antriebsstrang der Fahrzeuge erfasst und mit einer Übertragungsrate von 100/500 KB pro Sekunde an die Rennställe übermittelt.

31. Juli 2008 um 00:08

Nun doch keinen Bugfix für NewID

Als ich den aktuellen Newsletter des "SQL Server Magazine" las, fiel mir gleich der Artikel "Puzzled by T-SQL: Bug with NEWID Function " von Itzik Ben-Gan auf. Darin greift er das Problem auf bei dem ich ihn um Hilfe bat.

Offenbar war die Sache mit der letzten Eskalation noch nicht ausgestanden. Das zuständige Team lehnte den Bugfix nun doch ab. Den kompletten Wortlaut kann man hier nachlesen. Ich verstehe die Begründung so:

  • Ja, das ist ein Bug, aber
  • das kommt so selten vor, dass
  • es schlimmer wäre das zu berücksichtigen und damit der Performance in vielen Fällen zu Unrecht zu drücken
  • als ab und zu mal Unsinn anzuzeigen.

Schade! Sehr schade.

30. Juli 2008 um 00:10

Paul Randal antwortet

In der neuesten Ausgabe des TechNet Magazine August 2008 beantwortet Paul Randal wieder ein paar interessante Fragen:

  • Wie kann ich eine 2005er Datenbank auf einen 2000er SQL-Server transportieren? (Export/Import)
  • Wann nutzt Partitionierung?
  • Welche Konsistenzprüfungen eignen sich wann?

Ich fand das ganz interessant. Hier steht es.

Außerdem gibt er noch Tipps für eine effektive Datenbankwartung. Dieser Artikel enthält echte Hardcore-Infos für den angehenden SQL-Server-Fachmann. Wer diesen Artikel nicht liest ist selber schuld…