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’;
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
Hem PRINT hem de RAISERROR, uygulamalara 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 olanak tanır.
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, şu işlem 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ı
PRINT deyimi kullanmak, ciddiyet derecesi 10 olan bir hatayı çıkarmaya benzer.
BURADA RAISERROR kullanan özel bir hata iletisi örneği verilmiştir.
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
THROW deyimi, kodda hata oluşturmanın daha basit bir yöntemini sunar. Hatalar en az 50000 hata sayısına sahip olmalıdır.
ATMAK
THROW, RAISERROR'dan çeşitli yollarla farklıdır:
- THROW tarafından oluşan hatalar her zaman önem derecesi 16'dır.
- THROW tarafından döndürülen iletiler sys.sysmessages içindeki hiçbir girişle ilgili değildir.
- THROW tarafından tetiklenen hatalar yalnızca SET XACT_ABORT ON ile birlikte kullanıldığında ve oturum sonlandırıldığında işlem durdurulmasına neden olur.
THROW 50001, 'An Error Occured',0
@@Error kullanarak hata kodlarını yakalama
SQL Server uygulamalarında çoğu geleneksel hata işleme kodu @@ERROR kullanılarak oluşturulmuştur. Yapılandırılmış özel durum işleme SQL Server 2005'te kullanıma sunulmuştur ve @@ERROR kullanmaya güçlü bir alternatif sağlar. Bir sonraki derste tartışılacaktır. Büyük miktarda mevcut SQL Server hata işleme kodu @@ERROR temel alır, bu nedenle onunla nasıl çalışılır anlamak önemlidir.
@@ERROR
@@ERROR, oluşan son hatanın hata numarasını tutan bir sistem değişkenidir. @@ERROR ile ilgili önemli bir zorluk, içine aldığı değerin her bir ek ifade yürütüldüğünde 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, beklenildiği gibi hatanın aslında 50000 olduğunu ve bir mesajın RAISERROR'a geçirildiğini görebilirsiniz. Bunun nedeni RAISERROR deyimini izleyen IF deyiminin başarıyla yürütülmesi ve @@ERROR değerinin sıfırlanmasıdır. Bu nedenle, @@ERROR ile çalışırken, hata numarası oluştuğunda hemen bir değişkene kaydedilmesi ve ardından bu 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 @@ERROR kullanmanın diğer önemli sorunlarından biri de, T-SQL kodunuzu merkezileştirmenin zor olmasıdır. Hata işleme genellikle kodun her yanına dağılmış olur. Etiketleri ve GOTO deyimlerini 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. sp_altermessage aracılığıyla sistem hatalarını değiştirmek yalnızca SQL Server 2005 SP3 veya SQL Server 2008 SP1'den itibaren mümkündür.