data-synchronizationNew York ve Istanbul arasında iki database var. Master tablolarda Istanbuldan select çekmenin oldukça maliyetli ve yavaş olduğunu fark ettik. Istediğimiz New York’daki örneğin Item,Customer,Unit of Measure vs. tablolarını Istanbul’a sürekli update olmasını istiyoruz. Tüm kayıtları herseferinde silip tekrar insert etmek bir seçenek ancak istediğimiz sadece değişen objelerin gelmesi. Bunun için TimeStamp alanı gayet kullanışlı. Sql Server kayıt değişmesi yada eklenmesi durumunda bu alanı günceller. Bunun için aşağıdaki kodu stored procedure olarak sql’e ekledim ve job olarak her 5 dakikada bir bu fonksiyonu çağırmasını sağladım. Böylece 5 dakikalık gecikme ile bendeki bu tablonun güncel olduğuna emin oldum. TimeStamp alanı değişmiş ve yeni eklenmiş kayıtlar için bize yardımcı olur ancak silinen kayıtlar için ayrıca


--Silinmiş kayıtlar
delete from DACS.dbo.[JFK$Unit of Measure] where Code COLLATE DATABASE_DEFAULT not in (
select distinct Code from [10.5.1.13].doco.dbo.[DO & CO New York Catering, Inc$Unit of Measure])

Sql cümlesini ekliyoruz.


-- =============================================
--
print ' Unit of Measure';
--
-- =============================================
--declare @MaxCustomerTimeStamp bigint;
--declare @MaxItemTimeStamp bigint;
--declare @MaxBOMHeaderTimeStamp bigint;
--declare @MaxBOMLineTimeStamp bigint;
--declare @MaxUnitOfMeasureTimeStamp bigint;

--Silinmiş kayıtlar
delete from DACS.dbo.[JFK$Unit of Measure] where Code COLLATE DATABASE_DEFAULT not in (
select distinct Code from [10.5.1.13].doco.dbo.[DO & CO New York Catering, Inc$Unit of Measure])

set @MaxUnitOfMeasureTimeStamp=ISNULL((select UnitOfMeasureTimeStamp from DACS.dbo.JFK$SyncStatus),0);
set @SourceMaxTimeStamp = ISNULL((select MAX(timestamp) FROM [10.5.1.13].doco.dbo.[DO & CO New York Catering, Inc$Unit of Measure]),0);

IF(@MaxUnitOfMeasureTimeStamp <> @SourceMaxTimeStamp)
BEGIN

delete FROM DACS.dbo.[JFK$Unit of Measure]
Where Code COLLATE DATABASE_DEFAULT IN
(
select Code
FROM [10.5.1.13].doco.dbo.[DO & CO New York Catering, Inc$Unit of Measure]
Where timestamp BETWEEN @MaxUnitOfMeasureTimeStamp AND @SourceMaxTimeStamp
)

INSERT INTO [DACS].[dbo].[JFK$Unit of Measure]
SELECT
Null
,[Code]
,[Description]
FROM [10.5.1.13].doco.dbo.[DO & CO New York Catering, Inc$Unit of Measure]
Where timestamp BETWEEN @MaxUnitOfMeasureTimeStamp AND @SourceMaxTimeStamp
set @MaxItemTimeStamp=ISNULL((select ItemTimeStamp from DACS.dbo.JFK$SyncStatus),0);;
set @MaxCustomerTimeStamp=ISNULL((select CustomerTimeStamp from DACS.dbo.JFK$SyncStatus),0);
set @MaxBOMHeaderTimeStamp=ISNULL((select BOMHeaderTimeStamp from DACS.dbo.JFK$SyncStatus),0);
set @MaxBOMLineTimeStamp=ISNULL((select BOMLineTimeStamp from DACS.dbo.JFK$SyncStatus),0);
set @MaxUnitOfMeasureTimeStamp=@SourceMaxTimeStamp;
delete DACS.dbo.JFK$SyncStatus;
INSERT DACS.dbo.JFK$SyncStatus VALUES(null,@MaxItemTimeStamp,@MaxCustomerTimeStamp,@MaxBOMHeaderTimeStamp,@MaxBOMLineTimeStamp,@MaxUnitOfMeasureTimeStamp);
END;