复合项目 - 处理附加列
Posted
技术标签:
【中文标题】复合项目 - 处理附加列【英文标题】:Composite Projects - handling additional columns 【发布时间】:2015-12-15 05:43:47 【问题描述】:从这篇文章....
http://blogs.msdn.com/b/ssdt/archive/2012/06/26/composite-projects-and-schema-compare.aspx
...似乎(相同的)数据库引用是共享数据库公共部分的一种方式。
如果特定数据库需要(相同)数据库引用的表上的其他列,有什么方法可以处理吗?
我希望您可以通过在引用数据库项目中重新声明表来覆盖数据库引用中的表定义。
例如如果您在 Common Database 项目中有一个 Employee 表,则引用 Common Database 的 Client Database 中 Employee 表的定义将覆盖 Common 项目中的定义。相反,当您去部署项目时,您会收到错误...
SQL71508:模型已经有一个同名的元素 dbo.Employee。
编辑: 预期下面的反馈,我做出的解决方案是不对现有客户端数据库使用数据库引用。相反,我创建了一个如下结构......
+OurCompanyDatabases
+Common
Common.sqlproj
+dbo...
+ClientA
+dbo....
+ClientB
+dbo....
ClientA.sqlproj
ClientB.sqlproj
所以我在同一个文件夹中有多个 sqlproj 文件,我根据需要在项目中包含和排除文件。
例如,ClientA 的 Sales 表添加了一个 ClientARewardsID 列,我在 /OurCompanyDatabases/Common/dbo 文件夹中排除了 Sales 表,并在 /OurCompanyDatabases/ClientA/dbo 文件夹中创建了一个新的 Sales 表。
这样客户端 A 和客户端 B 可以保留对 SSDT 更新和部署的充分利用,同时最大限度地减少 sql 脚本的重复。我希望这会降低网站的维护成本。
接下来,我将使用数据库引用,并将在新表中添加额外的列,并与 Common 表具有 1:1 的外键关系。
【问题讨论】:
【参考方案1】:不,它不支持继承类型模型,您只能真正共享完整的对象,因此在您的情况下,您可以将其结构如下:
项目 - 表 A 参考 - 项目共享 项目 b - 表 A 参考 - 项目共享 项目共享 - TableXYZ那么您可以有两个不同的 TableA 定义,但仍然共享所有相同的对象。
还有另一个选项,您不能在 SSDT 中包含表定义或包含其中一个,然后在部署后脚本中自己处理任何更改和部署,并使用我的过滤器 (http://agilesqlclub.codeplex.com/) 停止 ssdt 部署任何更改到您的桌子上,但这种方式使使用 ssdt(免费合并类型部署)的主要原因之一无效。
编辑
【讨论】:
【参考方案2】:为额外的列添加新表并使其主键成为其扩展表的外键会更安全、更好。
【讨论】:
是的,我同意。这是一个重构已经有公共表的现有数据库的问题,其中几乎所有列都是公共的,除了一两个额外的列。以上是关于复合项目 - 处理附加列的主要内容,如果未能解决你的问题,请参考以下文章