复合项目 - 处理额外的列

Composite Projects - handling additional columns

从此post.....

http://blogs.msdn.com/b/ssdt/archive/2012/06/26/composite-projects-and-schema-compare.aspx

...似乎(相同)数据库引用是一种共享数据库公共部分的方法。

如果特定数据库需要来自(相同)数据库引用的 table 上的额外列,有什么方法可以处理吗?

我希望您可以通过在引用数据库项目中重新声明 table 来覆盖数据库引用中 table 的定义。

例如如果您在 Common Database 项目中有一个 Employee table,则在引用 Common Database 的客户端数据库中对 Employee table 的定义将覆盖 Common 项目中的定义。相反,当您去部署项目时,您会收到错误...

SQL71508: 该模型已有同名元素 dbo.Employee。

编辑:
考虑到下面的反馈,我做出的决定是不对现有客户端数据库使用数据库引用。相反,我创建了一个结构如下....

+OurCompanyDatabases
    +Common
        Common.sqlproj
        +dbo...
    +ClientA
        +dbo....
    +ClientB
        +dbo....
ClientA.sqlproj
ClientB.sqlproj

所以我在同一个文件夹中有多个 sqlproj 文件,我根据需要从项目中包含和排除文件。

例如,ClientA 的 Sales table 添加了一个 ClientARewardsID 列 我排除了 /OurCompanyDatabases/Common/dbo 文件夹中的 Sales table 并在/OurCompanyDatabases/ClientA/dbo 个文件夹。

这样,客户端 A 和客户端 B 可以保留对 SSDT 更新和部署的充分利用,同时最大限度地减少 sql 脚本的重复。我希望这会降低网站的维护成本。

今后我将使用数据库引用,并且将在新的 table 中添加额外的列,这些列具有与 Common table.[=12= 的外 1:1 外键关系]

为额外的列添加一个新的 table 并使其主键成为它扩展的 table 的外键是更安全和更好的做法。

不,它不支持继承类型模型,您只能真正共享完整的对象,因此在您的情况下,您可以将其结构化为:

  • proj a - TableA
    • 参考资料 - 项目共享
  • 项目 b - 表 A
    • 参考资料 - 项目共享
  • 项目共享 - TableXYZ

那么您可以有两个不同的 TableA 定义,但仍然共享所有相同的对象。

还有另一种选择,您不能在 SSDT 中包含 table 定义或包含一个或另一个,然后在 post 部署脚本中自行处理任何更改和部署并使用我的过滤器( http://agilesqlclub.codeplex.com/) 停止 ssdt 部署对您的 table 的任何更改,但这种方式使使用 ssdt 的主要原因之一无效(免费合并类型部署)。

编辑