本地数据库:更改SQL Server默认位置

13

我想知道是否有可能更改 (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个回答

13

我一直在尝试自定义实例的位置,并找到了解决方案。如前几篇帖子所暗示的那样,它似乎默认为%LOCALAPPDATA%\Microsoft\Microsoft SQL Server Local DB\Instances。经过一些实验,似乎SQLLocalDB命令行实用程序使用%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...”中的选项。

更新

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

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

可能是因为我运行的执行环境特殊,所以我发现需要通过NT账户而不是安全组来授予权限。其他人在稍微不同的情况下也遇到了这个问题在这里,他们得到的解决方案最终让我成功了(在PowerShell中:icacls $env:USERPROFILE /grant "$(whoami):(OI)(CI)(F)")。 - unbob
在我的情况下,它默认为用户个人资料文件夹。 - FindOutIslamNow

13

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

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

本文


我相信我应该问的是是否可以在不同的位置创建服务器实例。 - santBart

2
欢迎来到2021年。现在与三年前@dean所描述的非常相似。您无法像文章查看或更改数据和日志文件的默认位置中提到的那样通过使用SSMS,对象资源管理器,然后选择您的SQLLocalDB实例并在数据库设置选项卡上更改其属性来正常更改默认设置。
我在同一来源中找到的最好的答案是:

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

顺便说一下,也许你知道,也许不知道:你可以填写表格,然后在 服务器属性 对话框窗口的顶部查找 脚本 按钮。然后,如果你从下拉菜单列表中选择 将操作脚本化到新查询窗口,就会在新的查询窗口中看到类似以下内容的东西:
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迁移Code First开发方法,则有一个提示。您可以更新appsettings.json文件,并在AttachDbFileName字段中定义首选默认位置的连接字符串
{
  "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": "*"
}

我尝试使用AttachDbFileName和"|DataDirectory|",并想着它会指向解决方案中的AppData文件夹,但实际上它也指向了%USERPROFILE%\xxx.mdf(就像没有|DataDirectory|一样)。 - Jens Mander
1
@JensMander ,这些信息来自2009年和SQL Server Compact版,但我认为这仍然是有效的,因为LocalDb和Compact背后的概念是相似的。总之:DataDirectory属性必须在主应用程序中设置,而不是通过环境变量。源链接:https://social.msdn.microsoft.com/Forums/sqlserver/en-US/dc31ea59-5718-49b6-9f1f-7039da425296/where-is-datadirectory- - Gerard Jaryczewski

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