Main menu:

Suchen

 
web
kriegermartin.de

Kategorien

Mai 2009
M D M D F S S
« Sep   Jun »
 123
45678910
11121314151617
18192021222324
25262728293031

Archiv

AttachDbFilename

Ich habe heute versucht ein Sample zu starten, welches einen Connectionstring wie diesen enthält:

const string connectionString = @”Data Source=.\SQLEXPRESS; AttachDbFilename=|DataDirectory|\SampleInstanceStore.mdf; Integrated Security=True;Asynchronous Processing=True”;

Dabei erhielt ich die Fehlermeldung:

System.Data.SqlClient.SqlException: Fehler beim Anfügen einer automatisch benannten Datenbank für die Datei C:\Users\Martin\Some more subfolders\SampleInstanceStore.mdf. Eine Datenbank mit diesem Namen ist bereits vorhanden, die angegebene Datei kann nicht geöffnet werden, oder sie befindet sich in der UNC-Freigabe.

(System.Data.SqlClient.SqlException: An attempt to attach an auto-named database for file C:\Users\Martin\Some more subfolders\SampleInstanceStore.mdf failed. A database with the same name exists, or specified file cannot be opened, or it is located on UNC share.)

Grund ist, das der SQL Server beim Zugriff auf die Datenbankdatei seinen eigenen Benutzeraccount verwendet, in diesem Fall war es NetworkService (Netzwerkdienst). Und der hatte keine Zugriffsrechte auf meine Dateien. Jedoch genügt es auch nicht, den Dateien oder dem Verzeichnis diese Rechte zu geben. Wenn AttachDbFilename wie hier ohne Angabe eines Datenbanknamens verwendet wird, so entspricht der Datenbankname dem Pfadnamen der Datei. Und um diesen zu ermitteln schaut der SQL-Server sich -mit seinem Account- alle übergeordneten Verzeichnisse an. Er benötigt somit auch dort zumindest Leserechte.

Mögliche Lösungen:

  • User Instances: Mit user instance=true im Connectionstring wird eine weiter Instanz von SQL-Server Express (und nur Express!), die unter den Rechten des Benutzers läuft, gestartet. Microsoft möchte dieses Feature allerdings künftig wegfallen lassen.
  • Server Manager: Die Datenbank mit dem Server Manger erzeugen bzw. hinzufügen - und den Connectionstring entsprechend anpassen.
  • Lokales System: Theoretisch könnte man dem SQL Server auch unter einen weniger eingeschränkten Account, wie Lokales System (local system) laufen lassen. Aus Sicherheitsgründen wird man das aber niemals, und erst recht nicht auf einem Produktivsystem, machen wollen.
  • Initial Catalog: Wenn man zusätzlich zu AttachDbFilename den database/initial catalog Parameter setzt so wird dieser Name verwendet. Es genügt dann, wenn die .mdf Datei und ihr Verzeichnis die entsprechenden Rechte besitzt.