Sql server 扩展现有表的Sql数据库项目

Sql server 扩展现有表的Sql数据库项目,sql-server,ssms,database-project,dacpac,Sql Server,Ssms,Database Project,Dacpac,我有一个“核心”VS数据库项目,其中包括一个名为[dbo].[MyTable]的表,表上有许多列。我在许多解决方案中重用了这个项目,其中还包括一个引用核心数据库项目的特定于应用程序的数据库项目,并将这些表中的更多表和FK添加到核心项目中的表中 是否可以“构建”核心数据库项目中定义的表,即向现有表中添加更多列,以便仅为一个特定于应用程序的数据库项目定义这些列,而不为重用同一核心数据库项目的任何其他项目定义这些列 编辑:我刚刚在6年前发现了同样的问题。显然,当时的答案是“不”,但也许在新版本的VS中

我有一个“核心”VS数据库项目,其中包括一个名为[dbo].[MyTable]的表,表上有许多列。我在许多解决方案中重用了这个项目,其中还包括一个引用核心数据库项目的特定于应用程序的数据库项目,并将这些表中的更多表和FK添加到核心项目中的表中

是否可以“构建”核心数据库项目中定义的表,即向现有表中添加更多列,以便仅为一个特定于应用程序的数据库项目定义这些列,而不为重用同一核心数据库项目的任何其他项目定义这些列

编辑:我刚刚在6年前发现了同样的问题。显然,当时的答案是“不”,但也许在新版本的VS中是可能的


这条评论太长了

如果我正确理解了您的问题,那么您正在寻找类似表继承的东西。Postgres支持这一点(参见文档)。这似乎正是你所描述的


如果是这样,那么SQLServer不直接支持它。我的建议是使用核心表,然后为每个应用程序使用另一个具有相同聚集索引的表作为附加列。

您可以在部署后脚本中添加列,但不幸的是,您无法在项目中的其他位置引用这些列。因此,在项目特定实例的部署后脚本中,我将检查表和列是否存在,如果列不存在,我将添加它。但是,脚本添加的列不会添加到数据模型中,以便您通过另一个存储过程或视图在其他地方引用

一种可能的解决方法是在核心项目中保持核心表的原样。在扩展项目中,创建一个表,将适当的外键和约束返回到核心表,以及其他列,实际上是1:1关系。如果需要,还可以使用一个视图虚拟化这两个表,该视图包含核心列,以及扩展表中的附加列


如果核心在所有实例中都是标准化的,那么您希望核心保持这种状态。将这些扩展视为责任分离规则的一部分。如果核心发生更改,它只会影响核心,如果扩展需要更改,则只应更改这些扩展。

您好,我不想在SQL Server中寻找表继承支持,我正在Visual Studio数据库项目中寻找设计时的继承支持—其输出将只是一个普通表,但包含在基础项目中定义的列以及在特定于应用程序的项目中添加到其中的列,请您也解释一下如何为“extension”表中的其他列使用相同的聚集索引进行配置?@SimonGreen您提出了错误的问题,并且混淆了关系和ER概念。ER确实有继承,但它以各种方式映射到最终的关系结构(每个类型的表、每个层次结构的表等)。VS数据库项目包含关系结构,而不是ER模型。@Panagiotis,我不是问ER概念。例如,这个问题与C#或VB类无关。在这个问题上,继承是一个不好的词,它显然是误导。我想很难解释这个问题,但我正在尝试在一个base VS DB项目中设计给定表的可重用列,然后在一个特定于应用程序的VS DB项目中为该表设计一些附加列,该项目引用base VS DB项目,这在SSDT中是不可能的。如果我理解您想要正确地做什么,您需要为每个部分项目制作一个单独的表。不能在基础项目中定义表的大部分,然后在子项目中对其进行调整。正如其他人所指出的,您的最佳选择可能是某种类型的“helper”表,聚集在连接列上,包含基表的ID以及特定子项目所需的任何额外列。实际上,这仍然是一个错误的问题。您将继承之类的ER概念与关系概念混为一谈-这是不同的事情。数据库项目表示关系模型,而不是ER。ER确实具有继承性、实类型以及与属性的关系。它们被映射到一个关系模型。Visual Studio(或任何其他DB工具)中的数据库项目不是数据库的ER模型,而是最终结果。我不确定您想说什么-您建议我应该做什么?或者使用提供继承并将其映射到关系模型的ER建模工具,或者手动创建表。您所问的问题对于数据库项目毫无意义。这是一个好问题,它不是关于“继承”,而是关于构造代码文件,这样您就有两个.sql文件来描述一个表,工具在部署时会为您组合它们。这将是一个很好的特性。是的,这就是我们决定要做的-基本上,我认为我的问题的答案是(仍然)不可能在DB项目中扩展引用其他DB项目的表。因此,唯一可用的选项是通过部署后脚本进行扩展,或者定义一个扩展表,该扩展表与核心表的映射为1:1(并且可以选择通过一个结合了2:1的视图进行交互)