Mittwoch, 20. März 2013

Benannte Transaktionen

Bei der Verwendung von mehreren Transaktionen in einem Skript, ist es übersichtlicher wenn man die einzelnen Transaktionen benennt.

Dieses kann man einfach machen, indem man einen beliebigen Namen hinter das TRANSACTION hängt.
Es ist dabei wichtig, dass man den Namen im weiteren Verlauf wie z.B. beim COMMIT oder ROLLBACK immer angibt.

Beispiel:

BEGIN TRANSACTION BeispielTransaktion;
ROLLBACK TRANSACTION BeispielTransaktion;
COMMIT TRANSACTION BeispielTransaktion;

Dienstag, 19. März 2013

TRANSACTION! COMMIT? ROLLBACK?

Oft sieht mit in SQL-Skripten, die mit Transaktionen arbeiten folgende oder ähnliche Abfrage:

-- Transaktion rückgängig machen
IF @@TRANCOUNT > 0
    ROLLBACK TRANSACTION; 

Aber was genau steckt eigentlich dahinter?
Eigentlich ist diese Abfrage mehr oder weniger Quatsch bzw. falsch.

Die globale Variable @@TRANCOUNT gibt nur die Anzahl der mit "BEGIN TRANSACTION" geöffneten Transaktionen zurück.
Das heißt, an dieser Stelle wird geprüft, ob es eine offene Transaktion gibt. Wenn dieses der Fall ist, dann wird eine (die zuletzt geöffnete) geschlossen.

An dieser Stelle weiß man jedoch nicht, ob die Transaktion erfolgreich oder fehlerhaft war.
Also könnte man auch nicht sagen, ob diese bestätigt (commit) oder zurückgeschrieben (rollback) werden sollen.
Diese Information bekommt man aber ganz einfach direkt über eine SQL-Server-Funktion.

Über die Systemfunktion XACT_STATE() kann der aktuelle Transaktionsstatus manuell geprüft werden.
Mögliche Rückgabewerte sind folgende:
# 1 => Es ist eine Transaktion vorhanden, die korrekt verarbeitet wurde und committed werden kann.
# 0 => Es ist keine Transaktion vorhanden.
# -1 => Es ist eine Transaktion vorhanden, die aber fehlerhaft verarbeitet wurde und nicht committed werden kann. Diese Transaktion kann nur noch vollständig per ROLLBACK zurückgeschrieben werden.

Anhand dieser Funktion kann man also die Transaktion bzw. dessen Status prüfen und diese bestätigen oder zurückschreiben.

Möchte man die Transaktion nicht manuell zurückschreiben, dann könnte man dieses auch automatisch vom SQL-Server machen lassen. In diesem Fall gilt nur zu beachten, dass die Transaktion trotzdem bei erfolg bestätigt werden muss.

XACT_ABORT(ON/OFF) ist eine Eigenschaft die über SET beliebig eingestellt werden kann.
Diese Eigenschaft gibt an ob eine fehlgeschlagene Transaktion automatisch zurückgeschrieben werden soll.

Dienstag, 12. März 2013

Einfaches Arbeiten mit Transaktionen


Eine Transaktion bezeichnet eine Gruppe von Datenbankabfragen, welche nur gemeinsam ausgeführt werden können.

Dieses ist in ganz unterschiedlichen Bereichen wie z.B. in der Lagerlogistik bei einer Lagerumbuchung notwendig.
Wird ein Artikel von einem Lagerplatz auf einen anderen verschoben, so darf zwischen der Entnahme- und der Ziel-Buchung keine Möglichkeit für Eingriffe bestehen.
Ansonsten könnte es zu Problemen kommen und ein Artikel könnte doppelt verbucht werden.

Einfach gesagt, bündeln Transaktionen also nur mehrere SQL-Abfragen.
Eine Transaktion muss immer geöffnet und auch wieder geschlossen werden.

Öffnen kann man eine Transaktion so:
 -- Transaktion starten
 BEGIN TRANSACTION;

Ist eine Transaktion offen, können diverse SQL-Abfragen durchgeführt werden.
Gibt es hierbei keine Fehler, so kann man die Transaktion einfach wie folgt schließen.

-- Transaktion schließen/bestätigen
COMMIT TRANSACTION;

 Erst mit einem COMMIT werden die ausgeführten Abfragen in der Datenbank veröffentlicht.

Gibt es bei der Verarbeitung der beinhalteten SQL-Abfragen Probleme/Fehler, so muss die Transaktion manuell oder automatisch zurückgeschrieben werden. Dabei werden alle durchgeführten Abfragen verworfen.

Das zurückschreiben kann wie folgt durchgeführt werden.

 -- Transaktion rückgängig machen
 ROLLBACK TRANSACTION;

Montag, 11. März 2013

Grundlegende Änderung in diesem Blog

Wer mich kennt, weiß dass ich ursprünglich aus der Microsoft SQL-Server Administration komme.
In den letzten Jahren habe ich diesen Bereich etwas vernachlässigt.
Da mir die Verwaltung sowie die Entwicklung mit dem SQL-Server aber immer (naja eher oft ;-)) sehr viel Freude bereitet hat, möchte ich wenigstens weiterhin darüber bloggen.

Da ich aktuell nur noch wenig gute und vor allem wirklich aktive Blogs zum Thema SQL-Server kenne, möchte ich diesen Blog wieder aktiver nutzen und vor allem das grundlegende Thema ändern.

Es kann zwar durchaus passieren, dass noch einmal ein Post zum Thema .Net/C# rausrutscht.
Das Hauptthema dieses Blogs soll aber zukünftig der Microsoft SQL-Server werden.

Hier möchte ich die Gelegenheit nutzen und noch einmal grundlegende Themen aufarbeiten um spätere Posts auch darauf aufzubauen.

Freitag, 10. August 2012

Entpacken einer MSI-Datei

Wer kennt es nicht? Man benötigt mal schnell eine Datei aus einem MSI-Installationspaket (z.B. die bekannten Telerik-Controls) und möchte dieses aber nicht gleich installieren. Hierfür gibt es eine ganz einfache Lösung.
Mit dem Kommandozeilen-Programm “msiexec” kann man die Dateien eines MSI-Pakets einfach extrahieren. Dieses funktioniert ähnlich wie das Entpacken eines Zip-Archivs.

Der Aufruf des Programms erfolgt wie gesagt ganz einfach in der Konsole wie folgt:
msiexec /a PfadZumMSIFile /qb TARGETDIR=AusgabeVerzeichnis

Das Ausgabeverzeichnis wird automatisch erstellt, wenn es noch nicht vorhanden ist.
Hier mal ein Beispiel, um das Paket “C:\Downloads\RadControls_WinForms.msi” in das Verzeichnis “C:\Entwicklung” zu extrahieren.

msiexec /a C:\Downloads\RadControls_WinForms.msi /qb TARGETDIR=C:\Entwicklung

Donnerstag, 12. April 2012

SQL-Server 2012 Editionsvergleich

Hat man mit den unterschiedlichen Editionen des SQL-Servers zu tun, kann es passieren, dass beim Transferieren einer Datenbank auf einmal bestimmte Funktionen wie zum Beispiel Replikationen oder ähnliches nicht mehr zur Verfügung stehen. Man sollte also vor einer solchen Aktion auch immer einen Blick auf die verwendeten SQL-Server Editionen und deren Features werfen.

Eine gute Übersicht für den neuen SQL-Server 2012 gibt es dazu auf den MSDN-Seiten unter folgendem Link:
Editionsvergleich des SQL-Servers 2012

Freitag, 2. September 2011

Select Top-Rows per SQL

Gerade brauchte ich für einen schnellen Test mal wieder einfach nur ein paar Datensätze aus einer Datenbank.
Die schnellste Art und Weise dieses zu realisieren ist, wenn man einfach nur die ersten x Zeilen ausliest.
Diese könnte man ggf. für bestimmte Auswertungen auch direkt sortiert ausgeben. Aber für meine Tests war das völlig egal.

Da ich ständig mit dem MS SQL-Server arbeite habe ich meine Abfrage wie folgt geschrieben.

-- Rückgabe der ersten 5 Zeilen aus Tabelle1
SELECT TOP 5 * FROM Tabelle1

Bei meinem aktuellen Test habe ich jedoch eine Oracle Datenbank abgefragt.
Nach der Ausführung des oben stehenden SQL-Statements habe ich jedoch folgenden Fehler bekommen.
Error starting at line 1 in command:
SELECT TOP 5 * FROM Tabelle1
Error at Command Line:1 Column:11
Error report:
SQL Error: ORA-00923: Schlüsselwort FROM nicht an erwarteter Stelle gefunden
00923. 00000 -  "FROM keyword not found where expected"
*Cause:   
*Action:

Nach kurzer Überlegung ist es mir direkt wieder eingefallen. Oracle kennt keinen TOP-Befehl.
Dafür gibt es in Oracle-Datenbanken jedoch die Spalte "rownum". Mit dieser kann man dann nicht nur Top-Werte sondern auch ganz bestimmte Datensätze wie folgt ausgeben lassen.

-- Rückgabe der ersten 5 Zeilen aus Tabelle1
SELECT * FROM Tabelle1 WHERE rownum <= 5

-- Rückgabe der Zeilen 6 bis 10 aus Tabelle1
SELECT * FROM Tabelle1 WHERE rownum > 5 AND rownum <= 10