我想知道是否可以更改(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>
答案 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 migrations 和 Code 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": "*"
}