Glorf.it

Glorf IT

Bedenkliches aus dem IT-Alltag

9. September 2009 um 23:15

5 Jahr SQL-Pass: Jubelfeier in Nürnberg mit Infos zum SQL Server 2008 R2

SQL-PASS
Alle Interessierten sind zu unserem Jubiläumstreffen "5 Jahre PASS Deutschland" zur Regionalgruppe Franken am Dienstag, den 15.09.2009 um 18:30 Uhr, eingeladen.

Der PASS Deutschland e.V. wurde am 31.08.2004 gegründet und feiert deshalb im August/September 2009 in allen Regionen das fünfjährige Bestehen. Zu diesem Jubiläum sind in allen Regionen Treffen der Regionalgruppen mit besonderem Inhalt geplant:

SQL Server 2008 R2: Self Service BI, SQL Server Data Warehouse Scale Out und weitere Neuheiten. Referent ist Oliver Goletz, Microsoft. Hier die offizielle Info zu dem Vortrag:

In der ersten Hälfte 2010 wird Microsoft basierend auf der SQL Server Technologie die Basis für eine Scale-out SQL Server Lösung für sehr große DWH liefern. Das derzeit unter dem Codenamen Madison bekannte Produkt basiert auf der MPP-Technologie (Massively Parallel Processing), die von DATAllegro entwickelt und von Microsoft erworben wurde. Mit dieser Technologie, die sich schon im Praxiseinsatz bewährt hat, werden DWH im Bereich von mehreren 100 TB möglich sein.

Im Bereich Business Intelligence wird mit dem Produkt Gemini ein In-Memory Online Analytic Processing (OLAP) Client integriert, der "Self Service BI" durch Datenanalyse in großem Umfang und die Datenmodellierung in Excel auf Basis verschiedenster Datenquellen in der Office Plattform ermöglicht.

Oliver Goletz hat nach seinem Studium der Wirtschaftsinformatik in Köln sechs Jahre bei einem Microsoft Gold Partner SQL- und BI-Projekte durchgeführt. Danach arbeitete er anderthalb Jahre als Projektmanager für die Siemens AG in Schanghai und Beijing. Seit zwei Jahren ist er als Technologieberater für Großkunden im Bereich SQL und BI bei Microsoft Deutschland tätig. In dieser Rolle führt er regelmäßig Kundenveranstaltungen und EBCs sowie Deep-Dive SQL-Partnertrainings durch.

Wir treffen uns diesmal in einem größeren Rahmen, in den Konferenzräumen des Eurocom Centers, Lina-Ammon-Str. 19 (Erdgeschoss) in Nürnberg. Das liegt verkehrsgünstig direkt an der U-Bahn-Station Scharfreiterring.

Und wie jedes Mal so ist auch diesmal der Eintritt frei, auch Nicht-Mitglieder sind herzlich eingeladen. Bitte dennoch bei Klaus Oberdalhoff unter kob(ät)sqlpass.de anmelden, damit er weiß, wie viele Stühle ungefähr benötigt werden.

9. September 2009 um 00:52

Erster Tag nach dem Urlaub

Heute (hm, Ok, mittlerweile gestern) hatte ich meinen ersten Arbeitstag nach dem Urlaub. Dabei fiel mir mein Einstieg ins System unerwartet schwer: mein Konto im Active-Directory war nämlich deaktiviert.

Bei uns muss man alle 6 Monate das Passwort ändern. 14 Tage vor Ablauf wird man täglich mit der Aufforderung zum Ändern genervt. Bevor ich in Urlaub ging, kam die Meldung noch nicht. Jedenfalls erinnere ich mich nicht daran. Aber auch 2 Tage vor dem Urlaub hätte ich mein Passwort wohl kaum geändert… 😉

Und heute konnte ich mich zwar am Computer anmelden, aber kam aber nicht ins Netz: kein Outlook, kein Intranet, nichts… Die Nachfrage bei unserer Hotline ergab, dass es tatsächlich Probleme gebe. Mein Konto sei bereits 0,9 Tage deaktiviert, weil ich mein Passwort nicht fristgemäß änderte. Der freundliche Kollege hob die Deaktivierung auf und musste dazu aber ein neues Einmal-Passwort vom System vergeben lassen. Nun war die Frage wie ich an das Passwort kommen sollte. Er konnte es per Mail oder SMS verschicken. Blöd war, dass ich mein Handy im Urlaub nicht ausgeschaltet hatte. Daher war es leer. Mein Handy ist überhaupt immer leer, wenn ich mal telefonieren will… Weil ich recht früh kam, war auch keiner meiner "Nachbarn" schon da. Diktieren könne er es nicht, weil er es nicht sah. An sich selber schicken und diktieren ginge auch nicht, weil er kein fester Mitarbeiter, sondern Leasingkraft sei. Bei uns wird Sicherheit echt groß geschrieben!

Also doch per SMS an mein Handy. Es war zum Glück recht flott so weit aufgeladen, dass ich eine SMS lesen konnte. Wie gesagt der Einstieg fiel mir heute besonders schwer… 😉

1. September 2009 um 18:14

SQL-Injection für Fortgeschrittene

In dem Artikel "Advanced SQL Injection In SQL Server Applications" beschreibt Chris Anley (NGSSoftware) sehr ausführlich wie SQL-Injection am SQL-Server funktioniert. Darin findet man problemlos die Anleitung wie man vorgehen muss, um einen SQL-Server mit dieser Lücke zu übernehmen. Natürlich geht er vom schlimmsten Fall aus, dass nämlich die Anwendung Admin-Rechte am SQL-Server hat, aber das ist ja auch nicht ganz unrealistisch.

Das ist eine Pflichtlektüre für jeden, der Software mit Zugriffen aus dem Microsoft SQL Server schreibt. Danach weiß man, was man besser absichern sollte und warum… 😉

31. August 2009 um 18:07

SQL Server: Langläufer

In dem Artikel "Wer sind heute meine 5 Langläufer? " beschrieb ich ein gefundenes SQL-Statement mit dem man sich Infos zu den langsamsten SQL-Statement anzeigen lassen kann. Im Laufe der zeit modifizierte ich die Abfrage immer weiter.

Hier ist die verbesserte Fassung, die viele weitere interessante Angaben über den Befehl macht:

SELECT TOP(200)
qs.execution_count AS "Executions",
CAST(CAST(qs.total_elapsed_time AS NUMERIC(20,4))/1000/qs.execution_count AS NUMERIC(20,4)) AS "AvgDuration[ms]", – Umrechung in Millisekunden
CAST(CAST(qs.total_worker_time AS NUMERIC(20,4))/1000/qs.execution_count AS NUMERIC(20,4)) AS "AvgCpuTime[ms]", – Umrechung in Millisekunden
SUBSTRING(st.text,(qs.statement_start_offset+2)/2, – Offset wird in Bytes angegeben
(CASE WHEN qs.statement_end_offset = -1
THEN LEN(CAST(st.text AS NVARCHAR(MAX)))*2
ELSE qs.statement_end_offset
END – qs.statement_start_offset)/2) AS "SqlStatement",
CAST(CAST(qs.last_elapsed_time AS NUMERIC(20,4))/1000 AS NUMERIC(20,4)) AS "LastDuration[ms]", – Umrechung in Millisekunden
CAST(CAST(qs.last_worker_time AS NUMERIC(20,4))/1000 AS NUMERIC(20,4)) AS "LastCpuTime[ms]", – Umrechung in Millisekunden
CAST(CAST(qs.total_elapsed_time AS NUMERIC(20,4))/1000 AS NUMERIC(20,4)) AS "TotalDuration[ms]", – Umrechung in Millisekunden
CAST(CAST(qs.total_worker_time AS NUMERIC(20,4))/1000 AS NUMERIC(20,4)) AS "TotalCpuTime[ms]", – Umrechung in Millisekunden
qs.total_logical_reads AS "TotalLogicalReads",
qs.total_physical_reads AS "TotalPhysicalReads",
qs.total_logical_writes AS "TotalLogicalWrites",
qs.creation_time AS "FirstExecution",
qs.last_execution_time AS "LastExecution",
db_name(st.dbid) AS "Database"
FROM sys.dm_exec_query_stats AS qs
CROSS APPLY sys.dm_exec_sql_text(sql_handle) AS st
WHERE qs.total_elapsed_time > 0
ORDER BY "AvgDuration[ms]" DESC, qs.execution_count DESC

Viel Erfolg damit… 🙂

30. August 2009 um 18:18

Test-Special über Fahrräder

Wer bei der aktuellen Aktion "Mit dem Rad zur Arbeit" mitmacht oder einfach nur so gerne mit dem Rad fährt, der findet vermutlich das Special von Stiftung Warentest zu Fahrrädern interessant. Dort gibt es Artikel zu den Themen:

  • Fahrradkauf
  • Sicherheit
  • Beifahrer Kind
  • Verkehrsregeln
  • Gegen Diebstahl
  • Reparatur + Pflege
  • Routenplanung
  • Rad als Gepäck

Weitere Tipps gibt es auch beim ADFC (etliche allerdings nur kostenpflichtig).

28. August 2009 um 17:59

Welche Objekte belegen wie viele Datenseiten im Cache-Buffer?

Wenn man im SQL Server 2005 wissen will, was so alles im Datencache steht, dann kann man sich mit Hilfe der Data Management View "sys.dm_os_buffer_descriptors" einen Überblick verschaffen. Man erfährt welche Seite in den Cache geladen wurden.

Mit diesem Statement sieht man sogar wie viele Seiten aktuell von welcher Tabelle aus welcher Datenbank im Cache "belegt" werden:

SELECT CASE GROUPING(db.name) WHEN 0 THEN db.name ELSE N'#all dbs#' END AS [dbname],
CASE GROUPING(object_name(p.object_id)) WHEN 0 THEN object_name(p.object_id) ELSE N'#all objects#' END AS [objname],
CASE GROUPING(p.index_id) WHEN 0 THEN CAST(p.index_id AS NVARCHAR) ELSE N'#all indexes#' END AS [indexid],
COUNT(page_id) AS [pagecount]
FROM sys.dm_os_buffer_descriptors AS bd
JOIN sys.allocation_units AS au
ON bd.allocation_unit_id = au.allocation_unit_id
JOIN sys.partitions p
ON au.container_id = p.hobt_id
JOIN sys.databases as db
ON bd.database_id = db.database_id
GROUP BY db.name, object_name(p.object_id), p.index_id WITH ROLLUP
ORDER BY [pagecount] DESC

Ich hoffe das hilft jemandem… 😉

27. August 2009 um 18:35

Defraggler

Über die PC-Welt wurde ich auf das Tool Defraggler aufmerksam. Damit kann man unter Windows recht komfortabel Partitionen oder auch nur einzelne Dateien defragmentieren. Und das beste ist, dass man das Programm auch einfach auf einen Stick kopieren kann. Es läuft dann ohne Installation. Ich finde das Werkzeug prima. Allerdings kommt es mir etwas langsam vor…

26. August 2009 um 18:18

History of Video Games

Auf der Seite "History of Video Games" unter computerspielemuseum.de findet man eine nette Zusammenstellung von bahnbrechenden Video-Spielen und auch Computerspielen. Man muss Flash leider erlauben um etwas sehen zu können.

Atari wird mit etlichen Meilensteinen erwähnt (natürlich auch "Pong"), ebenso M.U.D. und andere bahnbrechende Spiele. Daneben werden aber auch webweisende Romane erwähnt und bedeutende Spiele-Hardware. Die Ansicht ist etwas spartanisch, aber dennoch einen Blick wert…

via knuttz
25. August 2009 um 18:19

Mit SQL Server Text-Dateien schreiben

Wie man mit dem SQL-Server Text-Dateien einlesen kann, wusste ich schon länger. Dazu musste man früher OpenRowSet mit einem ODBC-Text-Treiber verwenden:

SELECT *
FROM OPENROWSET('MSDASQL',
'Driver={Microsoft Text Driver (*.txt; *.csv)};DEFAULTDIR='E:\data;Extensions=txt;',
'SELECT * FROM [test.txt]') AS t;

Aber das war tricky und der Output war immer pro Zeile ein Datensatz. Freilich konnte man auch die Daten mittels "BULK INSERT" in eine Tabelle laden, aber auch das war umständlich. Seit SQL-Server-2005 gibt es dazu eine gute und dokumentierte Lösung:

SELECT x
FROM OPENROWSET(BULK 'E:\data\test.txt', SINGLE_CLOB) AS t(x);

Das funktioniert auch mit Bildern oder beliebigen anderen Dateien, dann ist es aber ein "SINGLE_BLOB". Aber das Schreiben ist so immer noch nicht möglich. Freilich kann man auch hier wieder mit OpenRowSet arbeiten. Der Text-Treiber kann aber keinen INSERT, daher muss man dann schon den Treiber für Access nehmen und so tun als wäre es eine csv-Datei. Mit dem gelang es aber nicht eine neue Datei anzulegen. Man musste also zuerst eine leere Datei via xp_cmsshell anlegen und konnte sie dann füllen. Das geht aber nur mit 32-Bit-SQL-Servern, weil es gibt keine 64-Bit-Treiber für die Jet-Engine gibt… 🙁

Bei Simple-Talk fand ich eine praktikable Lösung dazu: Man verwendet "bcp" via "xp_cmdshell", um die Daten in eine Text-Datei zu schreiben. Klingt schwierig, ist es aber nicht. Wie für alle obigen Lösungen benötigt man auch hier Admin-Rechte. Die Lösung taugt also nicht für den laufenden Betrieb, aber eignet sich prima für eigene administrative Aufgaben.

DECLARE @Cmd nvarchar(2000);
SET @Cmd = N'bcp "select t from [TestTable]" queryout "F:\temp\outfile.txt" -T -S'
+ @@servername + N' -w'; – "-w" für Unicode-Datei "-c" für ANSI
EXEC xp_cmdshell @Cmd;

Natürlich muss man die Verwendung von xp_cmdshell erst mal erlauben.

Hier steht der Trick im Detail beschrieben und etliches mehr: "The TSQL of Text Files"

24. August 2009 um 18:07

Bewerbern auf den Zahn fühlen

Mein Kollege Peter machte mich auf einen Tests für Bewerber aufmerksam. Man solle Ihnen eine leichte Programmmieraufgabe geben, um die Fähigkeiten des Kandidaten zu erleben. Als Beispiel soll ein Programm die Zahlen von 1 bis 100 ausgeben. Ist die Zahl hingegen durch 3 teilbar, dann statt dessen "Fizz". Ist sie durch 5 teilbar, dann "Buzz". Ist sie aber durch 3 und 5 teilbar, dann "FizzBuzz". Erstmals beschrieben wurde das offenbar im Artikel "Using FizzBuzz to Find Developers who Grok Coding".

Das Ganze hat zwei Aspekte:

  • Taugen solche Tests überhaupt, um im Bewerbergespräch wertvolle Erkenntnisse zu sammeln?
  • Und wie ist die TSQL-Lösung dieser konkreten Aufgabe… 😉

Ich bin unsicher wegen der Aussagekraft: Ich persönlich würde gut ausgearbeitete Tests zur Auswahl der Bewerber befürworten, um einfach besser einschätzen zu können, ob sie die gewünschten Qualifikationen haben. Leider kann ich in Bewerbergesprächen nicht so gut einschätzen, was die Leute nur sagen und was sie tatsächlich können. Leider erlebte ich schon, dass die Selbsteinschätzung und dementsprechend die Darstellung der Bewerber stark von der Wirklichkeit abwich.

Aber was sagt so ein Luschi-Test aus? Ich nehme mal an, dass er nur die totalen Blender ausfiltert, oder? Hat er sonst noch einen positiven Effekt?

Jetzt zum spaßigen Teil. In dem oben genannten Blog-Beitrag bringt jemand eine TSQL-Lösung:

declare @counter int
declare @output varchar(15)
set @counter = 1
while @counter < 101 begin set @output = '' if @counter % 3 = 0 set @output = 'Fizz' if @counter % 5 = 0 set @output = @output + 'Buzz' if @output = '' set @output = @counter print @output set @counter = @counter + 1 end

Diese Lösung gefällt mir besser:

SELECT
CASE WHEN number%15=0 THEN 'FizzBuzz'
WHEN number%3=0 THEN 'Fizz'
WHEN number%5=0 THEN 'Fizz'
ELSE CAST (number AS Varchar(10)) END AS "number"
FROM master.dbo.spt_values
WHERE type='P'
AND number BETWEEN 1 AND 100

Wem das zu wenig tricky ist, hier eine komplexere Lösung, die ohne Modulo auskommt:

SELECT
ISNULL(MAX(T.word),CAST (number AS Varchar(10))) AS "number"
FROM master.dbo.spt_values AS S
LEFT OUTER JOIN ( SELECT 3, 'Fizz' UNION
SELECT 5, 'Buzz' UNION
SELECT 15, 'FizzBuzz') AS T(num,word)
ON S.number%T.num=0
WHERE S.type='P'
AND S.number BETWEEN 1 AND 100
GROUP BY S.number

via Peter (er las es im JavaSPEKTRUM http://www.sigs.de/blog/js/?p=28)
23. August 2009 um 17:33

SQL Server API Server Cursors

Neben den modernen Datenbankzugriffsschichten wie ADO.net, LINQ oder Entity-Framework sind in den älteren Systemen meist noch die guten alten Schnittstellen wie ODBC und OLEDB im Einsatz. Um Daten zu holen gibt es hier nur die Möglichkeit Cursor zu öffnen. Die entsprechenden ODBC- oder OLEDB-Befehle rufen am SQL-Server Stored-Procedures auf, die die Cursorverwaltung und -abarbeitung übernehmen.

Bei sourceforge.net fand ich neulich zufällig eine Beschreibung dieser Prozeduren: "SQL Server API Server Cursors". Wer unbedingt Cursor benötigt, z.B. weil er die Daten seitenweise lesen muss, der könnte sich damit seine eigenen .net-Cursor schreiben…

22. August 2009 um 17:32

Small Basic

Durch die Zeitschrift DotNetPro wurde ich auf die neue Einsteiger-Programmiersprache von Microsoft aufmerksam: Microsoft Small Basic. Sie ist sehr einfach gehalten und richtet sich für Einsteiger in die Programmierung, z.B. Schüler. Das spricht mich sehr an, denn ich lernte auch mit einer sehr minimalistischen Programmiersprache die Softwareentwicklung.

Wenn ich mir vorstelle, dass Schüler mit Java oder C# einsteigen sollten, dann stelle ich mir das viel schwieriger vor als mit einer ganz simplen Sprache. Wir fingen damals in der 7ten mit programmierbaren Taschenrechnern an und stiegen erst in der nächsten Klasse auf Basic (damals auf Apple IIe) auf… 😉

Alles was man in dieser Phase können muss kann Small Basic. Und sonst kaum mehr. In der nächsten Stufe kann man sich dann in Konzepte wie objekt-orientierte Programmierung einarbeiten, aber für den Einstieg dürfte das für viele eine Nummer zu groß sein. Das Paket ist mit weniger als 4 MBytes denkbar klein und ist schnell installiert. Der einzige Haken: Die Entwicklungsumgebung ist komplett auf englisch. Aber ist das wirklich schlimm?