LocalDB:更改SQL Server默认位置

时间:2014-04-18 08:21:45

标签: c# sql .net sql-server localdb

我想知道是否可以更改(LocalDB)的默认位置。使用SqlLocalDB.exe创建时,默认位置为

C:\Users\userId\AppData\Local\Microsoft\Microsoft SQL Server Local DB\Instances\MyDB

我相信此路径在(LocalDB)连接字符串中使用(由*.dbml文件的创建者自动生成):

<connectionStrings>
    <add name="MyApp.Properties.Settings.MyConnectionString"
         connectionString="Data Source=**(LocalDB)**\MyDB;Initial Catalog=sthDB;Integrated Security=True"
         providerName="System.Data.SqlClient" />
</connectionStrings>

3 个答案:

答案 0 :(得分:9)

我一直在尝试自定义实例位置,并找到了解决方案。如之前的帖子中所提到的,它似乎默认为%LOCALAPPDATA%\Microsoft\Microsoft SQL Server Local DB\Instances。经过一些实验,似乎SQLLocabDB命令行实用程序使用%USERPROFILE%环境变量(而不是%LOCALAPPDATA%)来查找此位置。

以下对我有用(在命令提示符下使用SQLLocalDB):

C:\Users\dan.smith>echo %USERPROFILE%
C:\Users\dan.smith

C:\Users\dan.smith>set USERPROFILE=c:\temp

C:\Users\dan.smith>echo %USERPROFILE%
c:\temp

C:\Users\dan.smith>mkdir c:\temp\AppData\Local

C:\Users\dan.smith>sqllocaldb create test
LocalDB instance "test" created with version 13.0.1100.286.

C:\Users\dan.smith>cd C:\temp\AppData\Local\Microsoft\Microsoft SQL Server Local DB\Instances\test

C:\temp\AppData\Local\Microsoft\Microsoft SQL Server Local DB\Instances\test>dir /w
 Volume in drive C has no label.
 Volume Serial Number is 4A71-7A6F

 Directory of C:\temp\AppData\Local\Microsoft\Microsoft SQL Server Local DB\Instances\test

[.]                                      [..]
error.log                                error1.log
log.trc                                  master.mdf
mastlog.ldf                              model.mdf
modellog.ldf                             msdbdata.mdf
msdblog.ldf                              system_health_0_131061520581180000.xel
tempdb.mdf                               templog.ldf
              12 File(s)     46,701,550 bytes
               2 Dir(s)  117,107,499,008 bytes free

如图所示,这在c:\temp下创建了我的LocalDB实例,尽管从“AppData”开始继承原始文件夹层次结构(这似乎是不可更改的)。请注意,还必须手动创建文件夹层次结构的“AppData \ Local”部分,否则会失败。

下一个问题实际上是从C#应用程序连接到此数据库。为此,必须将%USERPROFILE%环境变量设置为与上面相同的位置,即:

Environment.SetEnvironmentVariable("USERPROFILE", "c:\\temp");

这应该在建立数据库连接之前完成。可能最好在应用程序的入口点的某个地方执行此操作。

总而言之,这有点像黑客攻击,但至少可以选择在“c:\ users ...”之外的其他地方存储东西。

答案 1 :(得分:6)

您无法更改默认值,但可以为您创建的每个数据库更改默认值:

create database foo on (name='foo', filename='c:\DBs\foo.mdf')

http://blogs.msdn.com/b/sqlexpress/archive/2011/10/28/localdb-where-is-my-database.aspx

答案 2 :(得分:1)

欢迎来到 2021 年。所以现在它与 @dean 三年前描述的非常相似。您无法以文章 View or Change the Default Locations for Data and Log Files 中提到的常规方式更改默认值,方法是使用 SSMS、对象资源管理器,然后选择您的 SQLLocalDB 实例并更改其在 数据库上的属性设置标签。

关于“为什么?”的最佳答案我发现它来自the same source

<块引用>

SQL Server Express LocalDB 的实例是由用户创建供他们使用的实例。计算机上的任何用户都可以使用 LocalDB 实例创建数据库,在其用户配置文件下存储文件,并在其凭据下运行该过程。默认情况下,LocalDB 实例的访问权限仅限于其所有者。

顺便说一句,也许您知道这一点,也许不知道:您可以填写表单,然后在服务器属性对话框窗口顶部查找脚本按钮。然后,如果您从下拉菜单列表中选择 Script Action to New Query Window,您可以看到如下内容(在新查询窗口中):

USE [master]
GO
EXEC xp_instance_regwrite N'HKEY_LOCAL_MACHINE', N'Software\Microsoft\MSSQLServer\MSSQLServer', N'BackupDirectory', REG_SZ, N'C:\Data'
GO
EXEC xp_instance_regwrite N'HKEY_LOCAL_MACHINE', N'Software\Microsoft\MSSQLServer\MSSQLServer', N'DefaultData', REG_SZ, N'C:\Data'
GO
EXEC xp_instance_regwrite N'HKEY_LOCAL_MACHINE', N'Software\Microsoft\MSSQLServer\MSSQLServer', N'DefaultLog', REG_SZ, N'C:\Data'
GO

不幸的是,它可能仅适用于“真正的”SQL Server,而不适用于 SQL Local DB。当我尝试以管理员身份使用它时,我看到了这个:

Msg 22002, Level 16, State 1, Line 2
RegCreateKeyEx() returned error 5, 'Access is denied.'
Msg 22002, Level 16, State 1, Line 4
RegCreateKeyEx() returned error 5, 'Access is denied.'
Msg 22002, Level 16, State 1, Line 6
RegCreateKeyEx() returned error 5, 'Access is denied.'

所以有一个提示,特别是如果您使用 .NET Core/5 并尝试轻松使用 Entity Framework migrationsCode First 开发方法。您可以使用在 AttachDbFileName 字段中定义首选默认位置的 appsettings.json 更新 connection string 文件。

{
  "ConnectionStrings": {
    "DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=ContactManager;Trusted_Connection=True;MultipleActiveResultSets=true;AttachDbFileName=C:\\Data\\ContactManager.mdf;"
  },
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "AllowedHosts": "*"
}