捕获mssqlservice 修改表后的数据,统一存储到特定的表中,之后通过代码同步两个库的数据

根据之前的一些想法,如果有A,B 两个数据库, 如果把A 用户通过界面产生的更新或者插入修改,操作的数据同步更新到B 库中,如果允许延时2分钟以内

想法一: 通过创建触发器 把变更的数据和对应的表名称统一存储到某个特定的表,然后通过程序获取转换成sql 更新B数据库中的表,本文主要说明使用该方法

想法二: 通过CDC 记录变更的内容, 园内搜索:  SQL Server 变更数据捕获(CDC)监控表数据  即可 。

以下是测试:

drop  database  T_Mytest

create  database  T_Mytest

 -- 创建修改表
 use T_Mytest
  create table Mytest
  (
   id  int null ,
   name  nvarchar (20) null  ,
   OwndStore  int null 

  )

-- 创建记录修改了那个数据库,那张表的记录
create table testdatabaseLog
  (
   ID  int   identity  not null ,
    State int null ,-- 同步状态 0表示初始数据没有同步 ,1 表示已经同步需要插入的文件数据

   ChangeTableName nvarchar (25) null , -- 更新了哪个数据库表
   createdatetime datetime  null ,
   ActionType int  null ,  -- 1插入 2更新  3 删除
   ActionName  nvarchar(20) null ,
   Content  nvarchar (max) null  ,  -- 更新后的内容
   FromStore  int null  ,  --  该数据来自那个门店数据库  标识
   ToStore  int null  , -- 同步到那个门店进行处理
  )
go

  

二  创建重要的触发器语句 , 可以应用到所有需要同步的表中,只需要在创建的时候增加触发器即可,

不需要修改里面的内容,只需要修改触发器名称 和应该到哪张表即可

CREATE TRIGGER [dbo].[itrg_triggerTest]  ON [dbo].[Mytest]
 after  insert , update ,delete
AS
set nocount on
--查询该触发器触发的表
--SELECT @@PROCID, OBJECT_NAME( @@PROCID )
 declare  @tableName nvarchar(25)  ;

--宣告变量
DECLARE @D BIT = 0
DECLARE @I BIT = 0 

declare @content nvarchar(max)  ;
declare @actiontype int  ;
declare @actionName nvarchar(15)  ;
IF EXISTS(SELECT TOP 1 1 FROM DELETED)
begin
SET @D = 1
end 

IF EXISTS(SELECT TOP 1 1 FROM INSERTED)
begin
SET @I = 1
end 

IF @I = 1 AND @D = 0
begin
 set @actiontype=1  ;
  set @actionName=‘Insert‘
--select N‘插入‘+‘insert into ‘
 select  @content= (select   * from inserted for xml path)+‘‘

 -- select   * from inserted for xml path(@tableName),root(‘insert‘)
end
 else  IF @I = 1 AND @D = 1
begin
 set @actiontype=2  ;
  set @actionName=‘Update‘ ;
 select  @content= (select   * from inserted for xml path)+‘‘ ;

end
else
begin 

 set @actiontype=3  ;
  set @actionName=‘Delete‘
--select N‘删除‘+‘insert into ‘
 select  @content= (select   * from deleted for xml path)+‘‘ ;
end 

if ( @content is not null )
begin 

SELECT  @tableName =OBJECT_SCHEMA_NAME( parent_id ) + ‘.‘ + OBJECT_NAME( parent_id )  FROM sys.triggers WHERE object_id = @@PROCID

insert into  testdatabaseLog
  (
  ChangeTableName ,
  createdatetime ,
   ActionType ,
   ActionName  ,
   content,FromStore)
   values  ( @tableName ,GETDATE() , @actiontype, @actionName  ,@content,   1)  ;
end 

GO

  

-- 测试数据
  insert into Mytest values (1,‘苹果‘,1)
  insert into Mytest values (2,‘雪梨‘,1)
  insert into Mytest values (3,‘香蕉‘,1)

  

得到结果 测试

时间: 2024-10-14 06:04:36

捕获mssqlservice 修改表后的数据,统一存储到特定的表中,之后通过代码同步两个库的数据的相关文章

mysql(五)------针对主从同步的情况两个库进行数据校对及恢复

两台MySQL,发生了种种种种,导致了两个表的数据不一致,但是同步还在正常进行,后来意识到这种问题(可能之前skip啊,或者一开始搭建的时候就是不一致的状态),该如何修复呢?如果数据量小的情况可以考虑从新导数据,如果数据量很大的话,那就太要命了于是可以用percona-toolkit这个工具修复并并检查这种情况的再主备同步的时候在进行如下操作:在主库上安装pt-table-checksum安装: 1.安装软件包: # yum install perl perl-devel perl-Time-H

Scrapy爬取全站数据并存储到数据库和文件中

scrapy五大核心组件简介 引擎(Scrapy) 用来处理整个系统的数据流处理, 触发事务(框架核心) 调度器(Scheduler) 用来接受引擎发过来的请求, 压入队列中, 并在引擎再次请求的时候返回. 可以想像成一个URL(抓取网页的网址或者说是链接)的优先队列, 由它来决定下一个要抓取的网址是什么, 同时去除重复的网址 下载器(Downloader) 用于下载网页内容, 并将网页内容返回给蜘蛛(Scrapy下载器是建立在twisted这个高效的异步模型上的) 爬虫(Spiders) 爬虫

分表后 快速查询所有数据

MERGE存储引擎把一组MyISAM数据表当做一个逻辑单元来对待,让我们可以同时对他们进行查询.构成一个MERGE数据表结构的各成员MyISAM数据表必须具有完全一样的结构.每一个成员数据表的数据列必须按照同样的顺序定义同样的名字和类型,索引也必须按照同样的顺序和同样的方式定义. 假设你有几个日志数据表,他们内容分别是这几年来每一年的日志记录项,他们的定义都是下面这样,YY代表年份: [sql] view plain copy CREATE TABLE log_YY ( dt  DATETIME

MySql数据库在表中添加新字段,设置主键,设置外键,字段移动位置,以及修改数据库后如何进行部署和维护的总结

1,为当前已有的表添加新的字段 alter table student add studentName varchar(20) not null; 2,为当前已有的表中的字段设置为主键自增 alter table student add constraint PK_studentId primaryKey(studentId); 3,为当前已有的表中的字段设置为外键 alter table student add constraint FK_teacherId_studentInfo forei

ORACLE 查询一个数据表后通过遍历再插入另一个表中的两种写法

ORACLE 查询一个数据表后通过遍历再插入另一个表中的两种写法 语法 第一种: 通过使用Oracle语句块  --指定文档所有部门都能查看 declare cursor TABLE_DEPT is SELECT ID,UNAME from g_users where utype=2 and STATUS>-1; begin for c in TABLE_DEPT loop INSERT INTO G_KNOWDOCRIGHT(RID,DIRID,DOCID,USERID) VALUES(SYS

【半转贴】解决SQL SERVER 2008数据库表中修改字段后不能保存

SQL SERVER 2008数据库表中修改字段后不能保存,这种情况将阻止保存要求重新创建表的更改一项的钩钩去掉就OK了 找到工具>选项>Designers>表设计器和数据库设计器 然后将“阻止保存要求重新创建表的更改” 的这一项的钩钩去掉就OK了 图片来自:http://www.jb51.net/article/42727.htm 刚好碰到这个问题,用的就是上面的方法解决的 [半转贴]解决SQL SERVER 2008数据库表中修改字段后不能保存

Oracle Function:当页面端有屏蔽相关字段数据函数,只有指定用户才能查看;而当前用户无法获取到相关数据插到其他表中,这时需要获取后台用户替换当前用户,执行完相关语句后再还原为当前用户。

1.该函数的作用:入库单提交/审核通过时,将相关数据插到/更新'出入库历史记录表':delivery_entering_record 由于页面端屏蔽了单价,指定的用户才能看到,故 与单价有关的数据插不进"出入库历史记录表"delivery_entering_record中,所以要用后台的用户替换当前用户,执行完相关语句后,在还原为当前用户(如代码:178~184和第208行所示):否则,插进去的数据全为0. 1 create or replace function delivery_e

Python学习---Django误删除sql表后,如何创建数据

误删除sql表后,怎么创建数据? 仅仅适合单表,多表因为涉及约束, python mangage.py makemigrations  --> 生成migrations目录和根数据库对应的sql python mangage.py migrate         --> 同步数据到数据库内 python mangage.py migrate --fake    --> 不同步数据到数据库内 原文地址:https://www.cnblogs.com/ftl1012/p/9417319.ht

己亥清爽恢复系列之数据文件4篇:DROP表后如何恢复(非闪回技术)

己亥清爽系列说明:清爽系列是作为恢复系列的基础篇,基于FS(File System)文件系统的手工还原恢复,也叫基于用户管理的还原恢复,来自于博客园AskScuti. 实验说明:你不小心Drop掉了一张表数据,且没能及时反应过来,后面才恍然大悟,想利用闪回Drop技术进行闪回操作,可发现表空间被挤占,导致回收站里改表已被清空.如何进行手工不完全还原恢复操作.注:在数据文件.控制文件.在线日志和归档日志都完整的情况下. 基于版本:Oracle 11gR2 11.2.0.4 AskScuti 概念说