folder Tahribat.com Forumları
linefolder Database - Veritabanı
linefolder Stored Procedure Dublicate Record Handle Etme



Stored Procedure Dublicate Record Handle Etme

  1. KısayolKısayol reportŞikayet pmÖzel Mesaj
    zeybekustasi
    zeybekustasi's avatar
    Kayıt Tarihi: 24/Mayıs/2012
    Erkek

    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

     


    https://www.youtube.com/watch?v=WC3-71NKwPw
  2. KısayolKısayol reportŞikayet pmÖzel Mesaj
    coder2
    coder2's avatar
    Kayıt Tarihi: 15/Mart/2007
    Erkek

    Yontem güzelmiş, ellerine sağlık hocam. 300m kayıtlı ne verisi olduğunu merak ettim doğrusu.


    Önceleri Kızlar Utanınca Kızarırdı Şimdilerde Kızarınca Utanıyorlar..
  3. KısayolKısayol reportŞikayet pmÖzel Mesaj
    buzukatak
    buzukatak's avatar
    Kayıt Tarihi: 27/Haziran/2010
    Erkek

    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

     


    anlıyorum.
  4. KısayolKısayol reportŞikayet pmÖzel Mesaj
    EmQceR
    EmQceR's avatar
    Kayıt Tarihi: 14/Kasım/2007
    Erkek
    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


    ...
  5. KısayolKısayol reportŞikayet pmÖzel Mesaj
    zeybekustasi
    zeybekustasi's avatar
    Kayıt Tarihi: 24/Mayıs/2012
    Erkek
    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.


    https://www.youtube.com/watch?v=WC3-71NKwPw
  6. KısayolKısayol reportŞikayet pmÖzel Mesaj
    zeybekustasi
    zeybekustasi's avatar
    Kayıt Tarihi: 24/Mayıs/2012
    Erkek
    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.

     


    https://www.youtube.com/watch?v=WC3-71NKwPw
Toplam Hit: 1916 Toplam Mesaj: 6
sql server sql server