2009-08-07 101 views
2

我使用SQL Server 2008中我應該能夠「連接」到用戶指定的數據庫文件(MDF)(使用連接字符串的AttachDbFilename部分),並保存副本所選文件。我還必須處理數據庫的內容。的SQL Server:加載數據庫文件

如果我明白了,一個單一的mdf文件代表一個完整的數據庫,包括表,存儲過程等等。但是,如果我在不同的文件夾中有兩個同名的文件(一個在SQL Server的DATA文件夾中另一個在C :)的根目錄下,我嘗試在C下加載文件:我得到一個錯誤,指出數據庫已經存在該名稱。

我改名℃在文件:,但現在我得到一個錯誤:

"CREATE FILE encountered operating system error 5(failed to retrieve text for this error. Reason: 15105) while attempting to open or create physical file 'C:/myDatabaseFile_log.ldf'. Could not open new database 'C:/MYDATABASEFILE.MDF'. CREATE DATABASE is aborted. An attempt attach an auto-named database for file 'C:/myDatabaseFile.mdf' failed. A database with the same name exists or specified file cannot be opened, or it is located on UNC share."

請注意:我試圖打開數據庫,而不是試圖創建它。
那麼我做錯了什麼?我誤解了什麼?這些數據庫文件如何工作(我的意思是,如何使用它們)?

回答

5

你似乎是的印象是,數據庫是像Word文檔或文本文件,要打開和應用實例中隨意關閉下。這不是它的工作原理。

相反,有通常是數據庫服務器程序的只有一個實例(你可以安裝多個實例,但它不是像運行正常的程序一分式兩份)。您可以更多地考慮它,就好像您的數據庫在此服務器實例中必須是註冊的,並且您只能爲服務器註冊一個具有給定名稱的數據庫。當您連接到MDF文件時,從服務器的角度來看,會發生什麼情況是創建了新的數據庫(執行CREATE DATABASE命令),並被告知將該MDF文件用於模式和數據。

我建議你得到Sql Server Management Studio並連接到本地系統上運行的服務器。你可能會發現那裏已經有一個你想要的名字的數據庫。

+0

好的,我想我現在明白了,謝謝。我的印象背後的原因是因爲linq to sql(我最初使用的工具,但因爲它被吸引,我切換到ADO.NET)需要mdf(要使用的數據庫文件)的文件路徑。這導致我認爲MSSQL以這種方式工作...... – ShdNx 2009-08-07 14:34:50

1

的確,MDF文件包含數據庫,但事情更復雜。 (單個數據庫實際上可以跨越多個MDF文件)

不能治療或想到的SQL Server像MS Access或其他一些桌面數據庫基於文件的數據庫。你必須根據服務器來思考。服務器控制許多指定的數據庫,每個數據庫至少由一個數據文件(.mdf)和一個日誌文件(.ldf)進行備份。您首先通過服務器引用數據,然後通過服務器註冊數據庫以及文件本身應該是您最後關心的問題。

我認爲你可能是試圖重新創建服務器上的數據庫與已在使用的名稱。是的,.mdf文件可以在不同的位置具有相同的名稱,但只要服務器認爲它在該服務器中必須是唯一的,該數據庫的實際名稱就是如此。

如果你熟悉的web服務器,這裏有一個比喻:你是否希望能夠將HTML文件複製到不同的文件夾,然後簡單地瀏覽到您的瀏覽器用戶在不同的文件夾?當然不是。您首先必須創建一個Web服務器識別的新虛擬文件夾,並且可能會調整其他一些設置,然後您將能夠瀏覽您的「複製」。 Sql Server中的數據庫有點像Web服務器中的虛擬文件夾,因爲數據可以被「複製」,然後「看」成不同的數據存儲。

+0

謝謝,現在明白了。 – ShdNx 2009-08-07 14:36:40

2

您的問題是由兩個問題:

  1. 你「使用」你的數據庫文件(通過AttachDbFilename)時得到一個錯誤。錯誤是'CREATE FILE .... failed'。
  2. 你無法「使用」的情況下,數據庫文件MyDataBaseFile.mdf具有相同名稱存在於SQL Server的

讓我們處理的第一個數據目錄中的文件。 「使用」數據庫文件的過程實際上是連接一個數據庫服務器實例。據我所知,此操作(數據庫附件)對於您的應用程序是透明的,並且僅在Sql Server Express Edition中才有可能。當您附加數據庫文件時,只要每個SQL Server數據庫必須有日誌文件,就需要一個「即時」創建的日誌文件,以防日誌文件不存在。我不能說爲什麼你的SQL Server無法爲你創建一個日誌文件 - 天氣是缺少空間,缺乏權限或其他。但至少你有一個爲什麼創建這個文件的想法。附加數據庫是作爲數據庫創建的特例實現的 - 這就是執行CREATE DATABASE語句的原因。

現在我們來看第二個問題。數據庫文件名通常來自數據庫名稱。因此,如果您在數據庫創建期間不編輯文件名,故意有兩個相似的名爲數據庫文件意味着您將得到一個具有相同名稱的數據庫。如果其中一個文件駐留在SQL Server的Data目錄中,則最有可能是由服務器使用它。當您嘗試'使用'數據庫文件(通過AttachDbFilename)時,它實際上會導致嘗試創建重名的數據庫。這種嘗試總是會失敗。

希望這會有所幫助。

+0

謝謝,這有助於理解問題。 – ShdNx 2009-08-07 15:20:48

3

從什麼我們一起工作是 - 用戶在運行SQL 2008服務沒有指定的文件夾的權限。

+1

完美!這對我也很有用。我讓用戶「Everyone」對該目錄有完整的讀寫權限,然後SQL Server 2008可以成功訪問備份文件。 – 2012-01-24 09:09:10

+0

.mdf數據和.ldf日誌文件需要由SQL Server實例帳戶完全控制。將此權限授予 \ Users組,並在下次訪問數據庫時,將應用正確的權限。 – Pekka 2013-07-15 20:49:49