Visual Studio SQL Server 2016 数据库项目和临时表

Posted

技术标签:

【中文标题】Visual Studio SQL Server 2016 数据库项目和临时表【英文标题】:Visual Studio SQL Server 2016 database project and Temporal Tables 【发布时间】:2016-12-06 09:07:35 【问题描述】:

有没有办法在 Visual Studio SQL Server 2016 数据库项目中启用临时表?我找不到让它工作的方法。我想这可能是一个兼容性问题,我发现的唯一方法是在部署后脚本中启用该表,但是在下一次部署时,该脚本会为有问题的列生成丢弃。

【问题讨论】:

您使用的是哪个版本的 Visual Studio 和 SSDT? 确切的行为是什么?您是说尝试部署到现有数据库会为现有列生成 DROP 语句而不生成临时表?浏览临时表最安全的选择 您尝试部署哪些更改? 我无法重现这个。 SSDT 已经有一个临时表模板。修改表会生成预期的架构修改语句,首先将数据复制到临时表以避免数据丢失 我意识到这是一个非常古老的帖子,但我遇到了类似的问题。事实证明,这个问题与时态表无关。这正是 Schema Compare 标记为问题的原因。真正的问题是我的数据库项目无法编译,因为我的数据库包含对其他数据库的引用。我必须为所有引用的数据库添加数据库项目,为每个引用其他数据库的数据库添加数据库引用,并将数据库名称更改为调用其他数据库的 sql 代码中的变量。 【参考方案1】:

支持临时表。最新版本的 SSDT for Visual Studio 2015 已经包含一个临时表模板,该模板将 WITH (SYSTEM_VERSIONING = ON(HISTORY_TABLE=[dbo].[MyTempTable_HISTORY], DATA_CONSISTENCY_CHECK=ON)) 子句添加到表创建脚本并创建历史表。

修改表会生成与修改任何其他表以避免数据丢失时生成的脚本相同的脚本 - 将数据复制到新的临时表,重建原始表,然后将数据复制回来。

唯一的“奇怪”行为是即使重命名重构也会重新创建 history 表,这会生成 sp_rename 命令,例如:

GO
EXECUTE sp_rename @objname = N'[dbo].[MyTempTable].[Name]', @newname = N'Name1', @objtype = N'COLUMN';


GO
PRINT N'Starting rebuilding table [dbo].[MyTempTable_HISTORY]...';


GO
CREATE TABLE [dbo].[tmp_ms_xx_MyTempTable_HISTORY] (

【讨论】:

即使使用“GENERATED ALWAYS AS ROW START”列也能正常工作吗? 有什么作用?该模板确实包含句点列,并且它们确实具有GENERATED ALWAYS AS ROW START/END 子句。您可以在发布前将其名称更改为您想要的任何名称。

以上是关于Visual Studio SQL Server 2016 数据库项目和临时表的主要内容,如果未能解决你的问题,请参考以下文章

Visual Studio 2019 缺少 SQL Server

使用已安装的 sql server 的 Visual Studio

如何在没有 SQL Server Management Studio 的情况下在 SQL Server Express LocalDB 中使用 Visual Studio 2013 创建两个表之间的关

SQL-server 如何与 visual studio 建立连接

Visual Studio 连接 Sql Server

SQL Server 生成 Visual Studio 声称是错误的代码?