LocalDB:更改SQL Server的默认位置

本文关键字:默认 位置 Server SQL 更改 LocalDB | 更新日期: 2023-09-27 17:58:49

我想知道是否可以更改(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>

LocalDB:更改SQL Server的默认位置

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

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

我也一直在尝试自定义实例位置,并找到了解决方案。正如前几篇文章中提到的,它似乎默认为%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: ''用户&";。

更新

值得注意的是,这里的想法是只更改当前运行的进程的%USERPROFILE%环境变量,而不是在整个机器范围内。这是在命令提示符中使用set时的行为。上面提到的Environment.SetEnvironmentVariable方法重载也默认为这种行为,尽管最好使用以下内容更明确:

Environment.SetEnvironmentVariable("USERPROFILE", "c:''temp", EnvironmentVariableTarget.Process);

欢迎来到2021。所以现在它和@dean三年前描述的非常相似。您不能以查看或更改数据和日志文件的默认位置一文中提到的常规方式更改默认值,方法是使用SSMS,对象资源管理器,然后选择您的SQLLocalDB实例并在数据库设置选项卡上更改其属性。

关于";为什么"我发现它来自同一个来源:

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本地数据库。当我作为管理员尝试使用它时,我看到了以下内容:

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并尝试轻松使用实体框架迁移和代码优先的开发方法。您可以在字段AttachDbFileName中使用定义首选默认位置的连接字符串更新appsettings.json文件。

{
  "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": "*"
}