Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/jenkins/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL Server:正在加载数据库文件_Sql Server_Sql Server 2008 - Fatal编程技术网

Sql server SQL Server:正在加载数据库文件

Sql server SQL Server:正在加载数据库文件,sql-server,sql-server-2008,Sql Server,Sql Server 2008,我正在使用SQLServer2008。我应该能够“连接”到用户指定的数据库文件(mdf)(使用连接字符串的AttachDbFilename部分)并保存所选文件的副本。我还必须处理数据库的内容 如果我没有弄错,一个mdf文件代表一个完整的数据库,其中包含表、存储过程等。但是,如果我在不同的文件夹中有两个同名的文件(一个在SQL Server的DATA文件夹中,另一个在C:)的根目录中,我尝试在C下加载该文件:我得到一个错误,指出已经存在一个同名的数据库 我重命名了C:下的文件,但现在出现错误: “

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

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

我重命名了C:下的文件,但现在出现错误:

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

请注意:我正在尝试打开数据库,而不是尝试创建它。

那么我做错了什么?我误解了什么吗?这些数据库文件是如何工作的(我的意思是,如何使用它们)?

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

相反,数据库服务器程序通常只有一个实例(您可以安装多个实例,但这与运行普通程序的两个副本不同)。您可以把它想象成您的数据库必须在这个服务器实例中注册,并且您只能为服务器注册一个具有给定名称的数据库。从服务器的角度来看,当您附加到MDF文件时,会创建一个新数据库(执行CREATE database命令),并告知将此MDF文件用于架构和数据


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

MDF文件确实包含该数据库,但情况更为复杂。(一个数据库实际上可以跨多个mdf文件)

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

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


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

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

  • “使用”数据库文件时(通过AttachDbFilename)出现错误。错误是“创建文件…”。。。。“失败”
  • 如果SQL Server的数据目录中存在同名文件,则无法“使用”数据库文件MyDataBaseFile.mdf
  • 让我们来处理第一个问题。“使用”数据库文件的过程实际上是将数据库附加到服务器实例。此操作(数据库附件)对您的应用程序是透明的,据我所知,只有Sql Server Express Edition才能执行此操作。附加数据库文件时,您需要一个日志文件,该文件在不存在的情况下“动态”创建—只要每个SQL Server数据库都必须有一个日志文件。我无法解释为什么您的SQL Server无法为您创建日志文件——不管是因为空间不足、权限不足还是其他原因。但至少您知道为什么要创建此文件。附加数据库是作为数据库创建的一种特殊情况实现的——这就是执行CREATEDATABASE语句的原因

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


    希望这能有所帮助。

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

    好的,我想我现在明白了,谢谢。给我留下印象的原因是,LINQtoSQL(我最初使用的工具,但因为它太差劲,我切换到ADO.NET)需要mdf(要使用的数据库文件)的文件路径。这让我认为MSSQL是这样工作的……谢谢,这有助于理解这个问题。太好了!这对我也很管用。我给了用户“Everyone”对目录的完全读写访问权,然后是SQL Serv