HATA YÖNETİMİ, HATA FIRLATMA, RAISERROR, TRY CATCH YAPISI
select * from sys.messages -- Sistemdeki bütün hataları listeler select * from sys.messages where language_id=1055 -- Türkçe bütün hataları listeler -- Yeni Hata Mesajı Eklemek /* Hata mesajlarının bulunduğu sys.messages sistem viewine programcılar tarafından da yeni hata mesajları eklenebilir. SQL Server ilk 50.000 hata mesajını kendisi belirler ve kendisi için ayırmıştır. Kullanıcılar 50.001 den itibaren yeni bir hata mesajı ekleyebilir. */ sp_addmessage @msgnum = '50006', @severity = 10, @msgtext = 'Deneme Hata Mesajı - Sıfıra Bölme Hatası', @with_log = 'true'; /* msgnum: 50001'den itibaren bir sayı severity: 1-10 --> kullanıcı kaynaklı hatalar 11-16 --> kullanıcın try catch ile yönetebileceği hatalardır. msgtext: hata mesajı with_log: true ise hata kodu raiserror ile çağrıldığında sql serverın üzerinde çalıştığı işletim sisteminin event view ile görülebilen sistem loglarına mesajı ve oluş zamanının eklenmesini sağlar. */ SELECT * FROM SYS.Messages WHERE Message_ID = 50006; -- hata mesajımızı görüntüleyebiliriz. sp_dropmessage 50006 -- hata mesajını silebiliriz.
/* HATA FIRLATMAK RAISERROR(mesaj_kod,seviye,durum) mesaj kod: sys.messages'da yer alan hataların message_id değerini alır. seviye: hata mesajının kritiklik seviyesini belirtir. 0-25 arası değer alır. durum: bir hata mesajı birden fazla yerde oluştuğunda , bu yerleri birbirinden ayırt etmek için kullanılır. 1-127 arası değer alır. */ declare @sayi1 int= 10 declare @sayi2 int= 0 begin try declare @sonuc int = @sayi1/@sayi2 end try begin catch RAISERROR(50006,10,1) end catch /* Yukarıda oluşturduğum 0'a bölme hatasını kullanmış olduk. Hata seviyesi, 10 olduğundan normal siyah renkte verir hatayı kritik olarak görmez. Hata seviyesini mesela 17 yapalım. O zaman kırmızı renkte daha detaylı bir hata verir. */
-- BİRDE SP KULLANARAK YAPALIM CREATE PROCEDURE pr_HataBilgisiGetir AS SELECT ERROR_NUMBER() AS ErrorNumber, ERROR_SEVERITY() AS ErrorSeverity, ERROR_STATE() AS ErrorState, ERROR_PROCEDURE() AS ErrorProcedure, ERROR_LINE() AS ErrorLine, ERROR_MESSAGE() AS ErrorMessage; DECLARE @sayi1 INT = 5 DECLARE @sayi2 INT = 0 DECLARE @sonuc INT BEGIN TRY SET @sonuc = @sayi1 / @sayi2 END TRY BEGIN CATCH EXECUTE pr_HataBilgisiGetir; END CATCH; -- hata kodu 8134 olarak geldi. Eğer hata kodunu anlamazsak --aşağıdaki kod gibi uyarlayarak hata kodunu türkçeleştirebiliriz. select * from sys.sysmessages where error='8134' and msglangid='1055'