Glorf.it

Glorf IT

Bedenkliches aus dem IT-Alltag

14. Oktober 2006 um 20:08

SQL Server 2005: Definition von System-Objekten ansehen

Beim SQL Server 2005 kann bekanntlich die Systemtabellen nicht direkt Zugreifen und schon gar bearbeiten. Man sieht sie noch nicht mal. Die "echten" Systemtabellen stehen auch nicht mehr in der Master-Datenbank, sondern in der versteckten Datenbank MsSqlSystemResource. Man kann deren Dateien im Data-Verzeichnis sehen, das ist aber auch schon alles: mssqlsystemresource.mdf/ldf.

Stattdessen gibt es jede Menge Views, die man für den lesenden Zugriff nutzen kann:

  • Die guten alten "Systemtabellen" von früheren Versionen werden als Views abgebildet, z.B. sysobjects. Allerdings enthalten die Views keine Informationen über neue Features, einige Attribute, die nicht mehr zutreffende Infos enthalten würden enthalten immer NULL.
  • Die ANSI-Views gibt es weiterhin, z.B. INFORMATION_SCHEMA.TABLES. Hier hat sich meines Wissens nichts geändert.
  • Die neuen System Management Views, die die alten Systemtabellen ablösen sollen, z.B. sys.objects. Sie sind vergleichsweise sprechend und lehnen sich sehr stark an die alten Systemtabellen an. Sie gefallen mir ganz gut.
  • Die neuen Dynamic Management Views enthalten alle möglichen Laufzeitinformationen. So etwas gab es früher auch schon, z.B. die ehemaligen sysprocesses. Ein Beispiel für die Neuen ist sys.dm_exec_connections. Hier stehe ich noch am Anfang, aber das Konzept gefällt mir.

Bei meinem Bestreben die internen Abläufe des Systems zu verstehen waren mit beim SQL-Server immer die Quelltexte der Systemproceduren bzw. die View-Definitionen sehr hilfreich. Lange Zeit dachte ich, es gäbe keine Möglichkeit mir die Definitionen der Systemviews anzusehen. Aber im SQl-Server-Magazine las ich neulich, wie es geht: mit der Funktion "object_definition".

-- Definition von System-Objekten ansehen:
SELECT object_definition(object_id('dbo.sysobjects'))

Damit man im "SQL Server Management Studio" wirklich etwas sehen kann, sollte man die Ergebnisse als Text ansehen im Menü "Query | Results To | Results To Text" oder mit Strg+t und die maximal dargestellte Zeichenzahl pro Spalte auf 8192 setzen.
Dazu im Menü unter "Tools | Options" im Fenster "Options" links "Query Results | SQL Server | Results To Text" für den Wert "Maximum number of characters displayed in each column" den Wert "8192" wählen.

14. Oktober 2006 um 19:46

SQL Server 2005: Pivoting & Unpivoting

Dem Feature "Pivoting/Unpivoting" stehe ich etwas zwispältig gegenüber: Einerseits habe ich in der Vergangenheit schon mehrfach die Anfrage von Entwicklern bekommen, wie man sowas macht (meist noch in den späten 90ern als wir von Btrieve auf Sybase SQL-Anywhere umstellten). Andererseits sind die zugrundeliegenden Ursachen in der Regel eine "schlechte" Datenmodelierung: Wert-Tabellen, wie sie ein index-sequentiellen Systemen üblich waren. Ich bevorzuge echte relationale Datenmodelle.

In den letzten Jahren habe ich aber auch erlebt, dass es mindestens eine Situation gibt, bei der man um solche Tabellen nicht rumkommt: Wenn man mit relationalen Mitteln eine Art OLAP-System nachbilden will, dann ist es sinnvoll alle möglichen "Fakten" in der gleichen Tabelle unterzubringen und deren Werte im gleichen Feld zu speichern. Damit kann man dann sehr einfach, sehr flexible Auswertungsmöglichkeiten schaffen. Mein Kollege Michael brauchte ziemlich lange, um mich davon zu überzeugen… 😉

Pivoting
Die Werte aus einer Werte-Tabelle werden in eine echte Tabellen übertragen.
Dabei bekommen die einzelnen Attribute auch gleich sinnvolle Namen, z.B. wird "attr1" zu "Typ", "attr2" zu Datum" "attr3" zu "Anzahl" usw.

Der entsprechende PIVOT-Befehl geht so:

SELECT ObjectID, attr1 as Typ,
attr2 as Datum, attr3 as Anzahl,
attr4 as Dings, attr5 as Bums
FROM OpenSchema
PIVOT( Max("Value")
FOR Attribute IN ("attr1", "attr2", "attr3", "attr4", "attr5")
) AS pvt
ORDER BY ObjectID

Wenn man das Bedürfnis hat genau den umgekehrten Weg zu gehen: aus einer normalisierten Tabelle die Ergebnisse in Form einer Wert-Tabelle zu bekommen, dann geht das mit UNPIVOT:

SELECT ObjectID, Attribute, "Value"
FROM ( SELECT ObjectID, cast(Typ as sql_variant) as attr1, cast(Datum as sql_variant) as attr2, cast(Anzahl as sql_variant) as attr3, cast(Dings as sql_variant) as attr4, cast(Bums as sql_variant) as attr5
FROM FixSchema) as "Value"
UNPIVOT
(
"Value"
FOR Attribute IN ("attr1", "attr2", "attr3", "attr4", "attr5")
) AS pvt
ORDER BY ObjectID

Wer noch genug hat: Eine besonders gute Darstellung des Pivotierens liefert wieder mal Itzik Ben-Gan. Die Folien von seinem Vortrag "Advanced T-SQL Techniques" zur TechEd 2006 in Israel stehen bei microsoft.com (siehe "Advanced T-SQL Techniques"). Ich glaube, sie sind auch ohne seinen Text verständlich. Als ich ihn 2005 in London persönlich erleben durfte, zeigte er ganz ähnliche Folien. Deswegen bin ich da nicht repräsentativ.

14. Oktober 2006 um 19:45

Höhlen in der fränkischen Schweiz „Wie hart wollt ihr es haben?“

Peter machte mich auf den recht netten Artikel Fränkische Schweiz „Wie hart wollt ihr es haben?“ auf sueddeutsche.de aufmerksam.

Da schildert ein Reporter seine erste Höhlentour. Er befuhr die Schönsteinhöhle und war ganz offensichtlich beeindruckt… 😉

|