Stored Procedure Dublicate Record Handle Etme
-
Selamlar,
Tabloya insert etmeden önce tabloda daha önceden yaratılmış -aynı PK ya sahip- bir kayıt mevcutsa dublicate record hatası alırız. Bu durum çeşitli nedenlerle oluşabilir. Benim örneğimde tablonun PK'sı CURRENT DATE idi. Mevcut tabloya farklı uygulamalar tarafından t anında n tane kayıt insert edilirken aynı PK lı kayıtlar oluştu ve dublicate record'a neden oldu.
Eğer INSERT işlemini SP ler ile yapıyorsanız 2 şekilde dublicate'yi engelleyebilirsiniz.
1- INSERT etmeden önce SELECT ile içerde böyle bir kayıt olup olmadığına bakarak. (Burada Select ek bir maliyet oluşturdu. Select attığım tabloda 300M kayıt vardı uygulama timeout'a düştü ve kill oldu.)
2- INSERT işlemini handle ederek. ERROR_NUMBER = 2627 dublicate record hata kodudur. Duplicate recordda hata almak istemiyorum -başka bir tabloya gönderiyorum- bu nedenle sadece 2627 dışındaki hatalarda throw ettirdim. Bu sayede Select maliyeti önlenmiş oldu.
BEGIN TRY Insert into T_Table (...) Values (...) END TRY BEGIN CATCH SELECT @error_number = ERROR_NUMBER() IF @error_number != 2627 BEGIN SET @errMsg = 'ERROR MESSAGE : ' + CAST(ERROR_MESSAGE() AS VARCHAR(200)) + ' ERROR NUMBER : ' + CAST(ERROR_NUMBER() AS VARCHAR(20)) + ' PROCEDURE NAME :' + CAST(ERROR_PROCEDURE() AS VARCHAR(150)) + ' PROCEDURE LINE :' + CAST(ERROR_LINE() AS VARCHAR(10)) RAISERROR( @errMsg,16,1); END END CATCH -
Yontem güzelmiş, ellerine sağlık hocam. 300m kayıtlı ne verisi olduğunu merak ettim doğrusu.
-
Bunun için mevcut bir çözüm var: IGNORE_DUP_KEY.
Bu seçeneği belirtmek için mevcut tablonun rebuild edilmesi gerektğinden 300M'lik tablona online olarak uygulamak sorun olabilir.
Ancak yeni tablo oluştururken veya henüz pek kalabalık olmayan bir tabloda bu seçeneği gösterdiğim örnekteki gibi etkinleştirdiğinde mükerrer kayıtlar hataya sebep olmayıp görmezden gelinirler.
Örnek: http://sqlfiddle.com/#!18/bbcae/1
-
buzukatak bunu yazdı
Bunun için mevcut bir çözüm var: IGNORE_DUP_KEY.
Bu seçeneği belirtmek için mevcut tablonun rebuild edilmesi gerektğinden 300M'lik tablona online olarak uygulamak sorun olabilir.
Ancak yeni tablo oluştururken veya henüz pek kalabalık olmayan bir tabloda bu seçeneği gösterdiğim örnekteki gibi etkinleştirdiğinde mükerrer kayıtlar hataya sebep olmayıp görmezden gelinirler.
Örnek: http://sqlfiddle.com/#!18/bbcae/1
+1 bunu demeye gelmiştim
-
coder2 bunu yazdı
Yontem güzelmiş, ellerine sağlık hocam. 300m kayıtlı ne verisi olduğunu merak ettim doğrusu.
Merhaba,
Fikir olması açısından şöyle: Sistemlerin beklediği gibi çalışıp çalışmadığını kontrol edilen uygulamalar var. Onlarca sistemi her dakka kontrol edip o an çalışıp çalışmadığını raporlamak için kullanılıyor.
-
buzukatak bunu yazdı
Bunun için mevcut bir çözüm var: IGNORE_DUP_KEY.
Bu seçeneği belirtmek için mevcut tablonun rebuild edilmesi gerektğinden 300M'lik tablona online olarak uygulamak sorun olabilir.
Ancak yeni tablo oluştururken veya henüz pek kalabalık olmayan bir tabloda bu seçeneği gösterdiğim örnekteki gibi etkinleştirdiğinde mükerrer kayıtlar hataya sebep olmayıp görmezden gelinirler.
Örnek: http://sqlfiddle.com/#!18/bbcae/1
Merhaba,
Bu yöntemi mevcut tabloya uygulamaak belirtitğin gibi ciddi sıkıntı olduğu için kullanamadım. Bilgi için teşekkürler.
