SQL Server:加载数据库文件

时间:2009-08-07 14:15:44

标签: sql-server sql-server-2008

我正在使用SQL Server 2008.我应该能够“连接”到用户指定的数据库文件(mdf)(使用连接字符串的AttachDbFilename部分)并保存所选文件的副本。我还必须处理数据库的内容。

如果我做对了,一个mdf文件代表一个包含表,存储过程等的完整数据库。但是,如果我在不同文件夹中有两个同名文件(一个在SQL Server的DATA文件夹中,另一个在C :)的根目录中,我尝试在C下加载文件:我收到一条错误,指出已存在具有该名称的数据库。

我在C:下重命名了该文件,但现在我收到了一个错误:

  

“CREATE FILE遇到操作系统错误5(无法检索   此错误的文字。原因:15105)在尝试打开或创建时   物理文件'C:/myDatabaseFile_log.ldf'。无法打开新的   数据库'C:/MYDATABASEFILE.MDF'。 CREATE DATABASE被中止。一个   尝试为文件'C:/myDatabaseFile.mdf'附加一个自动命名的数据库   失败。存在同名的数据库或指定的文件不能   打开,或者它位于UNC的份额上。“

请注意:我正在尝试打开数据库而不是尝试创建它 那么我做错了什么?我误解了什么吗?这些数据库文件如何工作(我的意思是,如何使用它们)?

4 个答案:

答案 0 :(得分:5)

您似乎认为数据库就像Word文档或文本文件一样,可以在应用程序实例中随意打开和关闭。这不是它的工作原理。

相反,通常只有一个数据库服务器程序实例(您可以安装多个实例,但它不像运行正常程序的两个副本)。您可以更多地考虑它,就好像您的数据库必须在此服务器实例中注册,并且您只能注册一个具有服务器名称的数据库。当您附加到MDF文件时,从服务器的角度来看,会创建一个新数据库(执行CREATE DATABASE命令)并告诉他将此MDF文件用于架构和数据。

我建议您使用Sql Server Management Studio并连接到本地系统上运行的服务器。你可能会发现那里有一个你想要的名字的数据库。

答案 1 :(得分:3)

我们的工作成果是 - 运行SQL 2008服务的用户没有对指定文件夹的权限。

答案 2 :(得分:2)

您的问题由两个问题组成:

  1. “使用”数据库文件(通过AttachDbFilename)时出现错误。错误sais'CREATE FILE .... failed'。
  2. 如果SQL Server的数据目录中存在同名文件,则无法“使用”数据库文件MyDataBaseFile.mdf
  3. 让我们来处理第一个问题。 “使用”数据库文件的过程实际上是 数据库附加到您的服务器实例。此操作(数据库附件)对您的应用程序是透明的,据我所知,只能使用Sql Server Express Edition。附加数据库文件时,只要每个SQL Server数据库必须有一个日志文件,就需要一个“动态”创建的日志文件(如果它不存在)。我不能说为什么你的SQL Server无法为你创建一个日志文件 - 天气不足,缺乏权限或其他什么。但至少你知道为什么要创建这个文件。附加数据库是作为数据库创建的特例实现的 - 这就是执行CREATE DATABASE语句的原因。

    现在我们来看第二期。数据库文件名通常从数据库名称派生。因此,如果您在数据库创建期间不编辑文件名,故意有两个相似的命名数据库文件意味着您将获得具有相同名称的数据库。如果其中一个文件驻留在SQL Server的数据目录中,则很可能是服务器使用它。当您尝试“使用”数据库文件(通过AttachDbFilename)时,实际上会导致尝试创建具有重复名称的数据库。这种尝试总会失败。

    希望这有帮助。

答案 3 :(得分:1)

MDF文件确实包含数据库,但事情更复杂。 (单个数据库实际上可以跨越几个mdf文件)

您不能将Sql Server视为基于文件的数据库,如MS Access或其他某些桌面数据库。你必须考虑服务器。服务器控制许多命名数据库,每个数据库由至少一个数据文件(.mdf)和一个日志文件(.ldf)备份。您首先通过服务器引用数据,然后通过服务器注册数据库,文件本身应该是您最后的关注点。

我认为您可能正在尝试使用已在使用的名称在服务器上重新创建数据库。是的,.mdf文件在不同的位置可以具有相同的名称,但是就服务器看到的那样,数据库的实际名称在该服务器中必须是唯一的。

如果您熟悉Web服务器,可以这里打个比方:您希望能够将html文件复制到不同的文件夹,然后只需使用浏览器导航到这些不同的文件夹吗?当然不是。首先,您必须创建一个Web服务器可识别的新虚拟文件夹,并可能调整其他一些设置,然后您就可以浏览“副本”了。 Sql Server中的数据库有点像Web服务器中的虚拟文件夹,因为数据可以“复制”,然后“看到”不同的数据存储。