如何将 SQL Server localDB 升级到较新版本?

Posted

技术标签:

【中文标题】如何将 SQL Server localDB 升级到较新版本?【英文标题】:How do I upgrade SQL Server localDB to a newer version? 【发布时间】:2015-01-09 21:44:43 【问题描述】:

SqlServer localDB 从 2012 升级到 2014 可以吗?

我们目前使用的是 SQL Server 2012 的版本 11。我需要从 SQL Server 2014 升级到版本 12。

我希望能够做到这一点而不会丢失我的表格和数据。

我安装了一个新的 localDB,但我没有我的数据。它还有另一个名字,我不能真正更改配置文件,因为它是一个团队项目。

我尝试使用命令行 sqlLocalDB 工具创建一个名为 v11.0 的 2014 版本,但它以任何方式在旧的 2012 版本中创建。

C:\Program Files\Microsoft SQL Server\120\Tools\Binn>sqllocaldb create v11.0
LocalDB instance "v11.0" created with version 11.0.3000.0.

C:\Program Files\Microsoft SQL Server\120\Tools\Binn>sqllocaldb create v12.0
LocalDB instance "v12.0" created with version 12.0.2000.8.

C:\Program Files\Microsoft SQL Server\120\Tools\Binn>sqllocaldb create aaaaa
LocalDB instance "aaaaa" created with version 12.0.2000.8.

为什么将它命名为 v11.0 会改变使用的版本?

如何升级现有的 v11.0?

【问题讨论】:

您告诉它使用v11.0 创建一个11.0 版本的数据库。从命令行输入 sqllocaldb /? 并阅读它对 create 的说明。 没有。 v11.0 是 localDB 名称。我可以在版本 11 中创建一个名为 v12.0。但我无法在版本 12 中创建 v11.0o。C:\Program Files\Microsoft SQL Server\120\Tools\Binn>sqllocaldb create v12.0 11.0使用版本 11.0.3000.0 创建的 LocalDB 实例“v12.0”。 C:\Program Files\Microsoft SQL Server\120\Tools\Binn>sqllocaldb create v11.0 12.0 LocalDB instance "v11.0" 由于以下错误而创建失败:LocalDB Instance API 方法的参数不正确.请查阅 API 文档。 没有。 v11.0 是您告诉它创建的版本,因为您会看到您是否按照我的要求执行。 阅读文档,在这种情况下,这就像我在命令提示符下所说的那样简单。 当然,与其争论我是否正确,您可以尝试两个简单的事情:1) 阅读文档,它在@987654326 后面写了一个数字@ 参数表示所需的版本,并且 2) 再试一次,将数字更改为 'v999.99' 之类的其他值,看看会发生什么。 我已阅读文档。第一个参数是实例名称,然后是可选的版本号。在这种情况下,v11.0 是实例名称。我创建了 v999.99,它创建了一个名为 12 的实例。 【参考方案1】:

更新:

Visual Studio 2022 附带 Microsoft SQL Server 2019 15.0.4153.1 LocalDB。如果您安装了 Visual Studio 2022,但之前使用过 Visual Studio 的早期版本,您可以跳转到下面的命令sqllocaldb versions 进行升级。

https://developercommunity.visualstudio.com/t/visual-studio-2022-installs-old-version-of-sql-ser/1466986

原文:

这是我所做的,因为 Visual Studio 2019 仍然附带 Microsoft SQL Server 2016 (13.1.4001.0) LocalDB

我需要这样做,因为我尝试使用失败的级联删除添加 Temporal tables

https://docs.microsoft.com/en-us/sql/relational-databases/tables/temporal-tables?view=sql-server-ver15

执行 DbCommand 失败 (31ms) [Parameters=[], CommandType='Text', CommandTimeout='30'] ALTER TABLE 文本集(SYSTEM_VERSIONING = ON (HISTORY_TABLE = History.Text));

将 SYSTEM_VERSIONING 设置为 ON 失败,因为表 'Project.Repository.dbo.Text' 有一个带有级联删除的外键 或更新。

阅读后发现此错误仅影响 SQL Server 2016,而不影响 2017 及更高版本。

ON DELETE CASCADE 和 ON UPDATE CASCADE 不允许在 当前表。换句话说,当临时表正在引用时 表中的外键关系(对应 parent_object_id in sys.foreign_keys) 不允许使用 CASCADE 选项。 要解决此限制,请使用应用程序逻辑或之后 触发器以保持主键表中删除的一致性 (对应于 sys.foreign_keys 中的 referenced_object_id)。如果 主键表是临时的,引用表是非临时的, 没有这样的限制。

此限制仅适用于 SQL Server 2016。级联选项是 从 CTP 2.0 开始在 SQL 数据库和 SQL Server 2017 中受支持。

https://***.com/a/54591579/3850405

https://docs.microsoft.com/en-us/sql/relational-databases/tables/temporal-table-considerations-and-limitations?view=sql-server-2017

您可以通过在 Powershell 中运行命令 sqllocaldb info 来获取有关当前 localDB 的信息。

这是一个很好的升级指南,但我选择做一些不同的事情。

https://medium.com/cloudnimble/upgrade-visual-studio-2019s-localdb-to-sql-2019-da9da71c8ed6

下载SQL Server Express 2019 LocalDB或更新版本并运行exe。

https://docs.microsoft.com/en-us/sql/database-engine/configure-windows/sql-server-express-localdb?view=sql-server-ver15

选择下载媒体:

本地数据库:

从下载的exe安装:

我的建议是在此之后重新启动您的计算机,但我不确定是否需要这样做。反正我做到了。

检查sqllocaldb versions 导致我出现异常Windows API call "RegGetValueW" returned error code: 0.

用这个答案解决了:

https://***.com/a/58275480/3850405

这是Registry Editor (regedit) 在非工作示例中的样子:

更改文件夹名称后一切正常:

在此之后备份您当前 localdb 中的数据库。这可能不需要,因为我们稍后会将您当前 localdb 中的所有数据库附加到新版本,但如果您有敏感数据,建议这样做。

我有来自 Visual Studio 的标准名称 MSSQLLocalDB,所以我的示例将使用它。如前所述,您可以使用sqllocaldb info 命令查看您当前的版本。

从 powershell 运行这三个命令:

sqllocaldb stop mssqllocaldb
sqllocaldb delete mssqllocaldb
sqllocaldb create MSSQLLocalDB

如果一切正常,最后一个命令应该生成类似LocalDB instance "mssqllocaldb" created with version 15.0.2000.5.

然后通过 SSMS (localdb)\mssqllocaldb 或类似程序登录到您的新 LocalDB 并附加您的旧数据库。通常存放在%UserProfile%文件夹中。

LocalDB 现已更新,希望您的所有数据库都能正常工作。

【讨论】:

我正在寻找的最伟大和最有用的答案之一...感谢分享!! 我希望我能加 10 个赞!非常感谢! 我来找铜的时候发现了金子。谢谢,描述性很强,效果很好。【参考方案2】:

正如 MSDN (Not too well chosen title...) 的此链接中所述,只需双击 .mdf 文件即可触发转换...在我的情况下没有发生这种情况(可能是因为必须拥有 Sql Server Management Studio 软件或类似的软件,这是事实)。

所以,这里有一个替代程序:

在 Visual Studio 中打开“服务器资源管理器”

点击左上角的“连接数据库”图标

在列表中选择“Microsoft SQL Server”并按下一步

将此作为服务器名称写入:(LocalDB)\MSSQLLocalDB

在下面的选项中选择“附加数据库文件”,然后浏览到您的 .mdf 文件

继续,这应该会显示一个对话框,询问您是否触发转换

就是这样。一点也不直观,但很有效。除了前面提到的链接之外,我没有找到任何关于它的文档,所有其他步骤都是纯粹的直觉,但对我有用,我也希望对你有用。

【讨论】:

在 Visual Studio 2015 中,我完全按照您的描述进行了操作。在升级我的 mdf 文件后,作为最后一步,我删除了新连接并在 web.config "(LocalDb)\v11.0" 中替换为 "(LocalDB)\MSSQLLocalDB",然后我可以使用我现有的连接字符串。 【参考方案3】:

要针对特定​​版本的 LocalDb,请使用 12.0 或 11.0 作为参数。例如:

sqllocaldb create "mydb" 12.0

您的命令失败的原因是您错误地引用了版本。这在 -?信息。

使用“v12.0”作为第一个参数只是设置实例名称。如果没有给出第二个版本参数,则使用默认版本。

【讨论】:

我明白这一点。但是,我似乎无法使用版本 12 创建一个名为 v11.0 的实例。它适用于所有其他名称。 您是否尝试过先停止并删除v11.0版本? 如果名称遵循默认格式,在确定版本时似乎也要注意实例名称。除了最新安装的版本之外,我无法创建“mssqllocaldb”。【参考方案4】:

升级 SQL Server LocalDb 实例的一种简单方法是从 %LocalAppData%\Microsoft\Microsoft SQL Server Local DB\Instances\ 目录中删除实例数据目录。下次使用该实例时,它将使用最新安装的版本重新创建。

【讨论】:

在此之后不要忘记重新附加您的数据库。【参考方案5】:

v11.0 似乎是 LocalDB 2012 automatic 实例的特殊名称。它与此版本严格绑定。而 2014 和 2016 版本为此使用相同的 MSSQLLocalDB 名称。

More about LocalDB instances

【讨论】:

名字无所谓【参考方案6】:

我还要补充 @Ogglas 的回答,如果你想在你的软件中自动迁移它,你可以按照这个步骤。

升级时执行以下步骤(升级步骤或升级代码):

    读取数据库的当前物理路径: use dbName; SELECT physical_name FROM sys.database_files WHERE name = 'dbName' 检查数据库的当前 SQL 版本 - 通过 SQLLocalApi 实用程序类或在单独的进程中运行 sqllocaldb i your_db 或通过类似的方式:
DECLARE @dbversion nvarchar(128)

SET @dbversion = CAST(serverproperty('ProductVersion') AS nvarchar)
SET @dbversion = SUBSTRING(@dbversion, 1, CHARINDEX('.', @dbversion) - 1)

SELECT @dbversion -- this will give you the major version (eg. 12 or whatever is your old version)
...
    按照原始答案运行中的建议(或使用您的自定义数据库名称)
sqllocaldb stop mssqllocaldb
sqllocaldb delete mssqllocaldb
sqllocaldb create MSSQLLocalDB
    如果第 2 步中的 @dbversion 是旧版本(例如,对于 SQL LocalDB 2014 为 12),则使用第 1 步中记录的物理路径重新附加数据库。
CREATE DATABASE [dbName]
    ON PRIMARY (NAME=dbName, FILENAME = 'dbPath')
    for attach;
    可选:升级数据库的兼容性级别(因为重新附加 MDF 将保留旧的兼容性级别)。
EXEC('ALTER DATABASE db_name SET COMPATIBILITY_LEVEL = 150'); -- or whatever version you are upgrading to

【讨论】:

对于没有 VS 或 SSMS 等 GUI 工具的情况非常有用。

以上是关于如何将 SQL Server localDB 升级到较新版本?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 SQL Server LocalDB 数据库移动到新计算机

将 SQL Server 身份验证与 localdb 一起使用

如何使数据库转到 SQL Server 而不是 localDB?

为 SQL Server LocalDB 创建永久别名

如何使用 Invoke-Sqlcmd 连接到 SQL Server LocalDB?

无法将 SQL Server LocalDB 用于我的 WPF 应用程序