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

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

我正在尝试从现有数据库创建一个数据库项目。数据库中的某些表启用了 CDC。对于每个这样的表,我们创建了一个 CDC 数据 View ,如下所示:

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 以便我可以在源代码管理中查看 View 吗?

最佳答案

是的,有办法做到这一点。这就是所谓的作弊,但它会产生奇迹。

请按照以下步骤操作:

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

就是这样!

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

关于sql-server - 有没有办法在SSDT数据库项目中引用CDC对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20792364/

相关文章:

c# - 使用 SSDT 作为 T4 模板的来源

sql-server - SqlServer处于脚本升级模式

sql-server - SQL Server 计划缓存中的即席查询和准备好的查询有什么区别?

sql - 如何正确使用 Sql Server ROW_NUMBER 函数进行有序查询?

visual-studio-2013 - VS2013数据库项目构建失败

git - Visual Studio 2015,使用 GIT 扩展和数据库项目 .dbmdl 文件

sql-server - 在单元测试之前运行脚本

sql-server - 按时间查找可用性

sql-server - SSDT 项目发布事务部署

reporting-services - 字典中不存在给定的键 - Visual studio SSDT Deploy