首页 > 数据库 >Sql数据库利用linkserver和 CT[CHANGE_TRACKING]实现发布订阅

Sql数据库利用linkserver和 CT[CHANGE_TRACKING]实现发布订阅

时间:2024-06-06 09:32:56浏览次数:27  
标签:TRACKING dbo 表名 SYS 同步 linkserver Sql OPERATION CHANGE

源服务器

初始化同步数据表

SELECT * INTO 【用于同步数据的表名】
FROM (
SELECT top 0
CT.SYS_CHANGE_VERSION,
CT.SYS_CHANGE_OPERATION,
CT.【同步数据表的主键ID】
FROM CHANGETABLE(CHANGES 源数据表名, 0) AS CT ) t


创建获取同步数据存储过程

TRUNCATE TABLE 【用于同步数据的表名】

INSERT INTO 【用于同步数据的表名】
(SYS_CHANGE_VERSION,SYS_CHANGE_OPERATION,【同步数据表的主键ID】)

SELECT
CT.SYS_CHANGE_VERSION,
CT.SYS_CHANGE_OPERATION,
CT.【同步数据表的主键ID】
FROM CHANGETABLE(CHANGES dbo.源数据表名, @last_sync_version) AS CT

订阅服务器

同步作业
创建同步记录表SyncTable

DECLARE @currentVersion BIGINT,@maxVersion bigInt
DECLARE @tableName nvarchar(100)
SET @tableName=''同步表名''
SELECT @currentVersion=SyncVersion FROM [dbo].[SyncTable] WHERE @tableName=tableName AND IsInitOver=1
---判断是否已经初始化完成
IF @currentVersion IS NOT null
BEGIN
EXEC xiaoben.SchoolBasic.dbo.[GetSyncData2] ''同步表名'',@currentVersion【最新版本】
DECLARE @insertCount INT,@updateCount INT,@deleteCount INT,@ChangeCount INT
SELECT @ChangeCount=COUNT(1),
@insertCount=ISNULL(SUM(CASE WHEN SYS_CHANGE_OPERATION=''I'' THEN 1 ELSE 0 end),0),
@deleteCount=ISNULL(SUM(CASE WHEN SYS_CHANGE_OPERATION=''D'' THEN 1 ELSE 0 end),0),
@updateCount=ISNULL(SUM(CASE WHEN SYS_CHANGE_OPERATION=''U'' THEN 1 ELSE 0 end),0)
FROM xiaoben.SchoolBasic.dbo.sync_tempSCHB_Account_UserInfo2
---开始批量插入
IF (@ChangeCount>0)
BEGIN

IF (@insertCount>0)
BEGIN
PRINT ''开始新增''
SET IDENTITY_INSERT [表名] ON

---新增先删除目标库存在的ID数据
INSERT INTO [dbo].[表名]
(【列名】
)
SELECT
t1.[列名]

FROM 【linkserver的名称】.[数据库的名称].dbo.[同步数据视图]  t1
WHERE t1.SYS_CHANGE_OPERATION=''I'' AND NOT EXISTS (SELECT [UserInfoID] FROM [dbo].[SCHB_Account_UserInfo] ttt WHERE ttt.[UserInfoID]=t1.[UserInfoID])

SET IDENTITY_INSERT [表名] OFF

END

IF @updateCount>0
BEGIN
---开始批量修改
PRINT ''开始修改''

UPDATE [表名] SET
[列名]=t.[列名]
,[列名]=t.[列名]

FROM (
select
t1.[列名]
,t1.[列名]

FROM 【linkserver的名称】.[数据库的名称].dbo.[同步数据视图] t1
WHERE t1.SYS_CHANGE_OPERATION=''U'') t where t.[表主键]=[表名].[表主键]
END

IF @deleteCount>0
BEGIN
---开始批量删除
PRINT ''开始删除''
DELETE FROM [表名] WHERE 【表主键】 IN(
SELECT 表主键 FROM 【linkserver的名称】.[数据库的名称].dbo.[同步数据视图]  WHERE SYS_CHANGE_OPERATION=''D''
)
END

INSERT INTO [dbo].[TableChangeLog]
([TableName]
,[SYS_CHANGE_VERSION]
,[SYS_CHANGE_OPERATION]
,[ID])
select
''表名''
,[SYS_CHANGE_VERSION]
,[SYS_CHANGE_OPERATION]
,[表主键] from 【linkserver的名称】.[数据库的名称].dbo.[同步数据视图] 

SELECT @currentVersion=MAX(SYS_CHANGE_VERSION) FROM 【linkserver的名称】.[数据库的名称].dbo.[同步数据视图] 
IF @currentVersion IS NOT NULL
BEGIN
PRINT ''更新版本''
UPDATE [dbo].[SyncTable] SET SyncVersion=@currentVersion WHERE @tableName=tableName AND IsInitOver=1
end
END
ELSE
BEGIN
PRINT ''无数据更新''
END
END

标签:TRACKING,dbo,表名,SYS,同步,linkserver,Sql,OPERATION,CHANGE
From: https://www.cnblogs.com/qq505610307/p/18234449

相关文章

  • sqlserver数据库开启linkedserver
    USE[master]GO/******Object:LinkedServer[链接名称]ScriptDate:2024/6/69:09:53******/EXECmaster.dbo.sp_addlinkedserver@server=N'链接名称',@srvproduct=N'MSSQL',@provider=N'SQLNCLI',@datasrc=N'远程数据库'/*For......
  • Sql数据库CT的开启
    1、数据库CT开启ALTERDATABASE[数据库名]SETCHANGE_TRACKING=ON(CHANGE_RETENTION=【Ct日志保留天数】DAYS,AUTO_CLEANUP=ON);关闭ALTERDATABASE[数据库名]SETCHANGE_TRACKING=OFF2、表CT开启ALTERTABLEdbo.[表名]ENABLECHANGE_TRACKINGWIT......
  • SQL Server如何判断哪些会话/连接是长连接?
    一般数据库中可能存在长连接或短连接会话。长连接是相对于通常的短连接而说的,也就是长时间保持客户端与服务端的连接状态。如果不从应用程序入手,如何判断SQLServer数据库中哪些会话是长连接呢?在SQLServer中有连接与会话的概念,一般而言,连接是物理概念,而会话则是逻辑上的概念。两......
  • U9C的数据查询视图Sql
    U9C的数据查询视图Sqlifobject_id('TEMPDB..#priceTable')isnotnullbegindroptable#priceTableendcreatetable#priceTable(polineCreatedOndate,pricevarchar(max),itemidvarchar(max),purchaseOrderdocnovarchar(max),)insertinto#priceTable......
  • python 连接sqlite简单示例
    importsqlite3#连接到SQLite数据库#数据库文件是test.db,如果文件不存在,会自动在当前目录创建#如果文件已存在,则连接到该数据库conn=sqlite3.connect('test.db')#创建一个游标对象#通过游标对象来执行SQL语句cursor=conn.cursor()#创建一个表cursor.execut......
  • MySQL-11.数据库的设计规范
    C-11.数据库的设计规范1.为什么需要数据库设计我们在设计数据表的时候,要考虑很多问题。比如:用户需要什么数据?需要在数据表中保存那些数据?如何保证数据表中数据的正确性,当插入,删除,更新的时候该进行怎样的约束检查?如何降低数据表的数据冗余度,保证数据表不会因为用户量的......
  • 【面试宝藏】MySQL 面试题解析
    MySQL面试题解析1.数据库三大范式是什么?第一范式(1NF):确保每列的原子性,即每列不能再分。第二范式(2NF):在满足1NF的基础上,每个非主属性完全依赖于主键,即消除部分依赖。第三范式(3NF):在满足2NF的基础上,任何非主属性不依赖于其他非主属性,即消除传递依赖。2.MySQL有关权限......
  • python 连接sqlite数据库
     首先要打开右边的Database,点击加号,选择图中的选项。  然后找到下载驱动,因为我的已经下载,就不提示了。在File类型后有三个点选择,找到自己创建的数据库。 之后就可以看到了。 实话来说,python确实比Java写的代码少,而且感觉跟容易理解,实现起来也是很直接。 ......
  • MyBatis的JdbcType与MySQL数据类型之间的对应关系
    MyBatis的JdbcType与MySQL数据类型之间存在一定的对应关系,这些映射帮助MyBatis在处理SQL查询时正确地将数据库中的数据类型转换为Java对象。以下是一些常用的MyBatisJdbcType与MySQL数据类型的对应关系:BIGINT-对应MySQL的BIGINT类型,用于存储大整数值。INTEGER -对应MySQL的......
  • 使用Python实现MySQL数据库备份
    数据库备份的重要性数据库备份是一项至关重要的任务,它可以帮助我们应对各种意外情况,如硬件故障、数据损坏、误操作等。通过定期备份数据库,我们可以保证数据的安全性,同时在发生意外时能够快速恢复数据,最大限度地减少业务影响和数据丢失。使用Python实现MySQL数据库备份使......