Glorf.it

Glorf IT

Bedenkliches aus dem IT-Alltag

30. September 2008 um 19:00

VS Developer- und Database-Edition werden zu einem Produkt

Heute veröffentliche Microsoft eine Pressemitteilung in der alle möglichen tolles Features des Visual-Studio-2010 veröffentlicht werden. Das ist schon interessant, aber was mich glatt von Sockel haute: Die Developer- und Database-Editionen werden zu einem Produkt! Die Database-Edition ist einfach klasse, aber wahnwitzig teuer, weil die meisten Entwickler ohnehin auch schon die Developer-Edition haben. Das kam bei Microsoft inzwischen wohl auch an. Ich bin ziemlich aus dem Häuschen, weil uns damit das Leben zukünftig schon gewaltig erleichtert wird.

In VSTS 2010 werden die derzeit separat verfügbaren Development Edition und Database Edition miteinander zu einem einzelnen Produkt kombiniert. Um den Vorteil dieser Kombination schon jetzt zur Verfügung zu stellen, erhalten alle Software Assurance-Kunden und Besitzer einer Version von Visual Studio Team System 2008 (Developer oder Database Edition) die jeweils andere Vollversion ab 1. Oktober 2008 kostenlos.

Ich bin mir nicht sicher, ob das gut oder schlecht ist. Es ist gut, weil wir die Database-Editon aus Kostengründen nicht in der Firma hätten verteilen können. Es ist schlecht, weil damit die Database-Edition faktisch aufhört zu existieren. Wer weiß, ob die Weiterentwicklung der Database-Teile weiterhin so voran getrieben wird. Wer alles davon profitiert beschriebt Gerd Drapers in seinem Blog:

As an MSDN subscriber we want you to realize the benefit of this merged feature set now, which is why we are extending this exclusive offer. If you have either the Visual Studio Team System 2008 Development Edition with MSDN Premium subscription or the Visual Studio Team System 2008 Database Edition with MSDN Premium subscription, on October 1, 2008 you will have access to both the Development Edition and Database Edition through MSDN Subscriber Downloads. This change also applies to customers who purchased Visual Studio 2005 Team Edition for Software Developers with MSDN Premium Subscription and Visual Studio 2005 Team Edition for Database Professionals with MSDN Premium Subscription.

Der Blog-Artikel hat den Titel "Team Developer + Team Data = Team Developer!". Ich finde, sein Artikel klingt weniger nach Enthusiasmus als nach Wehmut. Das drückt mir dann schon eine Träne aus dem Knopfloch…

29. September 2008 um 21:30

benannte Constraints auf temporären Tabellen

Es gibt Dinge, die tut man einfach nicht. Ja, wirklich, da gibt es weltweite ungeschrieben Gesetze. Zum Beispiel nimmt man keine Stifte von anderen Leuten mit und von Kollegen schon gleich gar nicht. Dennoch passiert sowas immer wieder.

Genauso benutzt man in Prozeduren keine temporären Tabellen. Außer vielleicht in wenigen Ausnahmen, wo der Overhead kaum ins Gewicht fällt und sogar die Abläufe etwas vereinfacht. Aber auf diese Tabellen legt man keine benannten Constraints an. Warum auch? Will man die separat wieder entfernen können? Wenn überhaupt, dann also bitte nur "inline". Wer anderer Meinung ist, der möge weiter lesen…

Der Name von benannte Constraints muss auch auf temporären Tabellen datenbank-weit eindeutig sein. Wenn die Prozedur also parallel ausgeführt wird (dafür sind Prozeduren ja da), dann knallt es. Folgender Code in zwei Session gleichzeitig ausgeführt, ist ungesund:
IF object_id('tempdb..#bla') IS NOT NULL
DROP TABLE #bla

CREATE TABLE #bla
(ID int)

ALTER TABLE #bla
ADD CONSTRAINT c_bla_check CHECK (ID > 0)

In der zweiten Sitzung kommen dann diese netten Meldungen:

Msg 2714, Level 16, State 4, Line 1
There is already an object named 'c_bla_check' in the database.
Msg 1750, Level 16, State 0, Line 1
Could not create constraint. See previous errors.

Das passiert mit jedem benannten Constraint, auch mit Fremd- und Primärschlüsseln – bei Indexen hingegen nicht. Dabei spricht wenig gegen anständige "inline" definierte Constraints in temporären Tabellen (außer der Performance, die verbraten wird, natürlich):

IF object_id('tempdb..#bla') IS NOT NULL
DROP TABLE #bla

CREATE TABLE #bla
(ID int
CHECK (ID > 0))

Diesen Hinweis bekam ich übrigens von meinem Kollegen Markus. Danke!

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.