2009-08-07 67 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

相关问题