Полная синхронизация sql с использованием запроса - PullRequest
0 голосов
/ 25 сентября 2018

Я хотел бы синхронизировать данные из автономной базы данных в онлайн-базу данных.В настоящее время я выполняю это, используя запрос с некоторыми условиями.Но данные, отредактированные в автономной базе данных после синхронизации, не будут снова синхронизированы с оперативной при следующей синхронизации.Есть ли простой способ обновить отредактированные данные в онлайн БД.Мой текущий запрос выглядит следующим образом:

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'' ')

Мой онлайн-сервер баз данных не позволяет мне выполнять репликацию, потому что у меня нет прав для этого.Единственный способ - через такой запрос.

Спасибо

1 Ответ

0 голосов
/ 25 сентября 2018

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'

для обновления,будет проще использовать связанный сервер.Вы можете обратиться к Здесь для получения дополнительной информации.

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 
...