【问题标题】:Complete sql synchronization using query使用查询完成sql同步
【发布时间】:2023-03-07 03:51:01
【问题描述】:

我想将数据从离线数据库同步到在线数据库。目前我正在使用带有某些条件的查询来执行它。但同步后在离线数据库中编辑的数据将不会在下次同步时再次同步到在线数据库。有没有简单的方法来更新在线数据库中的编辑数据。 我目前的查询如下:

INSERT INTO OPENQUERY([103.21.58.192], 'SELECT * FROM [amurajbg_ss].[dbo].[AccLedgers]') 
    SELECT * 
    FROM OPENQUERY([USER-PC\SQLEXPRESS],
                   'DECLARE @LastSyncDate AS DATETIME   
                    DECLARE @CurrentSyncDate AS DATETIME 
                    SELECT @CurrentSyncDate = GETDATE() 
                    SELECT @LastSyncDate = LastSyncDate 
                    FROM [CrushMate].[dbo].[Sync] 
                    SELECT * FROM [CrushMate].[dbo].[AccLedgers] 
                    WHERE CreatedDate BETWEEN @LastSyncDate AND @CurrentSyncDate 
                      AND Status=''True'' ')

我的在线数据库服务器不允许我执行复制,因为我没有这样做的权限。唯一的方法是通过这样的查询。

谢谢

【问题讨论】:

  • 2 OPENQUERY ?这个查询在哪里执行?看起来这里涉及到 3 个主机
  • 查询正在从离线数据库执行。我的sql不太好。如果您可以对此提出改进建议,请提供帮助。它是通过链接服务器完成的。我尝试了普通的推送查询,但这样耗时较少。
  • offline db 的意思是USER-PC\SQLEXPRESS ?
  • 这很清楚。忽略围绕使用 OpenQuery 和远程服务器的混淆,您将测试基于 adddate,而不是 lastupdatedate。您需要后者才能使用此模式。
  • 是否有任何查询模型来更新在离线数据库中编辑的表中的所有条目。即要选择修改的行并在在线数据库中更新

标签: sql sql-server synchronization replication


【解决方案1】:

But data that are edited in offline database after syncing will not be synced again to online in next sync

您需要另一列离线数据库来标识正在编辑的数据。通常您可以使用UpdatedDate 列。每当编辑数据时,此UpdatedDate 将更新为当前日期和时间。如果您的应用程序可以处理这个问题,那就太好了。如果没有,您可以使用AFTER UPDATE 触发器来处理此问题。

那么您的sync 查询也需要检查UpdatedDate

DECLARE @LastSyncDate AS DATETIME   
DECLARE @CurrentSyncDate AS DATETIME 

SELECT @CurrentSyncDate = GETDATE() 

SELECT @LastSyncDate = LastSyncDate 
FROM   [CrushMate].[dbo].[Sync]

-- the INSERT
INSERT INTO OPENQUERY([103.21.58.192], 'SELECT * FROM [amurajbg_ss].[dbo].[AccLedgers]') 
SELECT * 
FROM   [CrushMate].[dbo].[AccLedgers] 
WHERE  CreatedDate BETWEEN @LastSyncDate AND @CurrentSyncDate 
AND    Status = 'True'

为了更新,使用链接服务器会更容易。您可以参考Here 了解更多信息。

UPDATE R
SET    . . . .
FROM   [CrushMate].[dbo].[AccLedgers] A
       INNER JOIN [RemoteServer].[amurajbg_ss].[dbo].[AccLedgers] R
       ON   A.pk_col = R.pk_col
WHERE  A.UpdatedDate   BETWEEN @LastSyncDate AND @CurrentSyncDate 

【讨论】:

  • 当我们用这个查询插入时会导致重复。我也想更新在线数据库中的编辑数据。我是初学者,请帮忙写代码
猜你喜欢
  • 1970-01-01
  • 2017-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多