【问题标题】:LocalDB: change SQL Server default locationLocalDB:更改 SQL Server 默认位置
【发布时间】:2014-06-02 17:37:02
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    欢迎来到 2021 年。所以现在它与三年前 @dean 所描述的非常相似。您无法以文章View or Change the Default Locations for Data and Log Files 中提到的常规方式更改默认值,方法是使用 SSMS、Object Explorer,然后选择您的 SQLLocalDB 实例并在 Database Settings 选项卡。

    关于“为什么?”的最佳答案我发现来自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 中定义首选默认位置的 connection string 更新 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": "*"
    }
    

    【讨论】:

    • 我尝试将 AttachDbFileName 与“|DataDirectory|”一起使用并认为它会指向我的解决方案中的 AppData 文件夹,但它也指向 %USERPROFILE%\xxx.mdf(就像没有 |DataDirectory| 一样)。
    • @JensMander ,此信息来自 2009 年和 SQL Server Compact 版本,但我想这通常仍然有效,因为 LocalDb 和 Compact 背后的概念是相似的。总之:必须在主应用程序中设置 DataDirectory 属性,而不是通过环境变量设置。来源链接:social.msdn.microsoft.com/Forums/sqlserver/en-US/…
    【解决方案2】:

    我也一直在尝试自定义实例位置,并找到了解决方案。正如在之前的帖子中提到的,它似乎默认为%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...”之外的其他位置的选项。

    更新

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

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

    【讨论】:

    • 它可能特定于我运行它的执行环境,但我也发现有必要通过 NT 帐户而不是安全组授予访问权限。其他人在稍微不同的上下文 here 中遇到了这个问题,他们给出的解决方案是最终让它为我工作的原因(在 PowerShell 中:icacls $env:USERPROFILE /grant "$(whoami):(OI)(CI) (F)"
    • 在我的情况下,它默认为用户配置文件夹
    【解决方案3】:

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

    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

    【讨论】:

    • 我想我应该问一下是否可以在不同的位置创建服务器实例
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-12
    • 2020-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-19
    相关资源
    最近更新 更多