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

时间:2014-11-12 21:42:15

标签: sql-server upgrade localdb

是否可以将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?

6 个答案:

答案 0 :(得分:15)

正如MSDN(Not too well chosen title...)中的链接中所述,只需双击.mdf文件就可以触发转换...这种情况在我的情况下没有发生(也许是因为有必要Sql Server Management Studio软件或类似的东西是真实的。)

所以,这是一个替代程序:

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

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

  • 在列表中选择“Microsoft SQL Server”,然后按“下一步”

  • 将其写为服务器名称:(LocalDB)\ MSSQLLocalDB

  • 在下面的选项中选择“附加数据库文件”,在浏览器中选择.mdf文件

  • 继续,这应显示一个对话框,要求您触发转换

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

答案 1 :(得分:6)

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

sqllocaldb create "mydb" 12.0

您的命令失败的原因是您错误地引用了该版本。这一点在 - ?资讯

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

答案 2 :(得分:1)

似乎v11.0是LocalDB 2012 自动实例的特殊名称。它与此版本严格相关。虽然2014年和2016年版本为此目的共享相同的MSSQLLocalDB名称。

More about LocalDB instances

答案 3 :(得分:1)

这是我所做的,因为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(31毫秒)[Parameters = [],CommandType ='Text', CommandTimeout = '30'] ALTER TABLE文本设置(SYSTEM_VERSIONING = ON (HISTORY_TABLE = History.Text));

将SYSTEM_VERSIONING设置为ON失败,因为表 'Project.Repository.dbo.Text'具有带级联DELETE的FOREIGN KEY 或更新。

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

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

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

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

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

enter image description here

您可以通过在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

选择下载媒体:

enter image description here

LocalDB:

enter image description here

从下载的exe安装:

enter image description here

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

检查sqllocaldb versions对我造成了Windows API call "RegGetValueW" returned error code: 0.异常。

enter image description here

使用以下答案解决了它:

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

这是Registry Editor(regedit)在不起作用的示例中的样子:

enter image description here

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

enter image description here

enter image description here

此操作之后备份当前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.

的内容

enter image description here

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

enter image description here

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

我还要在 @Ogglas 的回答中补充一点,如果您想在您的软件中自动迁移它,您可以按照以下步骤操作。

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

  1. 读取数据库的当前物理路径: use {dbName}; SELECT physical_name FROM sys.database_files WHERE name = '{dbName}'
  2. 检查您的数据库的当前 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)
...
  1. 按照原始答案运行中的建议(或使用您的自定义数据库名称)
sqllocaldb stop mssqllocaldb
sqllocaldb delete mssqllocaldb
sqllocaldb create MSSQLLocalDB
  1. 如果第 2 步中的 @dbversion 是旧版本(例如,SQL LocalDB 2014 为 12),则使用第 1 步中记录的物理路径重新附加数据库。
CREATE DATABASE [{dbName}]
    ON PRIMARY (NAME={dbName}, FILENAME = '{dbPath}')
    for attach;
  1. 可选:升级数据库的兼容性级别(因为重新附加 MDF 将保留旧的兼容性级别)。
EXEC('ALTER DATABASE {db_name} SET COMPATIBILITY_LEVEL = 150'); -- or whatever version you are upgrading to