Bazı durumlarda SQL serverın hata fırlatmasını beklemeden kendimiz sorgunun hata fırlatıp bitmesini isteriz. Örneğin TRY CATCH ile yakalanamayan hataları kullanıcıya bildirebilmek için TRY CATCH yapısı içinde RAISERROR fonksiyonunu kullanabiliriz. Veya yazdığımız SP yada Trigger hata vermeden bizim kendi kontrollerimiz ile hata fırlatmasını sağlayabiliriz. Ayrıca bu fonksiyon ile kullanıcıya istemiş olduğumuz mesajı verme hakkına da sahibiz. İstediğimiz durum SQL Hatası olmayıp bizim koyduğumuz kontrol neticesinde bir mantık hatası olabilir.
NOT : Örnek sorgulamada Northwind Database'i kullanacağım. bk: Nortwind Database Kurulumu
Genel Yapısı:
RAISERROR('Hata Mesajımız',ERROR_SEVERITY, ERROR_STATE) [WITH LOG]
Örnek: Northwind veritabanımızda sipariş numarası girilerek kayıtların listelenmesi ile ilgili bir sorguda RAISERROR fonksiyonunu kullanalım. Öncelikle hata oluşması durumunda verilecek mesajı sisteme tanımlayalım. Bunun için;
sp_addmessage @msgnum=90001, @severity=11, @msgtext='GİRİLEN SİPARİŞ NUMARASI 0 DAN KÜÇÜK VE 11100 DEN BUYUK OLAMAZ', @with_log='true'
ERROR_SEVERITY değeri olarak 11 vermemizin nedeni severity değer aralığında 11-16 arası "Kullanıcıların düzeltebileceği hatalar" anlamına gelmesidir.Sisteme yeni mesaj eklemek için "sp_addmessage" sistem saklı prosedürü kullanılır. Mesaj numarasını 90001 olarak vermemin özel bir nedeni yok sadece bilinmesi gereken nokta SQL Server mesaj numaralarının ilk 50000'i kendisine ayırmıştır ve eklenecek mesaj numarasının 50000'den büyük olması yeterlidir. "msgtext" ise hata durumunda verilecek mesajımızdır. Kullanıcı tanımlı mesajları silmek için "sp_dropmessages" sistem saklı prosedürü kullanılır. Gelelim örneğimize;
90001 numaralı hata mesajını sisteme ekledik. Şimdi verilen sipariş numarasına göre Northwind veritabanımızda Order Details tablosu içerisinde arayarak kayıtların listelenip listelenmeyeceğinin belirlendiği bir prosedür oluşturalım.
CREATE PROCEDURE SIPARIS_URUN_LISTE ( @ID INT=NULL ) AS IF @ID IS NULL BEGIN RAISERROR ('SIPARIS NUMARASI GIRMELISINIZ',10,1) RETURN 0 END IF @ID<0 OR @ID>11100 BEGIN RAISERROR (90001,10,1) RETURN 0 END SELECT * FROM [Order Details] WHERE OrderID=@ID
Stored Procedure'müzde "ID" değişkenimizi int tipinde tanımladık ve NULL değerini atadık. Prosedürümüzün çalıştırılmasında değişkenimize herhangi bir değer atanmadıysa hata mesajı RAISERROR fonksiyonuyla bize döndürülecektir.
RAISERROR Kullanımı ile ilgili Detaylı bilgi için tıklayınız.
raiserror da sorgu yapıldıktan mesaj tablosunda hata nasıl verebilirim
YanıtlaSilöncelikle https://support.microsoft.com/en-us/kb/321903 makalesi faydalı olacaktır.
YanıtlaSilyanlış anlamadıysam hata mesajları kullanıcı tanımlı olarak kullanmak ve sysmessages tablosuna eklemek istiyorsunuz. RAISERROR kullanımında hata mesajının sql'e bildirilmesi gereklidir...Örneğin,
sp_addmessage @msgnum='50015', @severity='11', @msgtext='Hasta oda numarası negatif olamaz', @with_log='true'
böylelikle hata mesajımızı sysmessages tablosuna ekliyoruz fakat kullanıcı tarafından eklenen hata mesajlarının 50.000'den büyük olması istenir. Bu yüzden örnekte parametre olarak 50.015 değerini kullandım. severity ise hata mesajının seviyesini ifade eder. örnekte 11 kullandım (11-16 arası seviye kullanıcı kaynaklı hatalar içindir.) hata metninde açıklayıcı ifade ekleyebilirsiniz. with_log parametresiylede hata mesajının windows event log'larında görünüp görünmeyeceğini belirlersiniz.
! hata mesajları master veritabanında tutulmaktadır.
seviyeler ile ilgili kısa bilgi
1-10 - bilgilendirme amaçlıdır/bağlantı kesilmez/print ile aynı işlev
11-16 - kullanıcı kaynaklı hatadır/ hatanın düzeltilip submit etmesini beklemek gerekir/ exception olarak ele alınabilir
17-19 - ölümcül olmayan yazılım veya Donanım hatası/ bağlantı kesilmez
17 - yetersiz Kaynak/ ReadOnly disk, okumaya kilitli tablo, yetersiz erişim
18 - dahili Yazılımın kendisinden kaynaklı hata.
19 - SQL Server kısıtına takıldı
33 - seviye SP çağırmak, 1025.parametre…
20-25 - ölümcül yazılım veya donanım hatası/Administrator ekleyebilir
Bağlantı korunmaz kesilir. kullanıcının yeniden bağlantı sağlaması şartı vardır.
Teşekkürler güzel bilgilendirme.
YanıtlaSil