更新不是指定用于SQL Server CDC的索引的聚集唯一索引时,解决不可预知的结果
当SQL Server表为具有一个或多个唯一索引/主键的CDC启用时。如果聚集唯一索引不是指定与CDC一起使用的索引,并且您更新了聚集唯一索引,它将生成一个_uu$Seqval,显示删除的行作为最后一个操作,该操作将中断get net change函数,因为它会说它不存在,而实际上它仍然存在 我认为这是因为唯一聚集索引是如何更新的() 是否有人知道解决此问题的方法,或者是否有我做错的事情会导致此问题的发生。我扔掉了一个连接物品,但我担心那将是一个墓地 复制问题的代码:更新不是指定用于SQL Server CDC的索引的聚集唯一索引时,解决不可预知的结果,sql,sql-server,Sql,Sql Server,当SQL Server表为具有一个或多个唯一索引/主键的CDC启用时。如果聚集唯一索引不是指定与CDC一起使用的索引,并且您更新了聚集唯一索引,它将生成一个_uu$Seqval,显示删除的行作为最后一个操作,该操作将中断get net change函数,因为它会说它不存在,而实际上它仍然存在 我认为这是因为唯一聚集索引是如何更新的() 是否有人知道解决此问题的方法,或者是否有我做错的事情会导致此问题的发生。我扔掉了一个连接物品,但我担心那将是一个墓地 复制问题的代码: CREATE DA
CREATE DATABASE REPO_CDC_ISSUE
GO
USE REPO_CDC_ISSUE
GO
CREATE TABLE TEST_VICTIM(
TestVictim_ID int identity(1,1),
ParentVictim_ID int,
TextDateColumn_CDE char(6),
DateColumn_DTE date,
OtherColumnForPosterity char(20),
untracked int
)
ALTER TABLE TEST_VICTIM
ADD CONSTRAINT pk_TEST_VICTIM PRIMARY KEY NONCLUSTERED (TestVictim_ID)
CREATE UNIQUE CLUSTERED INDEX IDX_TEST_VICTIM_ParentVictim_ID_TextDateColumn_CDE ON TEST_VICTIM(
ParentVictim_ID,TextDateColumn_CDE
)
INSERT INTO TEST_VICTIM VALUES(1,'201401','2015-01-01','30853513',1)
INSERT INTO TEST_VICTIM VALUES(2,'201402','2015-01-01','30853513',1)
INSERT INTO TEST_VICTIM VALUES(3,'201403','2015-01-01','30853513',1)
INSERT INTO TEST_VICTIM VALUES(4,'201404','2015-01-01','30853513',1)
USE [master]
GO
ALTER DATABASE [REPO_CDC_ISSUE] ADD FILEGROUP [CDC]
GO
ALTER DATABASE [REPO_CDC_ISSUE] ADD FILE ( NAME = N'REPO_CDC_ISSSUE_CDC', FILENAME = N'D:\DBData01\REPO_CDC_ISSSUE_CDC.ndf' , SIZE = 51200KB , FILEGROWTH = 10%) TO FILEGROUP [PRIMARY]
GO
USE REPO_CDC_ISSUE
GO
EXEC sys.sp_cdc_enable_db
GO
EXEC sys.sp_cdc_enable_table
@source_schema = N'dbo'
, @source_name = N'TEST_VICTIM'
, @role_name = N'cdc_admin'
, @capture_instance = N'dbo_TEST_VICTIM'
, @supports_net_changes = 1
, @index_name = N'pk_TEST_VICTIM'
, @captured_column_list = N'TestVictim_ID, ParentVictim_ID, TextDateColumn_CDE,DateColumn_DTE,OtherColumnForPosterity'
, @filegroup_name = N'PRIMARY';
GO
INSERT INTO TEST_VICTIM VALUES(5,'201301','2013-01-01','30853513',1)
INSERT INTO TEST_VICTIM VALUES(6,'201302','2013-01-01','30853513',1)
INSERT INTO TEST_VICTIM VALUES(7,'201303','2013-01-01','30853513',1)
INSERT INTO TEST_VICTIM VALUES(8,'201304','2013-01-01','30853513',1)
go
select *
from cdc.dbo_TEST_VICTIM_ct
go
create table #ARD_CHANGES(
TextDateColumn_CDE varchar(43) ,
DateColumn_DTE varchar(40),
TestVictim_ID int
)
insert into #ARD_CHANGES values ('201301','2013-01-01',6),
('201301','2013-02-18',5)
go
UPDATE pte
SET pte.TextDateColumn_CDE = ARDCHG.TextDateColumn_CDE
,pte.DateColumn_DTE = ARDCHG.DateColumn_DTE
FROM TEST_VICTIM pte
INNER JOIN #ARD_CHANGES ARDCHG
ON pte.TestVictim_ID = ARDCHG.TestVictim_ID
WAITFOR DELAY '00:00:30'
select TestVictim_ID ,__$start_lsn,__$seqval,__$operation
from cdc.dbo_TEST_VICTIM_ct
where TestVictim_ID in (5,6)
order by TestVictim_ID ,__$start_lsn,__$seqval
DECLARE @from_lsn binary(10),
@to_lsn binary(10)
set @from_lsn =sys.fn_cdc_get_min_lsn ('dbo_TEST_VICTIM')
set @to_lsn = sys.fn_cdc_get_max_lsn ()
SELECT *
FROM cdc.fn_cdc_get_net_changes_dbo_TEST_VICTIM(@from_lsn, @to_lsn, 'all');
drop table #ARD_CHANGES
EXEC sys.sp_cdc_disable_table
@source_schema = N'dbo',
@source_name = N'TEST_VICTIM',
@capture_instance = N'dbo_TEST_VICTIM'
GO
EXEC sys.sp_cdc_disable_db
GO
use master
GO
alter database REPO_CDC_ISSUE SET restricted_user WITH ROLLBACK IMMEDIATE
GO
DROP DATABASE REPO_CDC_ISSUE