有没有办法在SSDT数据库项目中引用CDC对象?

时间:2013-12-26 22:58:46

标签: sql-server database-project sql-server-data-tools

我正在尝试从现有数据库创建数据库项目。数据库中的某些表启用了CDC。对于每个这样的表,我们创建了一个CDC数据视图,其类似于:

create view [dbo].[vw_cdc_myTable] as
select 
   sys.fn_cdc_map_lsn_to_time (__$start_lsn) ActionLocalTime
   ,    __$seqval ActionOrder
   ,    __$operation ImageType
   ,    case __$operation
            when 1 then 'Deleted'
            when 2 then 'Inserted'
            when 3 then 'Before Update'
            when 4 then 'After Update'
        end ImageType_desc
   ,    convert(char(5), '>>>>>') Sprtr
   ,    *
from 
    cdc.dbo_myTable_CT

SSDT抱怨这一点,因为它没有导入任何CDC对象(在本例中为cdc.dbo_myTable_CT和sys.fn_cdc_map_lsn_to_time)。有没有办法让那些导入或伪造SSDT,以便我可以在源代码管理中拥有视图?

1 个答案:

答案 0 :(得分:1)

是的,有办法做到这一点。它被称为作弊,但它创造了奇迹。

请按照以下步骤操作:

  1. 在您的解决方案中创建一个存根SSDT项目并将其称为CDC(或您想要的任何占位符名称)
  2. 将模式对象添加到名为[cdc]
  3. 的虚假项目中
  4. 编写dbo_myTable_CT的CREATE并将其作为表对象添加到您的虚假项目中
  5. 现在开始有趣了:将假项目作为数据库引用添加到主项目中,并将引用的SQLCMD变量命名为CDC(例如)
  6. 将视图中的from子句更改为如下所示:
    
        from [$(CDC)].cdc.dbo_myTable_CT
    
    
  7. 现在,在部署数据库时,当询问CDC数据库的实际名称时,只需在您自己的项目中使用相同的数据库名称。从技术上讲,它们是相同的数据库。您将部署主代码,而不会触及目标中的cdc表。
  8. 就是这样!

    您还可以使用此技巧完成部署忽略发布某些对象,同时仍然以某种方式使用它们。