Glorf.it

Glorf IT

Bedenkliches aus dem IT-Alltag

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!

28. September 2008 um 23:05

Erweiterungen für CMS Made Simple

Heute schrieb ich meine erste eigene Erweiterung für das Content-Management-System "CMS Made Simple". Und was soll ich sagen? Es war wirklich einfach. Blöderweise fand ich keine echte Anleitung, aber für die "tags" gibt es genug Beispiele, die mit der Installation mitkommen, dass das kein Problem war. Leider kann ich den Sieg noch nicht mit der Welt teilen. Wir geben die Seite erst frei, wenn sie die anderen Features auch enthält. 😉

Falls einer mal ein "Module" für "CMSMS" schreiben will, der findet hier eine Anleitung dafür. Sie macht auf mich einen ordentlichen Eindruck. Aber das ist mir noch eine Nummer zu hart und für meine Zwecke wohl auch etwas over-sized…

28. September 2008 um 10:52

Datenpanne in Großbritannien: Soldaten auf USB-Sticks

"In Großbritannien häufen sich die Datenverluste bei Behörden." steht bei Heise-Online. Aber das glaube ich nicht. Ich denke, dass die Briten bzgl. der Information über solche Pannen schon weiter sind als wir. Ich glaube, dass es i den letzten Jahren genauso viele Pannen gab, die wurden aber einfach nur vertuscht. Außerdem bin ich davon überzeugt, dass es in Deutschland wenigstens genauso viele Datenpannen gibt. Die werden hierzulande vermutlich aber nicht veröffentlicht oder herunter gespielt.

Jedenfalls verschwanden in Britannien "drei USB-Speichermedien mit persönlichen Daten von bis zu 50.000 ehemaligen und aktuell dienenden Soldaten". Das ist ganz schön blöd für die betroffenen Soldaten…

24. September 2008 um 20:49

Free-Mail-Anbieter

Heute habe ich für einen freund mal eine Liste von Free-Mail-Anbietern gesucht. Das war gar nicht einfach. Ich poste einfach mal meine Fundstücke:

  • Eine recht kurze Liste "deutscher" Anbieter steht in der Wikipedia, z.B. fehlt hier Windows-Life. Wer mag, der kann das ja mal nachtragen.
  • Auch nicht länger, aber sehr informativ (naja, als Quelle wird ja auch Heise.de angeben).
  • Wer eine lange Liste sucht, der findet sie bei Kostenlos.de. Die Infos sind aber sehr spärlich.
  • Wer die Masse sucht, der ist bei Free
    Email Provider Guide
    gut aufgehoben. Allerdings sind nicht alle Links aktuell.

Viel Spaß.

23. September 2008 um 18:42

noreply@…de

Was soll ich von einer Firma halten, die mir eine Werbemail schickt um mich für deren Produkte zu interessieren, aber als Mailadresse "noreply@starmoney.de" angibt und noch am Ende schreibt:

Die E-Mail-Adresse noreply@starmoney.de ist keine Antwortadresse.

In der ganze Mail ist keine Mailadresse angegeben an die man sich wenden kann. Das interpretiere ich so, dass sie von mir keine Mail haben wollen. Aber meine Mail-Adresse sollte ich bei der Produktregistrierung angeben… Das kommt bei mir gar nicht gut an. So richtig überhaupt gar nicht. Wer den Dialog mit mir vermeiden will, der soll mich bitte auch mit seinen Monologen verschonen.

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… 🙁

22. September 2008 um 23:53

kostenpflichtiges Kundenmagazin

Am Wochenende bekamen wir Post von Cortal-Consors: die erste Ausgabe von deren Kundenmagazin. Ich habe das mal durchgeblättert, fand aber nichts wirklich spannendes. Bis ich auf die Vorderseite sah: Die wollen glatt 3 Euro für deren Kundenmagazin haben. Coole Idee: für die zugesandte Werbung zahlt der Kunde natürlich gerne. Ich freute mich sicher auch darüber, wenn ich für die SPAM nicht nur die Zustellgebühren (Bandbreite) zahlen müsste, sondern auch noch eine kleine Gebühr vom Anbieter abgerechnet bekäme… 😉

22. September 2008 um 00:14

Verständnis

Nun bin ich ja wirklich der Letzte, der sich über Tippfehler lustig machen kann. Deswegen habe ich lange gezögert diese Panne zu posten, auf die mich Thomas aufmerksam machte. Aber wenigstens als Nordlicht hat man da so seine Assoziationen, deswegen bin ich so frei. Beim Ausgang zum überdachten Raucherplatz im Innenhof hing vor ein paar Wochen dieser Zettel:

Natürlich findet man unter dem Stichwort "Beschitung" bei Google sogar Treffer.

22. September 2008 um 00:10

Bodo Wartke über Apple und die Deutsche Telekom

Anlässlich des Geburtstages meiner Tochter beschäftigte ich mich wieder mit den verschiedenen Handies. Deswegen suchte ich auch wieder den Song von Bodo Wartke über den Exklusivvertrag von Apple mit der deutschen Telekom. Ich sah ihn vor ein paar Monaten in einem Weblog, habe aber vergessen wo. Damit ich ihn demnächst finde, hier der Link zu dem Sketch "Brief an Steve". Den finde ich absolut super.

Ein paar andere von ihm finde ich übrigens fast genauso gut:

Auf seiner Homepage sind übrigens ziemlich viele Termine eingetragen bei denen man ihn auch Live erleben kann. Zum Beispiel nächsten Monat in Fürth.

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…

20. September 2008 um 21:44

fast fertig

Mit meinen letzten Kräften schickte ich heute die schon angemahnte Einkommenssteuererklärung per Elster ans Finanzamt. Leider streikte unser Drucken schon wieder! Nachdem bei der letzten wichtigen Aktion der Toner leer war, hat jetzt die Walze den Geist aufgegeben… Ich fasse es nicht!

Naja, die Walze ist jetzt schon bei einem Anbieter bestellt, der das Teil angeblich auf Lager hat. Mal sehen wann das ankommt. Mit etwas Glück schaffe ich die gesetzte Frist trotzdem… 🙂

Warum passiert sowas eigentlich genau dann, wenn es am meisten weh tut?

17. September 2008 um 22:30

Panne in Norwegen: Daten aller Steuerzahler öffentlich?

Hallo? Wurden da wirklich die Daten aller Steuerzahler an Medien verschickt? Die Daten kann man doch nie wieder einfangen. Bei TecChannel stehts im Detail, hier ein Ausschnitt:

Das Osloer Steueramt hat die komplette Liste aller 3,9 Millionen Steuerzahler mit Personennummer, Namen, Einkommen und Steuersatz auf CDs ganz offiziell an Medien geschickt.
Der Sprecher der norwegischen Datenschutzbehörde ist schockiert. "Das ist so schlimm wie die Datenskandale in Großbritannien", sagt Ova Skåra – und untertreibt damit noch. Während bei den Briten mehrfach hochsensible Datensätze über Millionen Bürger "nur" spurlos verschwanden, irgendwo vergessen wurden oder am Straßenrand zufällig gefunden wurden, hat das Osloer Steueramt gleich die komplette Liste aller 3,9 Millionen Steuerzahler mit Personennummer, Namen, Einkommen und Steuersatz auf CDs ganz offiziell an Medien geschickt.

Das ist doch man etwas Neues: Jetzt werden sogar die Einkommensverhältnisse veröffentlicht. In Italien kann man ja angeblich die Steuerdaten von jedem Bürgen einsehen – um Steuerhinterziehung zu erschweren. Aber das war hier wohl nicht die Motivation…

Dennoch ist die ganze Aufregung jetzt um die veröffentlichte Steuernummer entbrannt, nicht um das Einkommen! denn mit der ansonsten geheimen Steuernummer kann man offenbar allerlei Infos bekommen.