我正在尝试从现有数据库创建一个数据库项目。数据库中的某些表启用了 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 吗?
最佳答案
是的,有办法做到这一点。这就是所谓的作弊,但它会产生奇迹。
请按照以下步骤操作:
- 在您的解决方案中创建一个 stub SSDT 项目并将其命名为 CDC(或您想要的任何占位符名称)
- 向该虚假项目添加一个名为 [cdc] 的架构对象
- 编写 dbo_myTable_CT 的 CREATE 脚本并将其作为表对象添加到您的虚拟项目中
- 现在有趣的事情开始了:添加该假项目作为主项目的数据库引用,并将引用的 SQLCMD 变量命名为 CDC(例如)
- 将 View 中的 from 子句更改为如下所示:
from [$(CDC)].cdc.dbo_myTable_CT
- 现在,当您部署数据库时,当询问 CDC 数据库的实际名称时,只需在您自己的项目中使用相同的数据库名称即可。从技术上讲,它们是相同的数据库。您的主要代码将被部署,而目标中的 cdc 表不会被触及。
就是这样!
您还可以使用此技巧来使部署完全忽略某些对象的发布,同时仍以某种方式隐藏它们。
关于sql-server - 有没有办法在SSDT数据库项目中引用CDC对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20792364/