Wenn man eine Datenbank mittels des "SQL Server Management Studios" anhängt, dann bekommt man bereits vor dem eigentlichen Anhängen an der Oberfläche angezeigt, aus wie vielen Dateien die Datenbank besteht und wo die Dateien zuletzt lagen. Nun gibt es aber Anwendungen, die für Endanwender gedacht ist, die mit der Bedienung des Management-Studios durchaus überfordert sein könnten.

Wenn man das Anhängen – z.B. nach einer Rücksicherung aus einer Datei-Vollsicherung – nicht den Anwender manuell durchführen lassen will, sondern automatisch aus der eigenen Anwendung, dann muss man auch irgendwie an diese Infos ran kommen.

Zu diesem Zweck bietet Microsoft die undokumentiere DBCC-Funktion "checkprimaryfile". Damit kann man sich die wichtigsten Infos herausholen ohne die Datenbank vorher anhängen zu müssen.

Ist die Datei tatsächlich eine MDF-Datei?

dbcc checkprimaryfile ('C:\temp\Test_data.mdf', 0)
Mit der Option "0" überprüft "checkprimaryfile", ob die Datei eine MDF-Datei ist: "0" heißt "Nein", "1" heißt "ja". Beispiel:

IsMDF
1

Welche Version hat die Datenbank?

dbcc checkprimaryfile ('C:\temp\Test_data.mdf', 2)
Mit der Option "2" ermittelt "checkprimaryfile" die Version, den Namen und die Default-Collation der Datenbank:

property value
Database name Test
Database version 655
Collation 53256

Das ist deswegen relevant, weil man an einen SQL-Server-2005 keine 2008er Datenbank anhängen kann. Umgekehrt zwar schon, aber dann ist das fortan eine 2008er Datenbank. Die Versionen sind folgende:

SQL Server Version Datenbankversion
SQL Server 2000 539
SQL Server 2005 611
SQL Server 2008 655

Aus welchen Dateien besteht die Datenbank?

dbcc checkprimaryfile ('C:\temp\Test_data.mdf', 3)
Mit der Option "3" ermittelt "checkprimaryfile" die Liste der Datenbank-Dateien und gibt an, wo die Dateien zuletzt lagen als sie noch angehängt waren:

status fileid name filename
2 1 Test_data C:\Programme\Microsoft SQL Server\MSSQL10.SQL2008SE\MSSQL\DATA\Test_data.mdf
1048642 2 Test_log C:\Programme\Microsoft SQL Server\MSSQL10.SQL2008SE\MSSQL\DATA\Test_log.ldf
2 3 Test_data2 C:\Programme\Microsoft SQL Server\MSSQL10.SQL2008SE\MSSQL\DATA\Test_data2.ndf

Im Beispiel sieht man, dass die Datenbank-Dateien zuletzt im Verzeichnis "C:\Programme\Microsoft SQL Server\MSSQL10.SQL2008SE\MSSQL\DATA\" lagen. Jetzt stehen sie im Verzeichnis "C:\temp". Daher muss man die Dateien zum Anhängen entweder wieder an den Ursprungsort verschieben oder beim Anhängen die neuen Pfade aller Dateien angeben.

Details zu den Datenbank-Dateien

dbcc checkprimaryfile ('C:\temp\Test_data.mdf', 1)
Mit der Option "1" wird die Datenbank wird kurzzeitig angehängt, Details zu den Dateien analysiert und dann wieder getrennt. Das geht freilich nur, wenn die Log und Secobdary-Files unter dem Pfad ansprechbar sind unter dem sie in der MDF-Datei stehen.

fileid groupid size maxsize growth status perf name filename
1 1 384 -1 128 2 0 Test_data C:\Programme\Microsoft SQL Server\MSSQL10.SQL2008SE\MSSQL\DATA\Test_data.mdf
2 0 128 268435456 10 1048642 0 Test_log C:\Programme\Microsoft SQL Server\MSSQL10.SQL2008SE\MSSQL\DATA\Test_log.ldf
3 1 384 -1 128 2 0 Test_data2 C:\Programme\Microsoft SQL Server\MSSQL10.SQL2008SE\MSSQL\DATA\Test_data2.ndf

Dazu kann man die Datenbank auch gleich selber anhängen und dann angehängt lassen.

Risiken und Nebenwirkungen

Diese DBCC-Funktion ist undokumentiert und daher in zukünftigen Versionen möglicherweise nicht mehr lauffähig oder bringt andere Ausgaben. Ich fand leider nirgends Angaben zu der Funktion. Daher fand ich obige Angaben durch Ausprobieren raus. Sie können daher falsch sein. Interessanterweise klappten die Optionen 0,2,3 auch wenn ich an einem SQL-Server-2005 eine 2008er Datenbank analysierte. Die Option 1 nicht, weil da die Datenbank angehängt werden soll.