在 Visual Studio 2012/2010 数据库项目中获取 cdc 表
Posted
技术标签:
【中文标题】在 Visual Studio 2012/2010 数据库项目中获取 cdc 表【英文标题】:Get cdc tables in visual studio 2012/2010 database project 【发布时间】:2013-05-09 16:46:17 【问题描述】:我正在尝试在 Visual Studio 2012/2010 中创建一个需要 CDC (Change Data Capture) 表的数据库项目,因为我的很多视图都依赖于 CDC 表。我找不到任何导入 cdc 架构/表的方法 :(。在许多博客中阅读不支持导入 cdc。有什么解决方法吗?请建议
【问题讨论】:
想到的解决方法是在部署后脚本中删除/重新创建并在那里应用权限。当视图依赖于不存在或尚未存在的对象时,我必须这样做。它们仍会进行版本控制,但不会作为项目的一部分。 【参考方案1】:一般来说,您并不希望数据库项目创建 CDC 表,而是希望使用 sys.sp_cdc_enable_table 创建它们。 如果您允许数据库项目以正常方式创建表,那么 CDC 表最终会存在,但实际上不会启用它们的变更数据捕获。
显然,您可以在 Pre 或 Post 脚本中编写对 sys.sp_cdc_enable_table 的调用,但据我所知,这两个地方都不理想。
如果您将 sys.sp_cdc_enable_table 调用放在 Pre 脚本中,则并非所有原始表都存在(在新部署中它们都不存在),或者这些原始表将作为主要部署的一部分改变形状在 Pre 运行后发生。
如果您将 sys.sp_cdc_enable_table 调用放在 Post 脚本中,则不能将依赖于现有 CDC 表的视图部署为主数据库项目部署的一部分(在您的数据库项目中并非没有错误或警告)。
我建议不要有太多依赖于 CDC 表存在的视图、函数或存储过程,但听起来可能为时已晚。 旁注:一般来说,您应该使用 cdc.fn_cdc_get_all_changes_ 和 cdc.fn_cdc_get_net_changes_ 函数而不是直接引用 cdc 表,请参阅 Querying Change Data Capture data 但是,这只会将问题转移到您项目中不存在的那些功能上。 不幸的是,似乎没有一个好方法可以在不编写脚本的同时获得这些额外的视图,同时编写对 sys.sp_cdc_enable_table 的调用的脚本
(老实说,我希望其他人能提出一个更好的答案来真正解决问题)
【讨论】:
【参考方案2】:我们最近在实施阶段使用 TFS/VS 进行构建的数据库项目中遇到了同样的问题。
正如 Scott 正确所说,尝试在项目/解决方案中实现 cdc 架构或任何对象都不是一个好主意,这会产生您真的不想经历的不幸后果!
对于 TFS/VS 项目,您应该实施 Pre-PostDeployment 脚本策略,从而可以在 PreDeploy 过程中禁用 CDC,然后在 PostDepolyment 过程中重新创建实例。
通过这种方式,您可以确保统一创建正确的 CDC 实例。
再次考虑依赖视图时,策略并不难。 像通常在项目中那样创建视图,但作为占位符(例如,一个简单的 CREATE dbo.vMyView AS SELECT 1 FROM SomeTable)。在 PostDeployment 脚本中,添加一个执行 AFTER CDC 实例的进一步脚本,并为这些视图添加 ALTER 语句(例如 ALTER VIEW dbo.vMyView SELECT Col1 FROM cdc.MyCDC_CT)。请记住,视图一旦创建,即使基础表不存在,也可以存在。
【讨论】:
以上是关于在 Visual Studio 2012/2010 数据库项目中获取 cdc 表的主要内容,如果未能解决你的问题,请参考以下文章