SQL Server & ASP .NET Blog

Interessantes und Wissenswertes

SQL Server – Fehler beim Wiederherstellen eines Backup

Für den Fall, dass mal jemand auf diesen Fehler beim Wiederherstellen eines Backup trifft:

Msg 3634, Level 16, State 1, Line 1
The operating system returned the error '5(Access is denied.)' while attempting 'RestoreContainer::ValidateTargetForCreation' on 'C:\Program Files\distribution.mdf'.
Msg 3156, Level 16, State 5, Line 1
File 'blah' cannot be restored to 'C:\Program Files\distribution.mdf'. Use WITH MOVE to identify a valid location for the file.

…hier ist es ziemlich wahrscheinlich, dass der Account unter dem euer SQL Server Dienst läuft keine ausreichenden Berechtigungen auf den Ordner, in dem die DB gespeichert werden soll, hat.

DB Copy Tool für SQL Server – auf Codeplex

Das im Letzten Post erwähnte DB Copy Tool ist nun auch auf Codeplex zu haben: Link zu Codeplex.

Inzwischen hat sich hier auch noch einiges getan:

db_copy_tool_1

Die zu verwaltenden Server können nun über den Servers-Tab verwaltet werden.

db_copy_tool_2

Hier können Server manuell hinzugefügt werden, oder automatisch aus dem Netzwerk erkannt werden (Danke an volleyknallerfür die Tipps). Für den ausgewählten Server kann hier auch das eingestellte Datenverzeichnis und das Backupverzeichnis ausgelesen oder manuell gespeichert werden. Der Button "Add servers from network" fügt alle automatisch erkannten SQL Server im Netzwerk hinzu (ohne User und Passwort). Das funktioniert (und dauert auch so lange) wie im SQL Server Management Studio :-)

Was fehlt jetzt noch:

  • einiges Exception-Handling
  • Support für Server mit mehreren SQL-Server Instanzen
  • Test mit dem SQL Server 2005
  • eine Menge Kommentare und Verschönerungen im Code :-)

DB Copy Tool – Datenbanken kopieren (von einem SQLServer zum anderen)

Wie [hier]beschrieben nervt es mich Datenbanken von einen auf den anderen Server zu kopieren. Daher habe ich hier ein kleines Tool gebastelt, was mir diese lästige Aufgabe abnimmt.

database_copy_tool

Die Funktionsweise ist recht simpel. Das Tool erstellt ein Backup der Quelldatenbank auf dem Quellserver, kopiert die Datei auf den Zielserver und stellt dort die Datenbank wieder her. Funktioniert soweit ganz gut und wird mir in Zukunft Stunden sparen ;-)

Voraussetzungen

  • der User muss vom lokalen Rechner Zugriff auf beide Verzeichnisse (Quelle und Ziel) haben um die Datei zu kopieren

Was fehlt noch?

  • Auslesen des Standard-Backup-Ordners des Quellservers
  • Auslesen des Standard-Daten-Ordners des Zielservers
  • Auslesen aller bekannten SQL Server
  • Speichern der Einstellungen (bspw. wenn man öfter die gleiche Datenbank kopiert)
  • Integrierte Authentifizierung am SQL Server (ist zwar dabei aber noch ungetestet)
  • Exception-Handling ;-)

Wenn diese Punkte alle erledigt sind, werde ich das Tool auch hier zum Download anbieten :-)

Datenbanken von einen auf den anderen Server kopieren

Ich möchte eine Datenbank (bzw. mehrere Datenbanken) von einem SQL Server auf einen anderen kopieren. Und das nicht nur einmal, sondern immer dann wenn ich eine “frische” Datenbank aus der Praxis für einen Test benötige. Außerdem möchte ich, dass ich Datenbanken von einem auf mehrere Server kopieren kann. Blöderweise bekomme ich es nicht hin, das mit dem Database copy Wizard des SSMS, zu machen.

Ich habe vor ein kleines Tool zu schreiben, was die Arbeit für mich erledigt. Ich würde jetzt so vorgehen, dass ich in dem Tool Quellserver und Zielserver auswähle und dort jeweils einen Ordner. Auf dem Quellserver erstelle ich ein Backup der DB, kopiere das Backup auf den Zielserver und stelle es dort wieder her.

Macht das Sinn? Wir werden sehen.

Spaltenheader beim kopieren aus SSMS “mitnehmen”

Ich kopiere oft Ergebnisse aus dem Management Studio ins Excel um diese bspw. zu versenden oder dort weiterzuarbeiten. Sehr nützlich dabei ist die Option die Spaltenköpfe beim kopieren aus dem SSMS-Grid mit zu kopieren. Wo zu finden? Ganz einfach:

header

Tools => Options => Query Results => SQL Server => Results to Grid => Haken bei Include column headers when copying or saving the results

Undokumentierte Systemprozeduren

Im SQL Server 2005 (und auch 2008) gibt es einige undokumentierte Prozeduren. Komischerweise stehen die auf jeder zweiten Seite im Internet, daher kann man von “nicht dokumentiert” gar nicht mehr reden. Einige kennen Sie trotzdem noch nicht, daher hier zwei, die mir gerade einfallen :-)

sp_msforeachdb

Diese Prozedur durchläuft alle Datenbanken eines Servers. Beispiel um alle Tabellen aller Datenbanken zu selektieren:

sp_msforeachdb 'SELECT * FROM ?.sys.tables'

Das ? steht hierbei für den jeweiligen Datenbanknamen.

sp_msforeachtable

Nun ist es nicht mehr schwer zu erraten, was diese Prozedur macht.

sp_msforeachtable 'SELECT count(*) FROM ?'

Zeigt also die Anzahl aller Zeilen innerhalb einer Datenbank.

Sehr brauchbar wenn man etwas für alle Datenbanken (bspw. BACKUP DATABASE) oder für alle Tabellen (bspw. TRUNCATE TABLE) machen möchte, ohne dafür ein ewig langes Skript mit Schleifen etc. schreiben zu wollen.

Trotzdem: Ab wann werden undokumentierte Funktionen eigentlich zu dokumentierten? :-)

Source Control mit Visual Source Safe für Stored Procedures etc.

Hier => Artikel <= gibt es einen interessanten Artikel, der beschreibt, wie man vorhandene Prozeduren und Funktionen in eine Visual Source Safe Datenbank übernimmt. Hat mir sehr geholfen, denn manuell ist das bei mehreren hundert Prozeduren und Funktionen eine wochenfüllende Aufgabe.

Blöd ist nur, dass SQL-Server Projekte im Management Studio nicht zwischen Funktionen und Prozeduren unterscheiden können und alles unter einem Ordner "Abfragen" gespeichert wird. Gibt es hier nichts besseres?

EXCEPT und INTERSECT (T-SQL)

EXCEPT und INTERSECT sind zwei sehr interessante Möglichkeiten Datenmengen zu vergleichen bzw. zu verbinden. EXCEPT gibt dabei die Menge zurück, die in der ersten, aber nicht in der zweiten Menge vorhanden ist. INTERSECT gibt die Schnittmenge von zwei Mengen zurück. Kleines Beispiel?

EXCEPT

    select 1
    union
    select 2
EXCEPT
    select 1

…gibt “2” zurück, da “2” nicht in der zweiten Menge enthalten ist.

INTERSECT

SELECT 1
UNION
SELECT 2

INTERSECT

SELECT 1

…gibt “1” zurück, da “1” in beiden Mengen enthalten ist.

Ich verwende bspw. EXCEPT häufig um Datenmengen schnell miteinander zu vergleichen bzw. um festzustellen was in der zweiten Menge fehlt.

Weiteres gibt’s bei der [Mengenlehre]und bei [Microsoft]

SCOPE_IDENTITY() – Zuletzt eingefügte Identität ermitteln

Hier ein kleines Beispiel. Nehmen wir an, wir haben folgende Tabelle:

CREATE TABLE TestScope
(
id int identity(1,1) PRIMARY KEY,
zahl1 int,
zahl2 int
)

In der Tabelle befinden sich schon einige Datensätze:

ScopeTest

Wenn wir nun einen Datensatz einfügen und die automatisch eingefügte ID benötigen genügt ein Aufruf der eingebauten Funktion SCOPE_IDENTITY(), also:

insert into TestScope values (5,8)
select SCOPE_IDENTITY()

liefert als Ergebnis:

ScopeTest2

 

Tolle Sache! :-)