我应该如何在SQL Server Management Studio中更改LocalDB的“数据库默认位置”?

27
  1. 在 SSMS 中连接到 LocalDB
  2. 打开服务器属性->数据库设置 enter image description here
  3. 更改数据/日志/备份位置-> 点击确定

当我点击“确定”时,出现以下错误: enter image description here

在博客中找到了一些帖子并在 regedit 中进行了更改,但没有帮助。 enter image description here

有人有其他想法可以尝试吗?


本地数据库不作为服务运行(我认为)。进程会根据需要停止/启动,对吗?哪个Windows用户/登录运行这些进程?该用户/登录是否具有更改注册表的权限? - Dave Mason
我在HKCU\Software\Microsoft\Microsoft SQL Server\UserInstances下找到了更多的键,但它们也没有帮助... - bricelam
我也遇到了同样的错误,你解决了吗? - john
不,我使用默认位置。 - PussInBoots
@john 和 PussInBoots:在 LocalDB 中,路径很可能是不可更改的。请参阅我的答案并点击链接获取更多详细信息。但是,这个错误也会在 LocalDB 2014、2016 和 2017 中出现。这意味着,这种行为在所有 4 个版本的 SQL Server Express LocalDB 中都存在。 - Solomon Rutzky
将来参考,我在这里找到了解决方案https://dba.stackexchange.com/questions/39410/move-folder-of-sql-server-localdb-instances-from-the-default-location - Dimitris
6个回答

6

我不认为 SQL Server LocalDB 的默认路径可以更改。这是相当不幸的,因为似乎 SQL Server Express 2017 LocalDB 存在一个错误 ** (修复于 SQL Server 2017 CU 6),详见 DBA.StackExchange 上这个问题(以及我的回答):

LocalDB v14 creates wrong path for mdf files

然而,您并不需要使用默认路径。当您创建一个数据库时,如果指定了物理位置,则应该能够将文件创建到任何您拥有读写访问权限的文件夹/目录中。


1

在当前版本(15.0)的Microsoft SQL Server Express中,这仍然是一个持续存在的问题。

经过一番调查,我发现注册表内部存在权限问题。进程sqlservr.exe无法在 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL15E.LOCALDB\MSSQLServer 中创建条目。

在我的电脑上,该进程正在我的帐户下运行,因此我打开了regedit并给自己赋予了完全控制权限以访问此键。这很顺利地解决了问题。我希望这也能帮到你。


谢谢!这正是我的问题所在。说实话,我甚至没有意识到个别注册表键上有权限(现在写下来听起来很蠢)。 - bigAl

0

在注册表中进行更改后,请尝试重新启动SQL实例。 此外,我会确保运行SQL Server的帐户具有向该文件夹写入的能力。 对于一个简单的测试,您可以转到文件夹属性 -> 安全性,然后添加帐户“everyone”,然后给予他们完全控制权。然后尝试进行更改。如果它起作用了,那么这是一个针对该帐户的权限问题。通常情况下,帐户没有访问其他用户帐户的权限,除非拥有某种级别的管理员权限。


这对我来说看起来像是一个答案。然而,系统自动标记它为潜在的低质量内容。也许提供更多细节可以帮助改进它? - jkdev
1
@jkdev和Oops_U_broke_it:不,这不是答案。这个答案似乎更适用于非LocalDB版本的SQL Server。但是LocalDB在用户空间运行,因此登录的用户就是运行它的用户(除了共享实例)。没有服务,因此也没有服务帐户。因此,如果您可以进入文件夹以更改权限,则可以通过LocalDB访问该文件夹。这些默认路径在LocalDB中很可能无法更改。请参阅我的答案并按照链接获取更多详细信息。 - Solomon Rutzky

0

在 RegEdit 或 SSMS 中更改这些路径无法生效,因为 SQL LocalDb 不会将这些值应用于现有数据库。必须手动移动数据库。以下是在任何 LocalDB 实例中更改数据库位置的可靠方法。

首先,请确保您正在使用正确的 SQL Server LocalDB 实例。在命令提示符中输入:

sqllocaldb info

它将显示您机器上的LocalDB实例。假设实例名称为MSSQLLocalDB

接下来,使用SqlCmd工具或SSMS,在您的数据库(我们称之为TestApp)上执行此脚本:

alter database TestApp
modify file (name = TestApp, filename = 'C:\NewDataLocation\TestApp.mdf');
go

alter database TestApp
modify file (name = TestApp_log, filename = 'C:\NewDataLocation\TestApp_log.ldf');
go

现在,在命令提示符中停止 SQL LocalDB 实例:

sqllocaldb stop MSSQLLocalDB

将数据库文件移动到脚本中指定的新位置。从%UserProfile%\TestApp.mdf(它们所在的位置)移动到C:\NewDataLocation\TestApp.mdf,LDF文件同理。

重新启动SQL LocalDB实例:

sqllocaldb start MSSQLLocalDB

现在你的数据库已经从新位置开始运行。对于任何其他数据库,请重复这些步骤。


0

路径不能更改在 SQL Server LocalDB "自动实例" 类型中

如果2023年有人发现他们不能更改默认数据库文件存储路径,那么本文就是为您而写的!

此错误适用于Microsoft SQL Server无法允许您更改PC上保存SQL Server数据库文件(数据库和日志文件,.mdf和.ldf)的默认文件夹位置。

大多数开发人员经常需要控制本地数据库文件的保存位置。他们倾向于将它们存储在一个中心位置、另一个驱动器或者简单地放在C:\Program Files\Microsoft SQL Server\{sql version name}\MSSQL\DATA内的主SQL Server数据库存储库中,因为那是系统数据存储的地方。不能自定义数据库文件存储位置的问题之一可能是使用Entity Framework Core,它运行“迁移”脚本来创建SQL Server中的数据库。当它这样做时,这些脚本数据库存储的位置严重依赖于SQL Server的默认文件路径设置。当这些EF代码优先的数据库文件使用LocalDB被锁定在某个位置时,开发人员就会被困在他们PC的多个位置的SQL文件中。

问题

显然,当Microsoft在您的设备上安装SQL Server / SQL Express时,它会尝试安装服务器的默认实例作为一种特殊类型,称为"LocalDB Automatic Instance"。他们这样做是为了让用户快速启动和运行"LocalDB" SQL服务器实例,这是一个一次性的、"轻量级"的、定制创建的服务器,作为公共实例运行,具有默认设置,这些设置是为用户(或开发人员)定制的,以便他可以快速启动和运行。自动类型的优点是,它被授予用户在SQL中作为管理员的权限,并授予用户设备上的所有应用程序对服务器实例的公共访问权限。(您会注意到,IIsExpress使用ApplicationPools作为虚拟Windows用户帐户,创建默认帐户,以在IIS中运行应用程序池。)这些SQL Server LocalDB二进制文件不作为服务运行,而是按需运行。但每个版本每个设备只能安装一个"自动"类型。另一个SQL Server LocalDB 类型命名实例,不像自动那样受限制,显然。

问题在于,当他们创建这个特殊的LocalDB自动实例时,它会锁定某些设置并应用某些权限和设置,这些权限和设置仅适用于此实例。这将限制用户在自定义方面所能做的事情之一是“数据库默认位置”,该选项位于属性对话框中,右键单击SQL Server实例并选择属性时出现。
任何使用完整SQL Server版本或已创建新的LocalDB实例并删除旧实例的人都不会遇到此问题,因此大多数人都感到困惑。
但对于本地开发人员而言,这意味着运行在服务器此实例下的Sql Server LocalDB数据库通常会将其数据库存储在受限路径下...即您在安装时选择的路径或默认的用户友好帐户路径下的C:\Users\{YourName}。
当用户试图在实例的属性框中更改路径时,许多在线用户在过去5-6年中注意到一个令人不快的“RegCreateKeyEx()返回错误5拒绝访问”的问题,这将在保存默认路径时出现。 微软并不会告诉你,但这是有意的。 他们不希望允许您将路径保存到实例的注册表中,并假定每个人都对默认路径感到满意。
你可以通过进入注册表并更改Microsoft SQL Server注册表键的权限来修复关键错误,将“Everyone”组帐户分配给管理这些键的注册表节点。 在注册表中,将“Everyone”组账户添加到以下节点,然后尝试为您的SQL Server LocalDB实例在属性框中保存新的默认路径:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server

本地db服务器实例的默认数据库文件路径键(2019)在Windows注册表中的位置位于此处:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL15E.LOCALDB\MSSQLServer

然后,您可以在SQL中保存新的默认路径,错误就会消失。现在,在属性框中保存默认路径有效,并且新值将出现在注册表中。

尽管您可以更改这些路径,但是它们不会保持,而是默认重置回用户帐户路径。 即使为数据库保存了新的默认sql路径,创建新数据库时仍会恢复到旧路径。 再次强调,这仅适用于在安装SQL Express时创建的默认“自动”LocalDB实例下运行的用户。

因此,即使重新启动SQL、重新启动计算机或重新启动SQL服务,那些注册表值仍然无法将注册表键提取到SQL Server实例设置的默认文件路径中

为证明,请在您的 SQL Server LocalDB 实例中运行以下两个脚本。第一个返回 SQL Server 内部存储的实际LocalDB 默认文件路径。第二个脚本返回存储在您的注册表中的LocalDB 默认文件路径。如果您保存了新的默认路径注册表键,则它们应该相同并显示在 SQL Server 实例属性中,但它们是不同的!这意味着微软已决定不允许您更改安装时运行"自动"实例类型的 LocalDB 的这些属性。以下是用于测试的 T-SQL:

-- GETS THE PATH STORED IN SQL SERVER FOR "DefaultData" path
SELECT
[Value] = 'DefaultData',
[Data] = SERVERPROPERTY('InstanceDefaultDataPath')
-- DefaultData  C:\Users\YourAccountName\



-- GETS WHATS IN THE REGISTRY FOR "DefaultData" path
EXECUTE [master].dbo.xp_instance_regread
N'HKEY_LOCAL_MACHINE',
N'SOFTWARE\Microsoft\Microsoft SQL Server\MSSQLServer',
N'DefaultData'
-- DefaultData  C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\DATA

-- Note: If the second one returns `NULL` it just means you 
-- have not yet tried or succeeded in saving a new file path
-- to your registry.

为什么SQL Server LocalDB没有拉取注册表值?

这意味着很抱歉,您不能更改这些默认路径。你最好的选择是“分离”你的数据库,将.mdf.ldf文件复制到你新的首选文件夹中,然后重新附加。当你创建新的数据库时,控制台允许你在那里更改数据库文件路径。还有一些复杂的SQL脚本可以运行,以在保存文件之前设置路径。

但要知道这是出于设计目的。


-2

我认为 LocalDB 的一个目的是,它非常方便地将演示数据库与应用程序的源文件捆绑在一起。当然,数据库文件及其日志位于源文件目录中。

以 Visual Studio 解决方案为例,在 web.config 或 app.config 中,您可以看到类似以下的内容:

<connectionStrings>
<add name="DefaultConnection" connectionString="Data Source=(LocalDb)\v11.0;Initial Catalog=aspnet-XXXXXX-20140609153630;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\aspnet-XXXXXX-20140609153630.mdf" providerName="System.Data.SqlClient" />

现在每个 LocalDB 的位置都在配置文件中指定,我认为“默认位置”没有太多意义。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接