在a数据库表中添加数据时也在b数据库表中添加数据(两个数据库不一定在一台设备上),同时验证,如果重复则不插入

时间:2022-11-04 14:06:09
如题,我已经用程序实现这个功能,但是程序是用定时器解决的,不能实时进行数据写入写出(主要是我怕有数据会漏写)
我要实现 在 数据库a 的test表中新增一条数据,新增之后同时给数据库b的test表也添加一条同的数据(根据一个字段检测数据重复则不添加)两个数据库不一定在一个设备上。数据库新手,最好能给出解决方法。

7 个解决方案

#1


  最好是用程序做成服务分别新增两个环境DB

数据库只能用连接服务器+触发器去做,必须要配置好MSDTC

#2


引用 1 楼 roy_88 的回复:
  最好是用程序做成服务分别新增两个环境DB

数据库只能用连接服务器+触发器去做,必须要配置好MSDTC


我已经用定时器实现了这个功能,但是我怕有些数据会漏写,而且也有效率问题(我是用xml中转数据),用触发器能做到实时更新而且不会漏写数据。

#3


#4


定时器是个不错的选择,你这个情况,不建议使用 TRI ,万一哪一天你的网断了,你的生产库 insert 会失败的。

#5


引用 4 楼 wmxcn2000 的回复:
定时器是个不错的选择,你这个情况,不建议使用 TRI ,万一哪一天你的网断了,你的生产库 insert 会失败的。


USE [tosoft]
GO
/****** Object:  StoredProcedure [dbo].[sendInfoToRemoteDb]    Script Date: 12/23/2015 17:28:58 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[sendInfoToRemoteDb] 
    @userId int, 
    @userName varchar(50),
    @roleName varchar(50),
    @deptName varchar(50),
    @state int
AS
BEGIN
  --exec sp_addlinkedserver
   --@server='xxx',
--@srvproduct='',
--@provider='SQLOLEDB',
--@provstr='Driver={SQL SERVER};SERVER=IP;UID=xx;PWD=xx;Database=test'
 

   {   if not exists
  (select userId from xxx.test.dbo.test_dataChange  where not userId=@userId) 
  begin
  insert into xxx.test.dbo.test_dataChange(userId,userName,roleName,deptName,state)
    
     values(@userId,@userName,@roleName,@deptName,@state)
end  }   ---》这段代码我是想在插入数据前验证这条数据是否重复,如果重复则不添加,但是这么写这条存储过程不起作用


[color=#00FFFF]{  insert into xxx.test.dbo.test_dataChange(userId,userName,roleName,deptName,state)
    
     values(@userId,@userName,@roleName,@deptName,@state)  }--这段代码是我实际使用的,可行
[/color]
  
END
sql语句橙色部分是能实现的。谁帮我看看橙色部分代码为什么出错,如果要实现我想要的功能要怎么写。

#6


引用 4 楼 wmxcn2000 的回复:
定时器是个不错的选择,你这个情况,不建议使用 TRI ,万一哪一天你的网断了,你的生产库 insert 会失败的。


USE [tosoft]
GO
/****** Object:  StoredProcedure [dbo].[sendInfoToRemoteDb]    Script Date: 12/23/2015 17:28:58 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[sendInfoToRemoteDb] 
    @userId int, 
    @userName varchar(50),
    @roleName varchar(50),
    @deptName varchar(50),
    @state int
AS
BEGIN
  --exec sp_addlinkedserver
   --@server='xxx',
--@srvproduct='',
--@provider='SQLOLEDB',
--@provstr='Driver={SQL SERVER};SERVER=IP;UID=xx;PWD=xx;Database=test'
 

   {   if not exists
  (select userId from xxx.test.dbo.test_dataChange  where not userId=@userId) 
  begin
  insert into xxx.test.dbo.test_dataChange(userId,userName,roleName,deptName,state)
    
     values(@userId,@userName,@roleName,@deptName,@state)
end  }   ---》这段代码我是想在插入数据前验证这条数据是否重复,如果重复则不添加,但是这么写这条存储过程不起作用


[color=#00FFFF]{  insert into xxx.test.dbo.test_dataChange(userId,userName,roleName,deptName,state)
    
     values(@userId,@userName,@roleName,@deptName,@state)  }--这段代码是我实际使用的,可行
[/color]
  
END
sql语句橙色部分是能实现的。谁帮我看看橙色部分代码为什么出错,如果要实现我想要的功能要怎么写。

#7



-- 橙色部分,换成这一句话就可以了

  insert into xxx.test.dbo.test_dataChange(userId,userName,roleName,deptName,state)
  select @userId,@userName,@roleName,@deptName,@state
  where not exists(select userId from xxx.test.dbo.test_dataChange  where not userId=@userId)
  
     


#1


  最好是用程序做成服务分别新增两个环境DB

数据库只能用连接服务器+触发器去做,必须要配置好MSDTC

#2


引用 1 楼 roy_88 的回复:
  最好是用程序做成服务分别新增两个环境DB

数据库只能用连接服务器+触发器去做,必须要配置好MSDTC


我已经用定时器实现了这个功能,但是我怕有些数据会漏写,而且也有效率问题(我是用xml中转数据),用触发器能做到实时更新而且不会漏写数据。

#3


#4


定时器是个不错的选择,你这个情况,不建议使用 TRI ,万一哪一天你的网断了,你的生产库 insert 会失败的。

#5


引用 4 楼 wmxcn2000 的回复:
定时器是个不错的选择,你这个情况,不建议使用 TRI ,万一哪一天你的网断了,你的生产库 insert 会失败的。


USE [tosoft]
GO
/****** Object:  StoredProcedure [dbo].[sendInfoToRemoteDb]    Script Date: 12/23/2015 17:28:58 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[sendInfoToRemoteDb] 
    @userId int, 
    @userName varchar(50),
    @roleName varchar(50),
    @deptName varchar(50),
    @state int
AS
BEGIN
  --exec sp_addlinkedserver
   --@server='xxx',
--@srvproduct='',
--@provider='SQLOLEDB',
--@provstr='Driver={SQL SERVER};SERVER=IP;UID=xx;PWD=xx;Database=test'
 

   {   if not exists
  (select userId from xxx.test.dbo.test_dataChange  where not userId=@userId) 
  begin
  insert into xxx.test.dbo.test_dataChange(userId,userName,roleName,deptName,state)
    
     values(@userId,@userName,@roleName,@deptName,@state)
end  }   ---》这段代码我是想在插入数据前验证这条数据是否重复,如果重复则不添加,但是这么写这条存储过程不起作用


[color=#00FFFF]{  insert into xxx.test.dbo.test_dataChange(userId,userName,roleName,deptName,state)
    
     values(@userId,@userName,@roleName,@deptName,@state)  }--这段代码是我实际使用的,可行
[/color]
  
END
sql语句橙色部分是能实现的。谁帮我看看橙色部分代码为什么出错,如果要实现我想要的功能要怎么写。

#6


引用 4 楼 wmxcn2000 的回复:
定时器是个不错的选择,你这个情况,不建议使用 TRI ,万一哪一天你的网断了,你的生产库 insert 会失败的。


USE [tosoft]
GO
/****** Object:  StoredProcedure [dbo].[sendInfoToRemoteDb]    Script Date: 12/23/2015 17:28:58 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[sendInfoToRemoteDb] 
    @userId int, 
    @userName varchar(50),
    @roleName varchar(50),
    @deptName varchar(50),
    @state int
AS
BEGIN
  --exec sp_addlinkedserver
   --@server='xxx',
--@srvproduct='',
--@provider='SQLOLEDB',
--@provstr='Driver={SQL SERVER};SERVER=IP;UID=xx;PWD=xx;Database=test'
 

   {   if not exists
  (select userId from xxx.test.dbo.test_dataChange  where not userId=@userId) 
  begin
  insert into xxx.test.dbo.test_dataChange(userId,userName,roleName,deptName,state)
    
     values(@userId,@userName,@roleName,@deptName,@state)
end  }   ---》这段代码我是想在插入数据前验证这条数据是否重复,如果重复则不添加,但是这么写这条存储过程不起作用


[color=#00FFFF]{  insert into xxx.test.dbo.test_dataChange(userId,userName,roleName,deptName,state)
    
     values(@userId,@userName,@roleName,@deptName,@state)  }--这段代码是我实际使用的,可行
[/color]
  
END
sql语句橙色部分是能实现的。谁帮我看看橙色部分代码为什么出错,如果要实现我想要的功能要怎么写。

#7



-- 橙色部分,换成这一句话就可以了

  insert into xxx.test.dbo.test_dataChange(userId,userName,roleName,deptName,state)
  select @userId,@userName,@roleName,@deptName,@state
  where not exists(select userId from xxx.test.dbo.test_dataChange  where not userId=@userId)