【问题标题】:Is there any way to reference CDC objects in a SSDT database project?有没有办法在 SSDT 数据库项目中引用 CDC 对象?
【发布时间】:2013-12-26 22:58:46
【问题描述】:

我正在尝试从现有数据库创建数据库项目。数据库中的某些表启用了 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,以便我可以在源代码管理中查看?

【问题讨论】:

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


    【解决方案1】:

    是的,有办法做到这一点。这叫作弊,但效果很好。

    按照以下步骤操作:

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

    就是这样!

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

    【讨论】:

      猜你喜欢
      • 2013-10-21
      • 2020-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-15
      • 2023-03-04
      • 1970-01-01
      相关资源
      最近更新 更多