Bu yazımızda büyük bir tablodan başka bir tabloya veri aktarıp, aktarılan verinin o tablodan silinmesi adımlarını bulabilirsiniz. Yazıda aktarım işlemi ayrı sunucularda yapılmıştır. Bu sebeple linked server kullanılmıştır.
Özellikle devamlılığı olan bu tür işlemleri, aşağıdaki paylaştığımız scripti bir store procedure yapıp ve bu procedure bir job ile tetiklenirse otomatik olarak işlem sürekli olarak yapılacaktır.
Bu işlemin bize en büyük faydası birden fazla transcation işleminin bir arada veri kaybı olmadan yapılması sağlar. Ayrıca performanslı bir aktarım sağlar ve delete işlemini loop yaptığımız için canlı sistemde ldf’in büyümeden rahatça yapmasına imkan sunar.
use AdminDB CREATE TABLE #TempTable (Id INT NOT NULL INDEX idx_Id Clustered) /*1-Verilerin tutarlı ve hızlı aktarımı yapılması için temp tablo oluşturuyoruz.*/ DECLARE @SixMonthDate DATETIME SET @SixMonthDate = (SELECT DATEADD(MONTH,-6,GETDATE())) /**2-6 aydan eski verilerin taşınması için Tarih belirliyoruz**/ DECLARE @SourceTblName VARCHAR(255) SET @SourceTblName ='TransferData' DECLARE @DestinationTblName NVARCHAR(255) SET @DestinationTblName = '[LinkedServerInstanceName].[TransferDB].dbo.[TransferData]' DECLARE @QueryParameters NVARCHAR(4000) SET @QueryParameters = '@FirstDateParam datetime' DECLARE @SelectInsertQuery NVARCHAR(MAX) = N' BEGIN INSERT INTO #TempTable SELECT TOP 3 [Id] FROM '+ @SourceTblName +' WITH (NOLOCK) WHERE Date <= @FirstDateParam END ' exec sp_executesql @SelectInsertQuery, @QueryParameters,@FirstDateParam = @SixMonthDate /*3-Ana tablodaki 6 aydan eski verilerin Id'lerini temp tablosuna Insert ediyoruz.*/ DECLARE @SelectInsertQuery2 NVARCHAR(MAX) = N' BEGIN INSERT INTO '+ @DestinationTblName +'([Id], [Date]) SELECT [Id], [Date] FROM '+ @SourceTblName +' WITH (NOLOCK) WHERE '+ @SourceTblName +'.Id in (select #TempTable.Id from #TempTable) END ' execsp_executesql @SelectInsertQuery2 /*4-Adimda Temp Tablosuna bastığımız Id'leri Ana tablo ile eşleştirip Ana tablo'dan siliyoruz.*/ DECLARE @DeleteQuery NVARCHAR(MAX) = N' BEGIN DECLARE @RowCount INT; SET @RowCount = 1; WHILE (@RowCount > 0) BEGIN SET @Rowcount = 0 DELETE TOP (1) FROM '+ @SourceTblName +' WHERE '+ @SourceTblName +'.Id in (select #TempTable.Id from #TempTable) SET @RowCount = @@ROWCOUNT END END ' exec sp_executesql @DeleteQuery /*4.Adimda Linked server'la bastığımız verileri ana tablodan temp tablodaki Id'ler ile sağlamasını yaparak siliyoruz.*/ Droptable #TempTable
0 Yorum