T-SQL hata işlemeyi uygulama
Hata, veritabanı işlemi sırasında ortaya çıkan bir sorunu veya önemli bir sorunu gösterir. Sistem düzeyinde bir olaya veya hataya yanıt olarak SQL Server Veritabanı Altyapısı tarafından hatalar oluşturulabilir; veya Transact-SQL kodunuzda uygulama hataları oluşturabilirsiniz.
Veritabanı altyapısı hatalarının öğeleri
Nedeni ne olursa olsun, her hata aşağıdaki öğelerden oluşur:
- Hata numarası - Belirli bir hatayı tanımlayan benzersiz sayı.
- Hata iletisi - Hatayı açıklayan metin.
- Önem Derecesi - 1 ile 25 arası ciddiliğin sayısal göstergesi.
- State - Veritabanı altyapısı koşulu için iç durum kodu.
- Yordam - Hatanın oluştuğu saklı yordamın veya tetikleyicinin adı.
- Satır numarası - Toplu işlem veya prosedürde hataya neden olan deyim.
Sistem hataları
Sistem hataları önceden tanımlanmıştır ve bunları sys.messages sistem görünümünde görüntüleyebilirsiniz. Bir sistem hatası oluştuğunda SQL Server, hatanın önem derecesine bağlı olarak otomatik düzeltme eylemi gerçekleştirebilir. Örneğin, yüksek önem derecesinde bir hata oluştuğunda, SQL Server veritabanını çevrimdışına alabilir ve hatta veritabanı altyapısı hizmetini durdurabilir.
Özel hatalar
Uygulamaya özgü koşullara yanıt vermek veya sistem hatalarına yanıt olarak istemci uygulamalarına gönderilen bilgileri özelleştirmek için Transact-SQL kodunda hatalar oluşturabilirsiniz. Bu uygulama hataları, oluşturuldukları yerde satır içinde tanımlanabilir veya sistem tarafından sağlanan hatalarla birlikte sys.messages tablosunda bunları önceden tanımlayabilirsiniz. Özel hatalar için kullanılan hata numaraları 50001 veya üzeri olmalıdır.
sys.messages dosyasına özel hata iletisi eklemek için sp_addmessage kullanın. İletinin kullanıcısı sysadmin veya serveradmin sabit sunucu rollerinin bir üyesi olmalıdır.
Bu, sp_addmessage söz dizimidir:
sp_addmessage [ @msgnum= ] msg_id , [ @severity= ] severity , [ @msgtext= ] 'msg'
[ , [ @lang= ] 'language' ]
[ , [ @with_log= ] { 'TRUE' | 'FALSE' } ]
[ , [ @replace= ] 'replace' ]
Aşağıda, bu söz dizimini kullanan özel bir hata iletisi örneği verilmiştir:
sp_addmessage 50001, 10, N’Unexpected value entered’;
Uyarı
sp_addmessageyalnızca SQL Server desteklenir. Azure SQL Veritabanı ve Azure SQL Yönetilen Örneği desteklenmez, sp_addmessage bu nedenle 50000'den büyük bir msg_id değere başvuramazsınız. Bu platformlarda, satır içi RAISERROR olarak bir ileti dizesi kullanın veya THROW yerine ile birleştirin FORMATMESSAGE().
Ayrıca, özel hata iletileri tanımlayabilirsiniz; sysadmin sunucu rolünün üyeleri @with_log ek bir parametre de kullanabilir. TRUE olarak ayarlandığında, hata Windows Uygulama günlüğüne de kaydedilir. Windows Uygulama günlüğüne yazılan tüm iletilerde SQL Server hata günlüğüne de yazılır. Ağ ve sistem yöneticileri, sistem günlüklerinde çok fazla kayıt oluşturan uygulamalardan hoşlanmama eğiliminde olduğundan, @with_log seçeneğinin kullanımı konusunda dikkatli olun. Ancak, hata iletisinin bir uyarı tarafından yakalanması gerekiyorsa, hatanın önce Windows Uygulama günlüğüne yazılması gerekir.
Uyarı
Sistem hatalarının bildirilmesi desteklenmez.
İletiler, önce silinmeden @replace = 'değiştir' seçeneği kullanılarak değiştirilebilir.
İletiler özelleştirilebilir ve bir language_id değeri temel alınarak birden çok dil için aynı hata numarası için farklı iletiler eklenebilir.
Uyarı
İngilizce iletiler dil_kimliği 1033.
RAISERROR kullanarak hatalar oluşturun
Uyarı
RAISERROR yeni geliştirme için kullanım dışı bırakıldı. Yeni T-SQL kodu için kullanın THROW .
RAISERROR eski kod için, önem derecesini 16'nın THROW üzerine yükseltmek için (doğrudan yapılamaz) ve -style dinamik ileti biçimlendirmesi için printfyararlı olmaya devam eder (modern alternatif FORMATMESSAGE() ile THROWbirleştirilir).
Hem hem RAISERROR de PRINT uygulamalarına bilgi veya uyarı iletileri döndürmek için kullanılabilir.
RAISERROR uygulamaların daha sonra çağrı işlemi tarafından yakalanabilecek bir hata oluşturmasına izin verir.
RAISERROR
T-SQL'de hata oluşturma özelliği, diğer sistem hataları gibi gönderildiğinden uygulamada hata işlemeyi kolaylaştırır.
RAISERROR için kullanılır:
- T-SQL kodu sorunlarını gidermeye yardımcı olun.
- Veri değerlerini denetleyin.
- Değişken metin içeren iletileri döndürür.
Uyarı
Deyimi PRINT kullanmak, önem derecesi 10 hatasını yükseltmeye benzer.
Burada, kullanan özel bir hata iletisi örneği verilmiştir RAISERROR.
RAISERROR (N'%s %d', -- Message text,
10, -- Severity,
1, -- State,
N'Custom error message number',
2)
Tetiklendiğinde şu değeri döndürür:
Custom error message number 2
Önceki örnekte ,%d bir sayı için yer tutucudur ve %s bir dize için yer tutucudur. Ayrıca, ileti numarasından bahsedilmediğini de unutmayın. İleti dizeleriyle ilgili hatalar bu söz dizimi kullanılarak ortaya çıktığında, her zaman 50000 hata numarasına sahiptir.
THROW kullanarak hata oluşturma
deyimi THROW , kodda hata oluşturmanın daha basit bir yöntemini sunar ve yeni T-SQL geliştirmesi için önerilen yaklaşımdır. Hatalar en az 50000 hata sayısına sahip olmalıdır.
ATMAK
THROW farklı şekillerde farklıdır RAISERROR :
- Yeni bir özel durum ortaya çıktığında
THROWönem derecesi her zaman 16'dır.THROWMevcut bir özel durumu yeniden oluşturmak için kullanıldığında (birCATCHblok içinde parametresizTHROW), özgün özel durumun önem derecesi korunur; bu nedenle bir bloktanCATCHsistem hatalarını yeniden oluşturmak için parametresizTHROWtercih edilir. - tarafından
THROWdöndürülen iletiler içindeki hiçbir girişlesys.messagesilişkili değildir. -
THROW' ye saygı gösterirSET XACT_ABORT. Etkin olduğundaSET XACT_ABORT ON, tarafındanTHROWtetiklenen bir özel durum otomatik olarak geçerli işlemi geri alır.RAISERRORbu,SET XACT_ABORTyeni geliştirme için tercih edilen temel nedenlerdenTHROWbiridir.
Important
Hemen önceki THROW deyimin noktalı virgülle (); bitmesi gerekir, aksi takdirde söz dizimi hatası alırsınız. Bu, noktalı virgülleri atlayan mevcut kodda benimsenirken THROW karşılaşılan yaygın bir tökezleme bloğudur.
; THROW 50001, 'An error occurred', 1;
@@Error kullanarak hata kodlarını yakalama
SQL Server uygulamalarında çoğu geleneksel hata işleme kodu kullanılarak @@ERRORoluşturulmuştur. Yapılandırılmış özel durum işleme, kullanmaya @@ERROR daha güçlü bir alternatif sağlar ve yeni T-SQL kodu için önerilen yaklaşımdır. Bir sonraki derste tartışılacaktır. Büyük miktarda mevcut SQL Server hata işleme kodunu temel @@ERRORalır, bu nedenle kodun nasıl çalışılır anlamak önemlidir.
@@ERROR
@@ERROR , oluşan son hatanın hata numarasını tutan bir sistem değişkenidir. Önemli bir zorluk @@ERROR , içerdiği değerin her ek deyim yürütülürken hızla sıfırlanmasıdır.
Örneğin, aşağıdaki kodu göz önünde bulundurun:
RAISERROR(N'Message', 16, 1);
IF @@ERROR <> 0
PRINT 'Error=' + CAST(@@ERROR AS VARCHAR(8));
GO
Kod yürütülürken yazdırılan dizede hata numarasını döndürmesini bekleyebilirsiniz. Ancak kod çalıştırıldığında şunu döndürür:
Msg 50000, Level 16, State 1, Line 1
Message
Error=0
Hata oluştu, ancak yazdırılan ileti "Error=0" oldu. Çıkışın ilk satırında, hatanın beklendiği gibi 50000 olduğunu ve bir iletinin 'e RAISERRORgeçirildiğini görebilirsiniz. Bunun nedeni deyimini IF izleyen deyiminin RAISERROR başarıyla yürütülmesi ve değerin @@ERROR sıfırlanmasıdır.
Bu nedenle, ile @@ERRORçalışırken, hata numarasının yükseltildiğinde bir değişkene yakalanması ve ardından değişkenle işlemeye devam edilmesi önemlidir.
Bunu gösteren aşağıdaki koda bakın:
DECLARE @ErrorValue int;
RAISERROR(N'Message', 16, 1);
SET @ErrorValue = @@ERROR;
IF @ErrorValue <> 0
PRINT 'Error=' + CAST(@ErrorValue AS VARCHAR(8));
Bu kod yürütüldüğünde, aşağıdaki çıktıyı döndürür:
Msg 50000, Level 16, State 1, Line 2
Message
Error=50000
Hata numarası şimdi doğru şekilde bildiriliyor.
Hata işlemeyi merkezileştirme
Hata işleme için kullanmanın @@ERROR diğer önemli sorunlarından biri de T-SQL kodunuzu merkezi hale getirmekte zor olmasıdır. Hata işleme genellikle kodun her yanına dağılmış olur. Etiket ve GOTO deyimleri kullanarak @@ERROR kullanarak hata işlemeyi bir ölçüde merkezi hale getirmek mümkün olabilir. Ancak bu, günümüzde çoğu geliştirici tarafından kötü bir kodlama uygulaması olarak hoş karşılanmaz.
Hata uyarıları oluşturma
Belirli hata kategorileri için yöneticiler SQL Server uyarıları oluşturabilir, çünkü bunlar ortaya çıkar çıkmaz bildirim almak isterler. Bu, kullanıcı tanımlı hata iletileri için bile geçerli olabilir. Örneğin, bir işlem günlüğü her dolduğunda bir uyarı oluşturmak isteyebilirsiniz. Uyarı verme genellikle yöneticilerin dikkatine yüksek önem derecesi hataları (önem derecesi 19 veya üzeri gibi) getirmek için kullanılır.
Uyarı oluşturma
Belirli hata iletileri için uyarılar oluşturulabilir. Uyarı hizmeti, kendisini olay günlüğü hizmetine bir çağrı yönlendirme hizmeti olarak kaydederek çalışır. Bu, uyarıların yalnızca günlüğe kaydedilen hatalarda çalıştığı anlamına gelir.
Hata için bir uyarı oluşturmanın iki yolu vardır: hatayı oluştururken WITH LOG seçeneğini kullanabilir veya mesaj, sp_altermessage yürütülerek günlüğe kaydedilecek şekilde değiştirilebilir. WITH LOG seçeneği yalnızca geçerli deyimi etkiler. sp_altermessage kullanılması, gelecekteki tüm kullanımlar için hata davranışını değiştirir.