--数据较少时,可以手工同步,更方便控制--用触发器即时同步两个表的实例:--测试环境:SQL2000,远程主机名:xz,用户名:sa,密码:无,数据库名:test--创建测试表,不能用标识列做主键,因为不能进行正常更新
--在远程主机上建表
if exists (select * from dbo.sysobjects where id = object_id(N'[test]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [test]create table test(id int not null constraint PK_test primary key
,name varchar(10))
go--以下操作在本机进行
--在本机上建表及做同步处理的工作
if exists (select * from dbo.sysobjects where id = object_id(N'[test]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [test]create table test(id int identity(1,1) primary key
,name varchar(10))
go--创建同步的触发器
create trigger t_test on test
for insert,update,delete
as
set  XACT_ABORT on
--启动远程服务器的MSDTC服务
exec master..xp_cmdshell 'isql /S"xz" /U"sa" /P"" /q"exec master..xp_cmdshell ''net start msdtc'',no_output"',no_output--启动本机的MSDTC服务
exec master..xp_cmdshell 'net start msdtc',no_output--进行分布事务处理,如果表用标识列做主键,用下面的方法
BEGIN DISTRIBUTED TRANSACTION
delete from openrowset('sqloledb','xz';'sa';'',test.dbo.test)
where id in(select id from deleted)
insert into openrowset('sqloledb','xz';'sa';'',test.dbo.test)
select * from inserted
commit tran
go--插入数据测试
insert into test
select 1,'aa'
union all select 2,'bb'
union all select 3,'c'
union all select 4,'dd'
union all select 5,'ab'
union all select 6,'bc'
union all select 7,'ddd'--删除数据测试
delete from test where id in(1,4,6)--更新数据测试
update test set name=name+'_123' where id in(3,5)--显示测试的结果
select * from test a full join
openrowset('sqloledb','xz';'sa';'',test.dbo.test) b on a.id=b.id

解决方案 »

  1.   

    参考我的贴子:数据同步
    http://expert.csdn.net/Expert/topic/2555/2555290.xml?temp=.8188135
      

  2.   

    http://search.csdn.net/expert/topic/57/5704/2003/12/12/2555290.xml
     zjcxc(邹建) ( ) 的精华帖
    该上精华区啊!
      

  3.   

    --上面的那个地址错了数据同步
    http://search.csdn.net/expert/topic/57/5704/2003/12/12/2555290.xml
      

  4.   

    create or replace trigger Ins_Upd_Del_Odrsfcd
      Before Insert Or Update Or Delete On Odrsfcd
      For Each Row
    /*****************************************************
    程式類別 :Trigger
    程序功能 :當資材有領料時,派工單不能進行修改和刪除的動作
              A.如果要進行修改請資材人員將發料單刪除,或將發料數量update成0
              B.如果有退料,請先將退料單刪除
    程式名稱 : Ins_Upd_Del_Odrsfcd
    原設計者 : 設立日期 : 2003/07/27
    ------------------異動記錄明細-----------------
    異動日期   異 動 者   異   動   原   因
    2003/08/02 發料單如果有發料,則不可以進行修改動作        
    2003/11/21 修改檢查訂單出貨狀況的方法
    *****************************************************/
    Declare
      Error       Integer;
      Errmsg      Varchar2(200);
      I_Count     Integer;
      v_fact_no   odrm.fact_no%type;
      v_odr_no    odrm.odr_no%type;
      V_Sfc_Num   Cut_Plan_M.Sfc_Num%Type;    
    Begin
      Error := -20002;--  Select Count(*)
    --    Into I_Count
    --    From OutData
    --   Where OutData.Fact_No = :New.Fact_No
    --     And OutData.Mfr_No||OutData.Exgo_No = :New.Odr_No ;
    --
    --  If I_Count >0 Then 
    --     Errmsg := '這張派工單之訂單已經出貨,不能進行修改!';
    --     Raise_Application_Error(Error,Errmsg);
    --  End If;                    
       
       if inserting then            
          v_odr_no  := :New.odr_no;
          v_fact_no := :New.fact_no;
       elsif updating then          
          v_odr_no  := :New.odr_no;
          v_fact_no := :New.fact_no;
       else
          v_odr_no  := :Old.odr_no;
          v_fact_no := :Old.fact_no;
       End if;   if inserting or updating then
       if Fun_Odr_Out_Stuff(v_fact_no, v_odr_no) = '1' then
           raise_application_error(-20002,'這張派工單之訂單已經出貨,不能進行修改!' || v_odr_no );
       end if ;      
       else
          if nvl(:new.specreq_qty,0) <> nvl(:old.specreq_qty,0) then
       if Fun_Odr_Out_Stuff(v_fact_no, v_odr_no) = '1' then
           raise_application_error(-20002,'這張派工單之訂單已經出貨,不能進行修改!' || v_odr_no );
       end if ;      
          end if;
       end if;  If Inserting And Substr(:New.Sfc_No,1,2)='PG' And 
         Length(:New.Sfc_No)=15 Then
         -- 取得累計流水號
         Begin
          Select Nvl(Cut_Plan_M.Sfc_Num,0)
            Into V_Sfc_Num
            From Cut_Plan_M
           Where Cut_Plan_M.Fa_Number = :New.Fact_No 
             And Cut_Plan_M.Plan_No = 'PG'||Substr(:New.Sfc_No,3,10);
       Exception
            When Others Then
            null;
                 --Raise_Application_Error(Error,'計劃單錯誤,請與資訊人員連絡!');
             End;
          Update Cut_Plan_M
             Set Sfc_Num = V_Sfc_Num + 1
           Where Cut_Plan_M.Fa_Number = :New.Fact_No 
             And Cut_Plan_M.Plan_No = 'PG'||Substr(:New.Sfc_No,3,10);
      End If ;  If Updating Then     If Nvl(:New.Sfcuse_Qty,0)-Nvl(:New.Rec_Qty,0) <= 0 And Nvl(:Old.Sfcuse_Qty,0)-Nvl(:Old.Rec_Qty,0) <= 0   Then
            Return;
         End If ;     If Not :New.Mat_No = :Old.Mat_No Then
            Errmsg := '這張派工單已經有發料,物料代號不能進行修改.請與資材聯系';
            Raise_Application_Error(Error,Errmsg);
         End If ;     If Not :New.Odr_No = :Old.Odr_No Then
            Errmsg := '這張派工單已經有發料,訂單號碼不能進行修改.請與資材聯系';
            Raise_Application_Error(Error,Errmsg);
         End If;     If Not :New.Part_No = :Old.Part_No Then
            Errmsg := '這張派工單已經有發料,部位代號不能進行修改.請與資材聯系';
            Raise_Application_Error(Error,Errmsg);
         End If;  End If ;  If Deleting Then
         If Nvl(:Old.Sfcuse_Qty,0)-Nvl(:Old.Rec_Qty,0) <= 0 Then
            Return;
         End If;     Errmsg := '派工單已經有發料,不能進行刪除.請與資材聯系';
         Raise_Application_Error(Error,Errmsg);  End If ;End Ins_Upd_Del_Odrsfcd;