有2个数据库,怎么实现数据同步

有2个数据库,怎么实现数据同步,第1张

在pgsql的数据中将要同步的表建立一个一模一样的同步表。然后建触发器,将进入源表中的数据触发到同步表中。然后做一个windows服务扫描这个同步表并且将同步表中的数据同步到mysql

或access中。

如果是整个数据库中有许多表要进行同步。则建立一个共用的同步表,结构非常简单。字段如下:

主键(f_id),源表名(f_tablename),主键字段名(f_keyname),主键值(f_keyvalue), *** 作标识(f_operflag

i:插入

u:更新

d:删除),时间字段(f_time).将要同步的表都建立触发器,只要有增、改、删都触发到这个表里。这样你只扫描这个共用的同步表,根据这些字段值完全可以实现数据的同步。隔离网闸就是这么个原理,只不过它的要比这复杂多了!

若对于同一数据库实例中的两个数据库进行同步则直接对数据库表创建Trigger。 SQL Server 2005的联机帮助: Trigger on an INSERT, UPDATE, or DELETE statement to a table or view (DML Trigger) CREATE TRIGGER [ schema_name . ]trigger_name ON { table | view } [ WITH [ ,...n ] ] { FOR | AFTER | INSTEAD OF } { [ INSERT ] [ , ] [ UPDATE ] [ , ] [ DELETE ] } [ WITH APPEND ] [ NOT FOR REPLICATION ] AS { sql_statement [ ] [ ...n ] | EXTERNAL NAME } ::= [ ENCRYPTION ] [ EXECUTE AS Clause ] ::= assembly_name.class_name.method_name 以下是一个例子 set ANSI_NULLS ON set QUOTED_IDENTIFIER ON go -- ============================================= -- Author: gsoosg -- Create date: 2007-12-24 -- Description: -- ============================================= CREATE TRIGGER [Trigger_Add_Carduser] ON [dbo].[carduser] AFTER INSERT AS BEGIN -- SET NOCOUNT ON added to prevent extra result sets from -- interfering with SELECT statements. SET NOCOUNT ONset insert ParkFee.dbo.card_user(card_user_id,card_user_name,sex) select card_user_id,card_user_name,sex from inserted END 说明: 上例实现了为当前数据库中表carduser创建触发器当插入数据时,同步向ParkFee数据库表dbo.card_user插入数据,从而达到同步插入。类同,可将insert语句改为update,delete。 注意: 若想利用此方法达到反向同步则可能出现问题,比如想在parkfee数据库有新数据插入时让当前数据库也同时插入一条记录,建立一个触发器,则形成了一个循环触发,当插入数据时会报大于最大递归次数错。因此因避免这样的触发循环,若要达到类似效果还须想别的方法。(待续) 补充: 若两个库处于不同的数据库服务器则应先进行以下 *** 作: 在server1 上创建连接服务器,以便在 server1 中 *** 作 server2,实现同步 exec sp_addlinkedserver 'server2','','SQLOLEDB','server2的数据库实例名或ip' exec sp_addlinkedsrvlogin 'server2','false',null,'用户名','密码' go

create TRIGGER [dbo].[tr_tb_erp_make_Pack_insert]

ON [dbo].[tb_erp_make_Pack]

FOR INSERT

AS

BEGIN

SET XACT_ABORT ON

SET NOCOUNT ON

declare @out_Flag int=0

declare @out_Rtn varchar(40)=''

declare @smsg nvarchar(400)

DECLARE @v_barCode VARCHAR(20)

DECLARE @v_cInvCode NVARCHAR(20)

DECLARE @v_packID INT

DECLARE @v_packDate DATETIME

DECLARE @v_userID INT

begin tran

DECLARE Cur CURSOR FOR

SELECT barCode,cInvCode,packID,packDate,userID FROM inserted

OPEN Cur

FETCH NEXT FROM Cur INTO @v_barCode,@v_cInvCode,@v_packID,@v_packDate,@v_userID

WHILE @@FETCH_STATUS=0

BEGIN

SET @out_Flag = 0

SET @out_Rtn='添加成功!'

IF EXISTS(SELECT 1 FROM tb_erp_make_barCode WHERE barCode=@v_barCode)

BEGIN

UPDATE dbo.tb_erp_make_barCode SET cInvCode=@v_cInvCode,packID=@v_packID,packDate=@v_packDate,vFlag=0 WHERE barCode=@v_barCode

IF @@error <>0

BEGIN

SET @out_Flag=1

SET @out_Rtn='触发器修改(UPDATE)错误!'

SET @smsg='错误:'+@out_Rtn

ROLLBACK TRAN

RAISERROR (@smsg,11,1)

RETURN

END

END

ELSE

BEGIN

INSERT INTO dbo.tb_erp_make_barCode

(

barCode ,packID ,packDate ,cInvCode

)

VALUES (

@v_barCode ,@v_packID ,GETDATE() ,@v_cInvCode

)

IF @@error <>0

BEGIN

SET @out_Flag=2

SET @out_Rtn='触发器新增(INSERT)错误!'

SET @smsg='错误:'+@out_Rtn

ROLLBACK TRAN

RAISERROR (@smsg,11,1)

RETURN

END

END

FETCH NEXT FROM Cur INTO @v_barCode,@v_cInvCode,@v_packID,@v_packDate,@v_userID

END

CLOSE Cur

DEALLOCATE Cur

COMMIT TRAN

RETURN

END


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9970582.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-03
下一篇 2023-05-03

发表评论

登录后才能评论

评论列表(0条)

保存