- 在 SSMS 中连接到 LocalDB
- 打开服务器属性->数据库设置
- 更改数据/日志/备份位置-> 点击确定
当我点击“确定”时,出现以下错误:
在博客中找到了一些帖子并在 regedit 中进行了更改,但没有帮助。
有人有其他想法可以尝试吗?
当我点击“确定”时,出现以下错误:
在博客中找到了一些帖子并在 regedit 中进行了更改,但没有帮助。
有人有其他想法可以尝试吗?
我不认为 SQL Server LocalDB 的默认路径可以更改。这是相当不幸的,因为似乎 SQL Server Express 2017 LocalDB 存在一个错误 ** (修复于 SQL Server 2017 CU 6),详见 DBA.StackExchange 上这个问题(以及我的回答):
LocalDB v14 creates wrong path for mdf files
然而,您并不需要使用默认路径。当您创建一个数据库时,如果指定了物理位置,则应该能够将文件创建到任何您拥有读写访问权限的文件夹/目录中。
在当前版本(15.0)的Microsoft SQL Server Express中,这仍然是一个持续存在的问题。
经过一番调查,我发现注册表内部存在权限问题。进程sqlservr.exe无法在 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL15E.LOCALDB\MSSQLServer
中创建条目。
在我的电脑上,该进程正在我的帐户下运行,因此我打开了regedit并给自己赋予了完全控制
权限以访问此键。这很顺利地解决了问题。我希望这也能帮到你。
在注册表中进行更改后,请尝试重新启动SQL实例。 此外,我会确保运行SQL Server的帐户具有向该文件夹写入的能力。 对于一个简单的测试,您可以转到文件夹属性 -> 安全性,然后添加帐户“everyone”,然后给予他们完全控制权。然后尝试进行更改。如果它起作用了,那么这是一个针对该帐户的权限问题。通常情况下,帐户没有访问其他用户帐户的权限,除非拥有某种级别的管理员权限。
在 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
现在你的数据库已经从新位置开始运行。对于任何其他数据库,请重复这些步骤。
如果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 类型是命名实例
,不像自动那样受限制,显然。
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脚本可以运行,以在保存文件之前设置路径。
但要知道这是出于设计目的。
我认为 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 的位置都在配置文件中指定,我认为“默认位置”没有太多意义。
HKCU\Software\Microsoft\Microsoft SQL Server\UserInstances
下找到了更多的键,但它们也没有帮助... - bricelam